Skip to content

Commit 4ca11cb

Browse files
committed
chore(aoc-2024): day 3 part 1 and 2
Signed-off-by: Márk Kővári <kovarimarkofficial@gmail.com>
1 parent 0ed071a commit 4ca11cb

5 files changed

Lines changed: 208 additions & 0 deletions

File tree

2024/cmd/03.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"math"
6+
"os"
7+
"regexp"
8+
)
9+
10+
var regexpMul = "mul(d*,d*)"
11+
12+
func read03File(path string) (string, error) {
13+
dat, err := os.ReadFile(path)
14+
if err != nil {
15+
return "", err
16+
}
17+
return string(dat), nil
18+
}
19+
20+
func getMuls(input string) []string {
21+
pattern := regexp.MustCompile(`mul\(\d+,\d+\)`)
22+
return pattern.FindAllString(input, -1)
23+
}
24+
25+
func stripDontParts(input string) string {
26+
re := regexp.MustCompile(`don\'t\(\).*?do\(\)`)
27+
for re.Match([]byte(input)) {
28+
input = re.ReplaceAllString(input, "")
29+
}
30+
return input
31+
}
32+
33+
type Stack struct {
34+
depth int
35+
data []string
36+
}
37+
38+
func (s *Stack) Push(v string) {
39+
if s.depth == 0 {
40+
s.data = append(s.data, v)
41+
}
42+
}
43+
44+
func (s *Stack) Pop() string {
45+
if len(s.data) == 0 {
46+
return ""
47+
}
48+
v := s.data[len(s.data)-1]
49+
s.data = s.data[:len(s.data)-1]
50+
return v
51+
}
52+
53+
func processOps(ops []operation) int {
54+
sum := 0
55+
for _, op := range ops {
56+
r := op.mult()
57+
sum += r
58+
}
59+
return sum
60+
}
61+
62+
type operation struct {
63+
x, y int
64+
}
65+
66+
func (o operation) mult() int {
67+
return o.x * o.y
68+
}
69+
70+
func findEnabledMultOps(s string) []string {
71+
ops := []string{}
72+
73+
rxs := map[string]*regexp.Regexp{
74+
"do": regexp.MustCompile(`do\(\)`),
75+
"dont": regexp.MustCompile(`don't\(\)`),
76+
"mul": regexp.MustCompile(`mul\(\d{1,3},\d{1,3}\)`),
77+
}
78+
79+
mulOn := true
80+
for {
81+
var firstRxName, firstMatch string
82+
minIndex := math.MaxInt
83+
84+
for name, rx := range rxs {
85+
loc := rx.FindStringIndex(s)
86+
if loc != nil && loc[0] < minIndex {
87+
minIndex = loc[0]
88+
firstRxName = name
89+
firstMatch = s[loc[0]:loc[1]]
90+
}
91+
}
92+
93+
if firstRxName == "" {
94+
break
95+
}
96+
97+
switch firstRxName {
98+
case "do":
99+
mulOn = true
100+
case "dont":
101+
mulOn = false
102+
case "mul":
103+
if mulOn {
104+
ops = append(ops, firstMatch)
105+
}
106+
}
107+
108+
s = s[minIndex+len(firstMatch):]
109+
}
110+
111+
return ops
112+
}
113+
114+
func multiply(a, b int) int {
115+
return a * b
116+
}
117+
118+
func sumValues(values []string) int {
119+
sum := 0
120+
for _, val := range values {
121+
var a, b int
122+
_, err := fmt.Sscanf(val, "mul(%d,%d)", &a, &b)
123+
if err != nil {
124+
panic(err)
125+
}
126+
sum += multiply(a, b)
127+
}
128+
return sum
129+
}
130+
131+
func getSum(input []string) int {
132+
sum := 0
133+
for _, mul := range input {
134+
var a, b int
135+
_, err := fmt.Sscanf(mul, "mul(%d,%d)", &a, &b)
136+
if err != nil {
137+
panic(err)
138+
}
139+
sum += multiply(a, b)
140+
}
141+
return sum
142+
}

2024/cmd/03_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func Test03Example(t *testing.T) {
8+
content, err := read03File("../data/03/example")
9+
if err != nil {
10+
t.Fatalf("Error reading file: %v", err)
11+
}
12+
muls := getMuls(content)
13+
14+
sum := getSum(muls)
15+
if sum != 161 {
16+
t.Fatalf("Unexpected sum 161, but got=%d", sum)
17+
}
18+
}
19+
20+
func Test03Input(t *testing.T) {
21+
content, err := read03File("../data/03/input")
22+
if err != nil {
23+
t.Fatalf("Error reading file: %v", err)
24+
}
25+
muls := getMuls(content)
26+
27+
sum := getSum(muls)
28+
if sum != 173785482 {
29+
t.Fatalf("Unexpected sum 173785482, but got=%d", sum)
30+
}
31+
}
32+
33+
func Test03ExampleSecond(t *testing.T) {
34+
content, err := read03File("../data/03/example_2")
35+
if err != nil {
36+
t.Fatalf("Error reading file: %v", err)
37+
}
38+
content = stripDontParts(content)
39+
muls := getMuls(content)
40+
sum := getSum(muls)
41+
if sum != 48 {
42+
t.Fatalf("Unexpected sum 48, but got=%d", sum)
43+
}
44+
}
45+
46+
func Test03InputSecond(t *testing.T) {
47+
content, err := read03File("../data/03/input")
48+
if err != nil {
49+
t.Fatalf("Error reading file: %v", err)
50+
}
51+
values := findEnabledMultOps(content)
52+
53+
sum := sumValues(values)
54+
55+
if sum != 83158140 {
56+
t.Fatalf("Unexpected sum 83158140, but got=%d", sum)
57+
}
58+
}

2024/data/03/example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))

2024/data/03/example_2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))

0 commit comments

Comments
 (0)