Skip to content

Commit de94105

Browse files
committed
[2024] Solution for Day 5
1 parent 1ecd5d2 commit de94105

File tree

3 files changed

+224
-1
lines changed

3 files changed

+224
-1
lines changed

2024/day05/main.go

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
"slices"
8+
"strings"
9+
10+
"github.com/kfarnung/advent-of-code/2024/lib"
11+
)
12+
13+
type constraint struct {
14+
first int64
15+
second int64
16+
}
17+
18+
func part1(input string) int64 {
19+
constraints, err := parseConstraints(input)
20+
if err != nil {
21+
log.Fatal(err)
22+
}
23+
24+
pageLists, err := parsePageList(input)
25+
if err != nil {
26+
log.Fatal(err)
27+
}
28+
29+
sum := int64(0)
30+
for _, pages := range pageLists {
31+
meetsAllConstraints := true
32+
for _, constraint := range constraints {
33+
firstIndex := slices.Index(pages, constraint.first)
34+
secondIndex := slices.Index(pages, constraint.second)
35+
36+
if firstIndex == -1 || secondIndex == -1 {
37+
continue
38+
}
39+
40+
if secondIndex < firstIndex {
41+
meetsAllConstraints = false
42+
break
43+
}
44+
}
45+
46+
if meetsAllConstraints {
47+
sum += pages[len(pages)/2]
48+
}
49+
}
50+
51+
return sum
52+
}
53+
54+
func part2(input string) int64 {
55+
constraints, err := parseConstraints(input)
56+
if err != nil {
57+
log.Fatal(err)
58+
}
59+
60+
pageLists, err := parsePageList(input)
61+
if err != nil {
62+
log.Fatal(err)
63+
}
64+
65+
sum := int64(0)
66+
for _, pages := range pageLists {
67+
meetsAllConstraints := true
68+
didSwap := true
69+
for didSwap {
70+
didSwap = false
71+
for _, constraint := range constraints {
72+
firstIndex := slices.Index(pages, constraint.first)
73+
secondIndex := slices.Index(pages, constraint.second)
74+
75+
if firstIndex == -1 || secondIndex == -1 {
76+
continue
77+
}
78+
79+
if secondIndex < firstIndex {
80+
meetsAllConstraints = false
81+
82+
temp := pages[firstIndex]
83+
pages[firstIndex] = pages[secondIndex]
84+
pages[secondIndex] = temp
85+
86+
didSwap = true
87+
}
88+
}
89+
}
90+
91+
if !meetsAllConstraints {
92+
sum += pages[len(pages)/2]
93+
}
94+
}
95+
96+
return sum
97+
}
98+
99+
func parseConstraints(input string) ([]constraint, error) {
100+
var constraints []constraint
101+
for _, line := range lib.SplitLines(input) {
102+
if line == "" {
103+
break
104+
}
105+
106+
split := strings.Split(line, "|")
107+
first, err := lib.ParseInt[int64](split[0])
108+
if err != nil {
109+
return nil, err
110+
}
111+
112+
second, err := lib.ParseInt[int64](split[1])
113+
if err != nil {
114+
return nil, err
115+
}
116+
117+
constraints = append(constraints, constraint{first, second})
118+
}
119+
120+
return constraints, nil
121+
}
122+
123+
func parsePageList(input string) ([][]int64, error) {
124+
var pages [][]int64
125+
foundBreak := false
126+
for _, line := range lib.SplitLines(input) {
127+
if line == "" {
128+
foundBreak = true
129+
continue
130+
} else if !foundBreak {
131+
continue
132+
}
133+
134+
split := strings.Split(line, ",")
135+
var page []int64
136+
for _, s := range split {
137+
val, err := lib.ParseInt[int64](s)
138+
if err != nil {
139+
return nil, err
140+
}
141+
142+
page = append(page, val)
143+
}
144+
145+
pages = append(pages, page)
146+
}
147+
148+
return pages, nil
149+
}
150+
151+
func main() {
152+
name := os.Args[1]
153+
content, err := lib.LoadFileContent(name)
154+
if err != nil {
155+
log.Fatal(err)
156+
}
157+
158+
fmt.Printf("Part 1: %d\n", part1(content))
159+
fmt.Printf("Part 2: %d\n", part2(content))
160+
}

2024/day05/main_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package main
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/kfarnung/advent-of-code/2024/lib"
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
var input = strings.Join([]string{
12+
"47|53",
13+
"97|13",
14+
"97|61",
15+
"97|47",
16+
"75|29",
17+
"61|13",
18+
"75|53",
19+
"29|13",
20+
"97|29",
21+
"53|29",
22+
"61|53",
23+
"97|53",
24+
"61|29",
25+
"47|13",
26+
"75|47",
27+
"97|75",
28+
"47|61",
29+
"75|61",
30+
"47|29",
31+
"75|13",
32+
"53|13",
33+
"",
34+
"75,47,61,53,29",
35+
"97,61,53,29,13",
36+
"75,29,13",
37+
"75,97,47,61,53",
38+
"61,13,29",
39+
"97,13,75,29,47",
40+
"",
41+
}, "\n")
42+
43+
func TestPart1(t *testing.T) {
44+
assert.Equal(t, int64(143), part1(input))
45+
46+
inputContent, err := lib.GetInputContent()
47+
if err != nil {
48+
t.Fatal(err)
49+
}
50+
51+
assert.Equal(t, int64(6041), part1(inputContent))
52+
}
53+
54+
func TestPart2(t *testing.T) {
55+
assert.Equal(t, int64(123), part2(input))
56+
57+
inputContent, err := lib.GetInputContent()
58+
if err != nil {
59+
t.Fatal(err)
60+
}
61+
62+
assert.Equal(t, int64(4884), part2(inputContent))
63+
}

private

0 commit comments

Comments
 (0)