Skip to content

Commit 1ecd5d2

Browse files
committed
[2024] Solution for Day 4
1 parent 1dced51 commit 1ecd5d2

File tree

3 files changed

+174
-1
lines changed

3 files changed

+174
-1
lines changed

2024/day04/main.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
8+
"github.com/kfarnung/advent-of-code/2024/lib"
9+
)
10+
11+
var xmasString []rune = []rune("XMAS")
12+
13+
func part1(input string) int64 {
14+
parsedInput := parseInput(input)
15+
count := int64(0)
16+
for x, line := range parsedInput {
17+
for y, char := range line {
18+
if char != 'X' {
19+
continue
20+
}
21+
22+
if findXmas(parsedInput, x, y, 1, 0) {
23+
count++
24+
}
25+
26+
if findXmas(parsedInput, x, y, 0, 1) {
27+
count++
28+
}
29+
30+
if findXmas(parsedInput, x, y, 1, 1) {
31+
count++
32+
}
33+
34+
if findXmas(parsedInput, x, y, 1, -1) {
35+
count++
36+
}
37+
38+
if findXmas(parsedInput, x, y, -1, 0) {
39+
count++
40+
}
41+
42+
if findXmas(parsedInput, x, y, 0, -1) {
43+
count++
44+
}
45+
46+
if findXmas(parsedInput, x, y, -1, -1) {
47+
count++
48+
}
49+
50+
if findXmas(parsedInput, x, y, -1, 1) {
51+
count++
52+
}
53+
}
54+
}
55+
56+
return count
57+
}
58+
59+
func part2(input string) int64 {
60+
parsedInput := parseInput(input)
61+
count := int64(0)
62+
for x, line := range parsedInput {
63+
for y, char := range line {
64+
if char != 'A' {
65+
continue
66+
}
67+
68+
if x == 0 || y == 0 || x == len(parsedInput)-1 || y == len(parsedInput[x])-1 {
69+
continue
70+
}
71+
72+
if parsedInput[x-1][y-1] == 'M' && parsedInput[x+1][y+1] == 'S' && parsedInput[x-1][y+1] == 'M' && parsedInput[x+1][y-1] == 'S' {
73+
count++
74+
}
75+
76+
if parsedInput[x-1][y-1] == 'M' && parsedInput[x+1][y+1] == 'S' && parsedInput[x-1][y+1] == 'S' && parsedInput[x+1][y-1] == 'M' {
77+
count++
78+
}
79+
80+
if parsedInput[x-1][y-1] == 'S' && parsedInput[x+1][y+1] == 'M' && parsedInput[x-1][y+1] == 'S' && parsedInput[x+1][y-1] == 'M' {
81+
count++
82+
}
83+
84+
if parsedInput[x-1][y-1] == 'S' && parsedInput[x+1][y+1] == 'M' && parsedInput[x-1][y+1] == 'M' && parsedInput[x+1][y-1] == 'S' {
85+
count++
86+
}
87+
}
88+
}
89+
90+
return count
91+
}
92+
93+
func findXmas(parsedInput [][]rune, x, y int, dx, dy int) bool {
94+
for i := 0; i < len(xmasString); i++ {
95+
if x < 0 || x >= len(parsedInput) || y < 0 || y >= len(parsedInput[x]) || parsedInput[x][y] != xmasString[i] {
96+
return false
97+
}
98+
99+
x += dx
100+
y += dy
101+
}
102+
103+
return true
104+
}
105+
106+
func parseInput(input string) [][]rune {
107+
var result [][]rune
108+
for _, line := range lib.SplitLines(input) {
109+
if len(line) == 0 {
110+
continue
111+
}
112+
113+
result = append(result, []rune(line))
114+
}
115+
116+
return result
117+
}
118+
119+
func main() {
120+
name := os.Args[1]
121+
content, err := lib.LoadFileContent(name)
122+
if err != nil {
123+
log.Fatal(err)
124+
}
125+
126+
fmt.Printf("Part 1: %d\n", part1(content))
127+
fmt.Printf("Part 2: %d\n", part2(content))
128+
}

2024/day04/main_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
"MMMSXXMASM",
13+
"MSAMXMSMSA",
14+
"AMXSXMAAMM",
15+
"MSAMASMSMX",
16+
"XMASAMXAMM",
17+
"XXAMMXXAMA",
18+
"SMSMSASXSS",
19+
"SAXAMASAAA",
20+
"MAMMMXMMMM",
21+
"MXMXAXMASX",
22+
"",
23+
}, "\n")
24+
25+
func TestPart1(t *testing.T) {
26+
assert.Equal(t, int64(18), part1(input))
27+
28+
inputContent, err := lib.GetInputContent()
29+
if err != nil {
30+
t.Fatal(err)
31+
}
32+
33+
assert.Equal(t, int64(2583), part1(inputContent))
34+
}
35+
36+
func TestPart2(t *testing.T) {
37+
assert.Equal(t, int64(9), part2(input))
38+
39+
inputContent, err := lib.GetInputContent()
40+
if err != nil {
41+
t.Fatal(err)
42+
}
43+
44+
assert.Equal(t, int64(1978), part2(inputContent))
45+
}

private

0 commit comments

Comments
 (0)