feat: add day 5 2024
Some checks failed
Go Bump / bump (push) Failing after 44s
Go Test / build (push) Failing after 14m5s

This commit is contained in:
xuu 2024-12-06 13:47:49 -07:00
parent 77a0669f45
commit aa0a2b7b7d
Signed by: xuu
GPG Key ID: 8B3B0604F164E04F
5 changed files with 1540 additions and 0 deletions

28
aoc2024/day05/example.txt Normal file
View File

@ -0,0 +1,28 @@
47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13
75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47

1379
aoc2024/day05/input.txt Normal file

File diff suppressed because it is too large Load Diff

83
aoc2024/day05/main.go Normal file
View File

@ -0,0 +1,83 @@
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
}

View File

@ -0,0 +1,41 @@
package main
import (
"bufio"
"bytes"
"testing"
_ "embed"
"github.com/matryer/is"
)
//go:embed example.txt
var example []byte
//go:embed input.txt
var input []byte
func TestExample(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(example))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 143)
is.Equal(result.valuePT2, 123)
}
func TestSolution(t *testing.T) {
is := is.New(t)
scan := bufio.NewScanner(bytes.NewReader(input))
result, err := run(scan)
is.NoErr(err)
t.Log(result)
is.Equal(result.valuePT1, 7307)
is.Equal(result.valuePT2, 4713)
}

9
set.go
View File

@ -23,6 +23,15 @@ func (m *Set[T]) Has(a T) bool {
return ok
}
func (m *Set[T]) ContainsAll(other ...T) bool {
for _, a := range other {
if !m.Has(a) {
return false
}
}
return true
}
type defaultMap[K comparable, V any] struct {
m map[K]V
d V