Skip to content

Commit 1dced51

Browse files
committed
[2024] Solution for Day 3
1 parent 9f6d20b commit 1dced51

File tree

5 files changed

+119
-1
lines changed

5 files changed

+119
-1
lines changed

2024/day01/main_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ var input = strings.Join([]string{
1515
"1 3",
1616
"3 9",
1717
"3 3",
18+
"",
1819
}, "\n")
1920

2021
func TestPart1(t *testing.T) {

2024/day02/main_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ var input = strings.Join([]string{
1515
"1 3 2 4 5",
1616
"8 6 4 4 1",
1717
"1 3 6 7 9",
18+
"",
1819
}, "\n")
1920

2021
func TestPart1(t *testing.T) {

2024/day03/main.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
"regexp"
8+
9+
"github.com/kfarnung/advent-of-code/2024/lib"
10+
)
11+
12+
var mulRegex = regexp.MustCompile(`mul\((\d+),(\d+)\)|do\(\)|don't\(\)`)
13+
14+
func part1(input string) int64 {
15+
matches := mulRegex.FindAllStringSubmatch(input, -1)
16+
17+
sum := int64(0)
18+
for _, match := range matches {
19+
if match[0] == "do()" || match[0] == "don't()" {
20+
continue
21+
}
22+
23+
first, err := lib.ParseInt[int64](match[1])
24+
if err != nil {
25+
log.Fatal(err)
26+
}
27+
28+
second, err := lib.ParseInt[int64](match[2])
29+
if err != nil {
30+
log.Fatal(err)
31+
}
32+
33+
sum += first * second
34+
}
35+
36+
return sum
37+
}
38+
39+
func part2(input string) int64 {
40+
matches := mulRegex.FindAllStringSubmatch(input, -1)
41+
42+
enabled := true
43+
sum := int64(0)
44+
for _, match := range matches {
45+
if match[0] == "do()" {
46+
enabled = true
47+
} else if match[0] == "don't()" {
48+
enabled = false
49+
} else if enabled {
50+
51+
first, err := lib.ParseInt[int64](match[1])
52+
if err != nil {
53+
log.Fatal(err)
54+
}
55+
56+
second, err := lib.ParseInt[int64](match[2])
57+
if err != nil {
58+
log.Fatal(err)
59+
}
60+
61+
sum += first * second
62+
}
63+
}
64+
65+
return sum
66+
}
67+
68+
func main() {
69+
name := os.Args[1]
70+
content, err := lib.LoadFileContent(name)
71+
if err != nil {
72+
log.Fatal(err)
73+
}
74+
75+
fmt.Printf("Part 1: %d\n", part1(content))
76+
fmt.Printf("Part 2: %d\n", part2(content))
77+
}

2024/day03/main_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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+
func TestPart1(t *testing.T) {
12+
input := strings.Join([]string{
13+
"xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))",
14+
"",
15+
}, "\n")
16+
assert.Equal(t, int64(161), part1(input))
17+
18+
inputContent, err := lib.GetInputContent()
19+
if err != nil {
20+
t.Fatal(err)
21+
}
22+
23+
assert.Equal(t, int64(187833789), part1(inputContent))
24+
}
25+
26+
func TestPart2(t *testing.T) {
27+
input := strings.Join([]string{
28+
"xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))",
29+
"",
30+
}, "\n")
31+
assert.Equal(t, int64(48), part2(input))
32+
33+
inputContent, err := lib.GetInputContent()
34+
if err != nil {
35+
t.Fatal(err)
36+
}
37+
38+
assert.Equal(t, int64(94455185), part2(inputContent))
39+
}

private

0 commit comments

Comments
 (0)