This commit is contained in:
onyx-and-iris 2023-12-09 17:25:53 +00:00
parent af4701dab7
commit 4a7c9082ba
6 changed files with 126 additions and 0 deletions

3
day-9/go.mod Normal file
View File

@ -0,0 +1,3 @@
module github.com/onyx-and-iris/aoc2023/day-9
go 1.20

25
day-9/one.go Normal file
View File

@ -0,0 +1,25 @@
package main
// next returns the next value in the sequence
func next(nums []int) int {
diffs := []int{}
for i := 1; i < len(nums); i++ {
diffs = append(diffs, nums[i]-nums[i-1])
}
if allEqual(diffs) {
return nums[len(nums)-1] + diffs[len(diffs)-1]
}
return nums[len(nums)-1] + next(diffs)
}
// one returns the sum of all next values
func one(lines []string) int {
sum := 0
for _, line := range lines {
nums := convertToInts(line)
sum += next(nums)
}
return sum
}

5
day-9/run.sh Normal file
View File

@ -0,0 +1,5 @@
#!/usr/bin/env bash
INPUT="input.txt"
cat $INPUT | go run .

21
day-9/solution.go Normal file
View File

@ -0,0 +1,21 @@
package main
import (
"fmt"
log "github.com/sirupsen/logrus"
)
func init() {
log.SetLevel(log.InfoLevel)
}
func main() {
lines := readlines()
ans := one(lines)
fmt.Printf("solution one: %d\n", ans)
ans = two(lines)
fmt.Printf("solution two: %d\n", ans)
}

25
day-9/two.go Normal file
View File

@ -0,0 +1,25 @@
package main
// previous returns the previous value in the sequence
func previous(nums []int) int {
diffs := []int{}
for i := 1; i < len(nums); i++ {
diffs = append(diffs, nums[i]-nums[i-1])
}
if allEqual(diffs) {
return nums[0] - diffs[0]
}
return nums[0] - previous(diffs)
}
// two returns the sum of all previous values
func two(lines []string) int {
sum := 0
for _, line := range lines {
nums := convertToInts(line)
sum += previous(nums)
}
return sum
}

47
day-9/util.go Normal file
View File

@ -0,0 +1,47 @@
package main
import (
"bufio"
"log"
"os"
"strconv"
"strings"
)
// readlines reads lines from stdin.
// returns input as an array of strings
func readlines() []string {
lines := []string{}
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
return lines
}
// convertToInts converts a string representing ints to an array of ints
func convertToInts(line string) []int {
numStr := strings.Split(line, " ")
nums := make([]int, 0)
for _, elem := range numStr {
n, _ := strconv.Atoi(elem)
nums = append(nums, n)
}
return nums
}
// allEqual returns true if all values in array are equal
func allEqual(a []int) bool {
for i := 1; i < len(a); i++ {
if a[i] != a[0] {
return false
}
}
return true
}