day18 - just count the surface, don't bother with internals
This commit is contained in:
parent
553705dc49
commit
86b13a8688
61
day18.py
61
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
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user