diff --git a/internal/2025/DayFour/code.go b/internal/2025/DayFour/code.go index 3f27154..5285dbf 100644 --- a/internal/2025/DayFour/code.go +++ b/internal/2025/DayFour/code.go @@ -11,6 +11,17 @@ type position struct { row, column int } +var directions = []position{ + {-1, -1}, + {-1, 0}, + {-1, 1}, + {0, -1}, + {0, 1}, + {1, -1}, + {1, 0}, + {1, 1}, +} + func init() { registry.Register("2025D4", ParseInput, PartOne, PartTwo) } @@ -32,17 +43,6 @@ func PartOne(data []string) int { } accessibleRolls := 0 - directions := []position{ - {-1, -1}, - {-1, 0}, - {-1, 1}, - {0, -1}, - {0, 1}, - {1, -1}, - {1, 0}, - {1, 1}, - } - for pos := range isRoll { adjacentRolls := 0 for _, direction := range directions { @@ -61,5 +61,44 @@ func PartOne(data []string) int { } func PartTwo(data []string) int { - return 0 + isRoll := make(map[position]bool) + + for row := range data { + for column := 0; column < len(data[row]); column++ { + if data[row][column] == '@' { + isRoll[position{row, column}] = true + } + } + } + + totalRemoved := 0 + + for { + accessibleRolls := make(map[position]bool) + + for pos := range isRoll { + adjacentRolls := 0 + for _, direction := range directions { + neighbor := position{pos.row + direction.row, pos.column + direction.column} + if isRoll[neighbor] { + adjacentRolls++ + } + } + + if adjacentRolls < 4 { + accessibleRolls[pos] = true + } + } + + if len(accessibleRolls) == 0 { + break + } + + for pos := range accessibleRolls { + delete(isRoll, pos) + totalRemoved++ + } + } + + return totalRemoved }