day14 - p2 even faster
This commit is contained in:
parent
d5a59a80f5
commit
96107e4881
33
day14.py
33
day14.py
@ -45,6 +45,27 @@ class Day(AOCDay):
|
|||||||
cave.minY = 0
|
cave.minY = 0
|
||||||
return cave
|
return cave
|
||||||
|
|
||||||
|
def get_cave_rocks_and_height(self) -> (set, int):
|
||||||
|
rocks = set()
|
||||||
|
max_y = 0
|
||||||
|
for line in self.getInput():
|
||||||
|
corners = [tuple(map(int, c.split(","))) for c in line.split(" -> ")]
|
||||||
|
for i in range(len(corners)):
|
||||||
|
if corners[i][1] > max_y:
|
||||||
|
max_y = corners[i][1]
|
||||||
|
if i == 0:
|
||||||
|
continue
|
||||||
|
from_x = corners[i][0] if corners[i][0] < corners[i-1][0] else corners[i-1][0]
|
||||||
|
to_x = (corners[i][0] if corners[i][0] > corners[i-1][0] else corners[i-1][0]) + 1
|
||||||
|
from_y = corners[i][1] if corners[i][1] < corners[i-1][1] else corners[i-1][1]
|
||||||
|
to_y = (corners[i][1] if corners[i][1] > corners[i-1][1] else corners[i-1][1]) + 1
|
||||||
|
for x in range(from_x, to_x):
|
||||||
|
for y in range(from_y, to_y):
|
||||||
|
rocks.add((x, y))
|
||||||
|
|
||||||
|
return rocks, max_y
|
||||||
|
|
||||||
|
|
||||||
def part1(self) -> Any:
|
def part1(self) -> Any:
|
||||||
cave = self.get_cave()
|
cave = self.get_cave()
|
||||||
|
|
||||||
@ -65,18 +86,18 @@ class Day(AOCDay):
|
|||||||
return cave.count(TType.SAND)
|
return cave.count(TType.SAND)
|
||||||
|
|
||||||
def part2(self) -> Any:
|
def part2(self) -> Any:
|
||||||
cave = self.get_cave()
|
rocks, max_y = self.get_cave_rocks_and_height()
|
||||||
v = set()
|
v = set()
|
||||||
q = deque()
|
q = deque()
|
||||||
q.append(SAND_SOURCE)
|
q.append((SAND_SOURCE.x, SAND_SOURCE.y))
|
||||||
while q:
|
while q:
|
||||||
current = q.pop()
|
current = q.pop()
|
||||||
if current in v or current.y > cave.maxY + 1:
|
if current in v or current[1] > max_y + 1:
|
||||||
continue
|
continue
|
||||||
v.add(current)
|
v.add(current)
|
||||||
for c in [Coordinate(current.x, current.y + 1), Coordinate(current.x - 1, current.y + 1), Coordinate(current.x + 1, current.y + 1)]:
|
for dx in [-1, 0, 1]:
|
||||||
if cave.get(c) == TType.AIR:
|
if (current[0] + dx, current[1] + 1) not in rocks:
|
||||||
q.append(c)
|
q.append((current[0] + dx, current[1] + 1))
|
||||||
|
|
||||||
return len(v)
|
return len(v)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user