chore: add day 14
All checks were successful
Go Bump / bump (push) Successful in 12s
Go Test / build (push) Successful in 36s

This commit is contained in:
xuu
2023-12-15 15:09:59 -07:00
parent 77a54c5563
commit a0d852416f
4 changed files with 88 additions and 63 deletions

View File

@@ -7,6 +7,7 @@ import (
"strings"
aoc "go.sour.is/advent-of-code-2023"
"golang.org/x/exp/maps"
)
// var log = aoc.Log
@@ -21,75 +22,57 @@ type result struct {
func (r result) String() string { return fmt.Sprintf("%#v", r) }
func run(scan *bufio.Scanner) (*result, error) {
var maps []Map
var maplist []Map
var m Map
for scan.Scan() {
text := scan.Text()
if len(text) == 0 {
maps = append(maps, m)
maplist = append(maplist, m)
m = Map{}
}
m = append(m, []rune(text))
}
maps = append(maps, m)
maplist = append(maplist, m)
score1 := 0
for _, m := range maps {
for _, m := range maplist {
m = aoc.Transpose(reverse(m))
m.Sort()
score1 += m.Score()
}
score2 := 0
// type record [5]int
// var last, current record
// memo := make(map[record]int)
type record [5]int
var current record
memo := make(map[record]int)
// for _, m := range maps {
// fmt.Println(m)
for _, m := range maplist {
// fmt.Println(m)
// m = aoc.Transpose(reverse(m))
m = aoc.Transpose(reverse(m))
// for i := 0; i < 1_000_000_000; i++ {
// m.Sort()
// current[0] = m.Score()
for i := 0; i < 1_000_000_000; i++ {
m, current = cycle(m)
// m = aoc.Transpose(reverse(m))
// m.Sort()
// current[1] = m.Score()
v, ok := memo[current]
if ok && v > 1 {
counts := aoc.Reduce(
func(i int, v int, counts [3]int) [3]int {
counts[v]++
return counts
}, [3]int{}, maps.Values(memo)...)
// m = aoc.Transpose(reverse(m))
// m.Sort()
// current[2] = m.Score()
// m = aoc.Transpose(reverse(m))
// m.Sort()
// current[3] = m.Score()
// m = aoc.Transpose(reverse(m))
// current[4] = m.Score()
// if slices.Equal(last[:], current[:]) {
// break
// }
// v, ok := memo[current]
// if (i - 104) % 13 == 12 {
// fmt.Println(i, current, ok, v)
// }
// // if ok && v > 2 {
// // break
// // }
// memo[current] += 1
// last = current
// }
// score2 += m.Score()
// }
// fmt.Println(i, counts)
i = 1_000_000_000 - (1_000_000_000-counts[0]-counts[1])%counts[2]
clear(memo)
}
memo[current] += 1
// fmt.Println(i, current, v)
}
score2 += m.Score()
}
return &result{valuePT1: score1, valuePT2: score2}, nil
}
@@ -149,3 +132,27 @@ func reverse(m Map) Map {
}
return m
}
func cycle(m Map) (Map, [5]int) {
var current [5]int
m.Sort()
current[0] = m.Score()
m = aoc.Transpose(reverse(m))
m.Sort()
current[1] = m.Score()
m = aoc.Transpose(reverse(m))
m.Sort()
current[2] = m.Score()
m = aoc.Transpose(reverse(m))
m.Sort()
current[3] = m.Score()
m = aoc.Transpose(reverse(m))
current[4] = m.Score()
return m, current
}