84 lines
1.3 KiB
Go
84 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
_ "embed"
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
|
|
aoc "go.sour.is/advent-of-code"
|
|
)
|
|
|
|
// var log = aoc.Log
|
|
|
|
func main() { aoc.MustResult(aoc.Runner(run)) }
|
|
|
|
type result struct {
|
|
valuePT1 int
|
|
valuePT2 int
|
|
}
|
|
|
|
func (r result) String() string { return fmt.Sprintf("%#v", r) }
|
|
|
|
func run(scan *bufio.Scanner) (*result, error) {
|
|
|
|
ordering := make(map[int]aoc.Set[int])
|
|
var updates [][]int
|
|
|
|
for scan.Scan() {
|
|
txt := scan.Text()
|
|
|
|
if txt == "" {
|
|
break
|
|
}
|
|
|
|
var key, val int
|
|
_, err := fmt.Sscanf(txt, "%d|%d", &val, &key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if _, ok := ordering[key]; !ok {
|
|
ordering[key] = aoc.NewSet[int]()
|
|
}
|
|
s := ordering[key]
|
|
s.Add(val)
|
|
}
|
|
|
|
var sum int
|
|
var sum2 int
|
|
|
|
outer:
|
|
for scan.Scan() {
|
|
txt := scan.Text()
|
|
|
|
arr := aoc.SliceMap(aoc.Atoi, strings.Split(txt, ",")...)
|
|
|
|
for i, v := range arr {
|
|
m, ok := ordering[v]
|
|
if (i > 0 && !ok) || !m.ContainsAll(arr[:i]...) {
|
|
sort.SliceStable(arr, func(i, j int) bool {
|
|
if a, ok := ordering[arr[i]]; ok && a.Has(arr[j]) {
|
|
return true
|
|
}
|
|
|
|
if b, ok := ordering[arr[j]]; ok && b.Has(arr[i]) {
|
|
return false
|
|
}
|
|
|
|
return false
|
|
})
|
|
|
|
sum2 += arr[len(arr)/2]
|
|
|
|
continue outer
|
|
}
|
|
}
|
|
|
|
sum += arr[len(arr)/2]
|
|
updates = append(updates, arr)
|
|
}
|
|
|
|
return &result{sum, sum2}, nil
|
|
}
|