summaryrefslogtreecommitdiff
path: root/day2/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'day2/main.go')
-rw-r--r--day2/main.go95
1 files changed, 95 insertions, 0 deletions
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
+}