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, ".") } } } }