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
|
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
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user