93 lines
1.9 KiB
Go
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, ".")
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|