86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/jpillora/puzzler/harness/aoc"
|
|
)
|
|
|
|
func main() {
|
|
aoc.Harness(run)
|
|
}
|
|
|
|
// on code change, run will be executed 4 times:
|
|
// 1. with: false (part1), and example input
|
|
// 2. with: true (part2), and example input
|
|
// 3. with: false (part1), and user input
|
|
// 4. with: true (part2), and user input
|
|
// the return value of each run is printed to stdout
|
|
func run(part2 bool, input string) any {
|
|
// when you're ready to do part 2, remove this "not implemented" block
|
|
data := make([][]int, 0)
|
|
|
|
for _, line := range strings.Split(input, "\n") {
|
|
dataLine := make([]int, 0)
|
|
for _, s := range strings.Split(line, " ") {
|
|
d, _ := strconv.Atoi(s)
|
|
dataLine = append(dataLine, d)
|
|
}
|
|
data = append(data, dataLine)
|
|
}
|
|
|
|
if part2 {
|
|
sumPrevs := 0
|
|
for _, d := range data {
|
|
_, prev := extrapolate(d)
|
|
sumPrevs += prev
|
|
}
|
|
|
|
return sumPrevs
|
|
}
|
|
// solve part 1 here
|
|
|
|
sumNexts := 0
|
|
for _, d := range data {
|
|
next, _ := extrapolate(d)
|
|
sumNexts += next
|
|
}
|
|
|
|
return sumNexts
|
|
}
|
|
|
|
func extrapolate(data []int) (next int, prev int) {
|
|
diffTriangle := make([][]int, 0)
|
|
diffTriangle = append(diffTriangle, data)
|
|
|
|
for !allZero(diffTriangle[len(diffTriangle)-1]) {
|
|
diffTriangle = append(diffTriangle, getDiffs(diffTriangle[len(diffTriangle)-1]))
|
|
//fmt.Printf("%v\n", diffTriangle[len(diffTriangle)-1])
|
|
}
|
|
|
|
for i := len(diffTriangle) - 2; i >= 0; i -= 1 {
|
|
next += diffTriangle[i][len(diffTriangle[i])-1]
|
|
prev = diffTriangle[i][0] - prev
|
|
}
|
|
|
|
return next, prev
|
|
}
|
|
|
|
func getDiffs(data []int) []int {
|
|
nextData := make([]int, 0)
|
|
for i := 0; i < len(data)-1; i += 1 {
|
|
nextData = append(nextData, data[i+1]-data[i])
|
|
}
|
|
return nextData
|
|
}
|
|
|
|
func allZero(data []int) bool {
|
|
for _, d := range data {
|
|
if d != 0 {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|