day18 - just count the surface, don't bother with internals

This commit is contained in:
Stefan Harmuth 2022-12-18 14:29:36 +01:00
parent 553705dc49
commit 86b13a8688

View File

@ -5,46 +5,6 @@ from tools.grid import Grid
from typing import Any 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): class Day(AOCDay):
inputs = [ inputs = [
[ [
@ -64,6 +24,8 @@ class Day(AOCDay):
for line in self.getInput(): for line in self.getInput():
grid.set(Coordinate(*map(int, line.split(",")))) 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 return grid
def part1(self) -> Any: def part1(self) -> Any:
@ -77,12 +39,19 @@ class Day(AOCDay):
def part2(self) -> Any: def part2(self) -> Any:
grid = self.get_grid() grid = self.get_grid()
side_count = 0 side_count = 0
p = get_pocket_cells(grid) q = deque()
for c in grid.getActiveCells(): q.append(Coordinate(grid.minX, grid.minY, grid.minZ))
side_count += 6 v = set()
for n in list(grid.getNeighboursOf(c, includeDiagonal=False, includeDefault=True)): while q:
if grid.get(n) or n in p: c = q.pop()
side_count -= 1 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 return side_count