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)