Files
adventofcode/2025/go/day04/day04.go
2025-12-04 11:53:17 +00:00

93 lines
1.9 KiB
Go

package day04
import (
"adventofcode2025/utils/grid2d"
"adventofcode2025/utils/inputs"
)
func Part1(input string) int {
adj := 0
rolls := 0
grid := inputs.ToGrid2D(input, "\n", "", "", func(c string) string { return c })
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {-1, 1}, {1, 1}, {-1, -1}, {1, -1}}
for j := 0; j < grid.SizeY(); j++ {
for i := 0; i < grid.SizeX(); i++ {
if !checkChar(i, j, grid, "@") {
continue
}
for _, dir := range directions {
x := i + dir[0]
y := j + dir[1]
if checkChar(x, y, grid, "@") {
adj++
}
}
if adj < 4 {
rolls++
}
adj = 0
}
}
return rolls
}
func Part2(input string) int {
grid := inputs.ToGrid2D(input, "\n", "", "", func(c string) string { return c })
rolls := countRolls(grid)
total := rolls
for rolls > 0 {
removeRolls(grid) // modifies grid
rolls = countRolls(grid) // compute only once per loop
total += rolls
}
return total
}
func checkChar(x int, y int, grid *grid2d.Grid[string], c string) bool {
if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
return false
}
if grid.Get(x, y) == c {
return true
}
return false
}
func countRolls(grid *grid2d.Grid[string]) int {
adj := 0
rolls := 0
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {-1, 1}, {1, 1}, {-1, -1}, {1, -1}}
for j := 0; j < grid.SizeY(); j++ {
for i := 0; i < grid.SizeX(); i++ {
if checkChar(i, j, grid, ".") {
continue
}
for _, dir := range directions {
x := i + dir[0]
y := j + dir[1]
if checkChar(x, y, grid, "@") || checkChar(x, y, grid, "x") {
adj++
}
}
if adj < 4 {
grid.Set(i, j, "x")
rolls++
}
adj = 0
}
}
return rolls
}
func removeRolls(grid *grid2d.Grid[string]) {
for j := 0; j < grid.SizeY(); j++ {
for i := 0; i < grid.SizeX(); i++ {
if checkChar(i, j, grid, "x") {
grid.Set(i, j, ".")
}
}
}
}