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 }