chore: add day 14
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user