aoc2022/day18.py

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)