diff --git a/day18.py b/day18.py index e9c47c0..decd62d 100644 --- a/day18.py +++ b/day18.py @@ -5,46 +5,6 @@ from tools.grid import Grid from typing import Any -def get_pocket_region(grid: Grid, start: Coordinate, ignore: set) -> set: - if grid.get(start): - return set() - q = deque() - q.append(start) - p = {start} - border_reached = False - while q: - c = q.pop() - if c in ignore or grid.get(c): - continue - ignore.add(c) - n = list(grid.getNeighboursOf(c, includeDefault=True, includeDiagonal=False)) - if len(n) < 6: - border_reached = True - p = set() - for nc in n: - if grid.get(nc): - continue - q.append(nc) - if not border_reached: - p.add(nc) - - return p - - -def get_pocket_cells(grid: Grid) -> set: - p = set() - v = set() - for x in grid.rangeX(): - for y in grid.rangeY(): - for z in grid.rangeZ(): - c = Coordinate(x, y, z) - if c in v: - continue - p |= get_pocket_region(grid, c, v) - - return p - - class Day(AOCDay): inputs = [ [ @@ -64,6 +24,8 @@ class Day(AOCDay): 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: @@ -77,12 +39,19 @@ class Day(AOCDay): def part2(self) -> Any: grid = self.get_grid() side_count = 0 - p = get_pocket_cells(grid) - for c in grid.getActiveCells(): - side_count += 6 - for n in list(grid.getNeighboursOf(c, includeDiagonal=False, includeDefault=True)): - if grid.get(n) or n in p: - side_count -= 1 + 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