From 96107e4881e533d77ac6841e685317ece92575a1 Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Wed, 14 Dec 2022 10:57:38 +0100 Subject: [PATCH] day14 - p2 even faster --- day14.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/day14.py b/day14.py index 91e9de3..46198bb 100644 --- a/day14.py +++ b/day14.py @@ -45,6 +45,27 @@ class Day(AOCDay): cave.minY = 0 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: cave = self.get_cave() @@ -65,18 +86,18 @@ class Day(AOCDay): return cave.count(TType.SAND) def part2(self) -> Any: - cave = self.get_cave() + rocks, max_y = self.get_cave_rocks_and_height() v = set() q = deque() - q.append(SAND_SOURCE) + q.append((SAND_SOURCE.x, SAND_SOURCE.y)) while q: current = q.pop() - if current in v or current.y > cave.maxY + 1: + if current in v or current[1] > max_y + 1: continue 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)]: - if cave.get(c) == TType.AIR: - q.append(c) + for dx in [-1, 0, 1]: + if (current[0] + dx, current[1] + 1) not in rocks: + q.append((current[0] + dx, current[1] + 1)) return len(v)