Files
adventofcode/2024/gareth/day04/day04.go
Gareth 2c9b7766e3 Day04
2025-01-11 16:39:58 +00:00

92 lines
1.7 KiB
Go

package day04
import (
"strings"
)
var directions = [8][2]int{
{0, 1},
{0, -1},
{1, 0},
{-1, 0},
{1, 1},
{1, -1},
{-1, 1},
{-1, -1},
}
func Part1(input string) int {
grid := parseInput(input)
return countXMAS(grid)
}
func Part2(input string) int {
grid := parseInput(input)
return countXMASPatterns(grid)
}
func parseInput(input string) [][]rune {
lines := strings.Split(strings.TrimSpace(input), "\n")
grid := make([][]rune, len(lines))
for i, line := range lines {
grid[i] = []rune(line)
}
return grid
}
func countXMAS(grid [][]rune) int {
rows := len(grid)
cols := len(grid[0])
target := "XMAS"
total := 0
for r := 0; r < rows; r++ {
for c := 0; c < cols; c++ {
for _, d := range directions {
dr, dc := d[0], d[1]
found := true
for k := 0; k < len(target); k++ {
nr := r + k*dr
nc := c + k*dc
if nr < 0 || nr >= rows || nc < 0 || nc >= cols || grid[nr][nc] != rune(target[k]) {
found = false
break
}
}
if found {
total++
}
}
}
}
return total
}
func countXMASPatterns(grid [][]rune) int {
rows := len(grid)
cols := len(grid[0])
total := 0
for r := 1; r < rows-1; r++ {
for c := 1; c < cols-1; c++ {
topLeft := grid[r-1][c-1]
topRight := grid[r-1][c+1]
center := grid[r][c]
bottomLeft := grid[r+1][c-1]
bottomRight := grid[r+1][c+1]
if center == 'A' && ((topLeft == 'S' && topRight == 'S' && bottomLeft == 'M' && bottomRight == 'M') ||
(topLeft == 'S' && topRight == 'M' && bottomLeft == 'S' && bottomRight == 'M') ||
(topLeft == 'M' && topRight == 'M' && bottomLeft == 'S' && bottomRight == 'S') ||
(topLeft == 'M' && topRight == 'S' && bottomLeft == 'M' && bottomRight == 'S')) {
total++
}
}
}
return total
}