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