62 lines
1.6 KiB
Python
62 lines
1.6 KiB
Python
from collections import deque
|
|
from tools.aoc import AOCDay
|
|
from tools.coordinate import Coordinate
|
|
from tools.grid import Grid
|
|
from typing import Any
|
|
|
|
|
|
class Day(AOCDay):
|
|
inputs = [
|
|
[
|
|
(64, "input18_test"),
|
|
(3526, "input18_dennis"),
|
|
(3326, "input18"),
|
|
],
|
|
[
|
|
(58, "input18_test"),
|
|
(2090, "input18_dennis"),
|
|
(1996, "input18"),
|
|
]
|
|
]
|
|
|
|
def get_grid(self) -> Grid:
|
|
grid = Grid()
|
|
for line in self.getInput():
|
|
grid.set(Coordinate(*map(int, line.split(","))))
|
|
|
|
grid.minX, grid.maxX, grid.minY, grid.maxY, grid.minZ, grid.maxZ = \
|
|
grid.minX - 1, grid.maxX + 1, grid.minY - 1, grid.maxY + 1, grid.minZ - 1, grid.maxZ + 1
|
|
return grid
|
|
|
|
def part1(self) -> Any:
|
|
grid = self.get_grid()
|
|
side_count = 0
|
|
for c in grid.getActiveCells():
|
|
side_count += 6 - len(list(grid.getNeighboursOf(c, includeDiagonal=False)))
|
|
|
|
return side_count
|
|
|
|
def part2(self) -> Any:
|
|
grid = self.get_grid()
|
|
side_count = 0
|
|
q = deque()
|
|
q.append(Coordinate(grid.minX, grid.minY, grid.minZ))
|
|
v = set()
|
|
while q:
|
|
c = q.pop()
|
|
if c in v:
|
|
continue
|
|
v.add(c)
|
|
for n in grid.getNeighboursOf(c, includeDiagonal=False, includeDefault=True):
|
|
if grid.get(n):
|
|
side_count += 1
|
|
else:
|
|
q.append(n)
|
|
|
|
return side_count
|
|
|
|
|
|
if __name__ == '__main__':
|
|
day = Day(2022, 18)
|
|
day.run(verbose=True)
|