From a10e1a50db8d8a3dd3909f5a4a8035ff6ffbb475 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Mon, 2 Dec 2024 23:27:44 +0100 Subject: Day 2 --- day2/main.go | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 day2/main.go (limited to 'day2/main.go') diff --git a/day2/main.go b/day2/main.go new file mode 100644 index 0000000..a0bfbcc --- /dev/null +++ b/day2/main.go @@ -0,0 +1,95 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +func IntAbs(a int) int { + if a >= 0 { + return a + } + return -a +} + +func main() { + lists := readData("data.txt") + fmt.Println(doTheThing(lists, 0)) + fmt.Println(doTheThing(lists, 1)) +} + +func readData(fileName string) (list [][]int) { + fp, err := os.Open(fileName) + if err != nil { + panic(err) + } + + scanner := bufio.NewScanner(fp) + + list = make([][]int, 0) + + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + sublist := make([]int, 0) + + for _, n := range strings.Split(line, " ") { + value, err := strconv.Atoi(n) + if err != nil { + panic(err) + } + + sublist = append(sublist, value) + } + + list = append(list, sublist) + } + + return +} + +func doTheThing(list [][]int, canSkip int) (valid int) { + for _, l := range list { + if isValid(l, canSkip, -1) { + valid += 1 + } + } + + return +} + +func isValid(l []int, canSkip int, toSkip int) bool { + sumDiff := 0 + sumAbsDiff := 0 + + for i := 0; i < len(l)-1; i++ { + if i == toSkip { + continue + } + + j := i + 1 + if j == toSkip { + j += 1 + if j >= len(l) { + continue + } + } + + diff := l[i] - l[j] + + if diff == 0 || IntAbs(diff) > 3 || IntAbs(sumDiff+diff) != sumAbsDiff+IntAbs(diff) { + if canSkip > 0 { + return isValid(l, canSkip-1, i-1) || isValid(l, canSkip-1, i) || isValid(l, canSkip-1, j) + } else { + return false + } + } + + sumDiff += diff + sumAbsDiff += IntAbs(diff) + } + + return true +} -- cgit