You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
1.8 KiB
100 lines
1.8 KiB
2 weeks ago
|
package adventoc2024
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"io"
|
||
|
"slices"
|
||
|
"sort"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type Day5 struct{}
|
||
|
|
||
|
func (d Day5) Part1(r io.Reader) string {
|
||
|
s := bufio.NewScanner(r)
|
||
|
before := make(map[int][]int, 100)
|
||
|
var sum int
|
||
|
|
||
|
var updates bool
|
||
|
Scan:
|
||
|
for s.Scan() {
|
||
|
updates = updates || s.Text() == ""
|
||
|
|
||
|
if !updates {
|
||
|
s1, s2, _ := strings.Cut(s.Text(), "|")
|
||
|
i, j := atoi(s1), atoi(s2)
|
||
|
before[j] = append(before[j], i)
|
||
|
} else if s.Text() != "" {
|
||
|
pages := strings.Split(s.Text(), ",")
|
||
|
var v1, v2 int
|
||
|
for i := range pages {
|
||
|
v1 = atoi(pages[i])
|
||
|
|
||
|
for j := range pages[i+1:] {
|
||
|
v2 = atoi(pages[i+j+1])
|
||
|
for _, mustbefore := range before[v1] {
|
||
|
if mustbefore == v2 {
|
||
|
continue Scan
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
sum += atoi(pages[(len(pages)-1)/2])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return printi(sum)
|
||
|
}
|
||
|
|
||
|
func (d Day5) Part2(r io.Reader) string {
|
||
|
s := bufio.NewScanner(r)
|
||
|
before := make(map[int][]int, 100)
|
||
|
var sum int
|
||
|
|
||
|
var updates bool
|
||
|
for s.Scan() {
|
||
|
updates = updates || s.Text() == ""
|
||
|
|
||
|
if !updates {
|
||
|
s1, s2, _ := strings.Cut(s.Text(), "|")
|
||
|
i, j := atoi(s1), atoi(s2)
|
||
|
before[j] = append(before[j], i)
|
||
|
} else if s.Text() != "" {
|
||
|
pages := strings.Split(s.Text(), ",")
|
||
|
pageNums := make([]int, len(pages))
|
||
|
pageCopy := make([]int, len(pages))
|
||
|
|
||
|
for i := range pages {
|
||
|
pageNums[i], pageCopy[i] = atoi(pages[i]), atoi(pages[i])
|
||
|
}
|
||
|
|
||
|
sortPages(pageNums, before)
|
||
|
if !slices.Equal(pageNums, pageCopy) {
|
||
|
sum += middlePage(pageNums)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return printi(sum)
|
||
|
}
|
||
|
|
||
|
func sortPages(update []int, before map[int][]int) {
|
||
|
sort.Slice(update, func(i, j int) bool {
|
||
|
v1 := update[i]
|
||
|
v2 := update[j]
|
||
|
|
||
|
search := before[v1]
|
||
|
for k := range search {
|
||
|
if search[k] == v2 {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func middlePage(pages []int) int {
|
||
|
return pages[(len(pages)-1)/2]
|
||
|
}
|