Day04
This commit is contained in:
91
2024/gareth/day04/day04.go
Normal file
91
2024/gareth/day04/day04.go
Normal file
@@ -0,0 +1,91 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user