Skip to content

Commit c4d5136

Browse files
committed
feat(2024): refactor day 4
Refactored Day 4 of 2024 to use the common framework. Successfully migrated solution and integrated it into the runner.
1 parent 91821de commit c4d5136

3 files changed

Lines changed: 234 additions & 0 deletions

File tree

2024/golang/cmd/day04.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/markkovari/advent_of_code/aoc-go-common"
8+
)
9+
10+
type Day04 struct{}
11+
12+
func (d Day04) Part1(input string) string {
13+
grid := parse(input)
14+
count := 0
15+
word := "XMAS"
16+
rows := len(grid)
17+
cols := len(grid[0])
18+
19+
dirs := [][2]int{
20+
{0, 1}, {0, -1}, {1, 0}, {-1, 0},
21+
{1, 1}, {1, -1}, {-1, 1}, {-1, -1},
22+
}
23+
24+
for r := 0; r < rows; r++ {
25+
for c := 0; c < cols; c++ {
26+
for _, dir := range dirs {
27+
if check(grid, r, c, dir, word) {
28+
count++
29+
}
30+
}
31+
}
32+
}
33+
return fmt.Sprintf("%d", count)
34+
}
35+
36+
func (d Day04) Part2(input string) string {
37+
grid := parse(input)
38+
count := 0
39+
rows := len(grid)
40+
cols := len(grid[0])
41+
42+
for r := 1; r < rows-1; r++ {
43+
for c := 1; c < cols-1; c++ {
44+
if grid[r][c] == 'A' {
45+
// M.M
46+
// .A.
47+
// S.S
48+
tl := grid[r-1][c-1]
49+
tr := grid[r-1][c+1]
50+
bl := grid[r+1][c-1]
51+
br := grid[r+1][c+1]
52+
53+
if ((tl == 'M' && br == 'S') || (tl == 'S' && br == 'M')) &&
54+
((tr == 'M' && bl == 'S') || (tr == 'S' && bl == 'M')) {
55+
count++
56+
}
57+
}
58+
}
59+
}
60+
return fmt.Sprintf("%d", count)
61+
}
62+
63+
func parse(input string) [][]rune {
64+
var grid [][]rune
65+
for _, line := range strings.Split(input, "\n") {
66+
if line == "" { continue }
67+
grid = append(grid, []rune(line))
68+
}
69+
return grid
70+
}
71+
72+
func check(grid [][]rune, r, c int, dir [2]int, word string) bool {
73+
for i := 0; i < len(word); i++ {
74+
nr, nc := r+dir[0]*i, c+dir[1]*i
75+
if nr < 0 || nr >= len(grid) || nc < 0 || nc >= len(grid[0]) || grid[nr][nc] != rune(word[i]) {
76+
return false
77+
}
78+
}
79+
return true
80+
}
81+
82+
func main() {
83+
common.Run(2024, 4, Day04{})
84+
}

0 commit comments

Comments
 (0)