From 553705dc499ca45761e40af46aaaf1d9c0ae5b6b Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Sun, 18 Dec 2022 13:00:25 +0100 Subject: [PATCH] day17 - small optimizations --- day17.py | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/day17.py b/day17.py index fbd5604..059a103 100644 --- a/day17.py +++ b/day17.py @@ -36,17 +36,11 @@ def collide_hor(chamber: list, rock_shape:list, rock_x: int, rock_y: int) -> boo def settles(chamber: list, rock_shape: list, rock_x: int, rock_y: int) -> bool: for i, c in enumerate(rock_shape[-1]): - if c == ' ': - continue - if rock_y >= -1 and chamber[rock_y + 1][i + rock_x] == '#': + if c != ' ' and rock_y >= -1 and chamber[rock_y + 1][i + rock_x] == '#': return True - if rock_shape[-1] == ' # ': - for i, c in enumerate(rock_shape[-2]): - if c == ' ': - continue - if rock_y > -1 and chamber[rock_y][i + rock_x] == '#': - return True + if rock_shape[-1] == ' # ' and rock_y >= 0 and (chamber[rock_y][rock_x] == '#' or chamber[rock_y][rock_x + 2] == '#'): + return True return False @@ -109,12 +103,10 @@ class Day(AOCDay): return len(chamber) - 1 def part2(self) -> Any: + drop_count = 1_000_000_000_000 chamber = Chamber(['#######']) jet = self.get_jet_pattern() - jet_index = drop_rock(chamber, ROCK_SHAPES[0], jet, 0) - rock_index = 1 - cycle = 1 - cycle_cache = {} + jet_index, rock_index, cycle, cycle_cache = 0, 0, 0, {} while (jet_index, rock_index, chamber.hash()) not in cycle_cache: cycle_cache[(jet_index, rock_index, chamber.hash())] = (cycle, len(chamber) - 1) jet_index = drop_rock(chamber, ROCK_SHAPES[rock_index], jet, jet_index) @@ -128,13 +120,12 @@ class Day(AOCDay): chamber = Chamber(['#######']) jet_index = 0 rock_index = 0 - bottom_part = 1_000_000_000_000 % cycle_len - for _ in range(cycle_len + bottom_part): + for _ in range(cycle_len + drop_count % cycle_len): jet_index = drop_rock(chamber, ROCK_SHAPES[rock_index % 5], jet, jet_index) rock_index += 1 cur_len = len(chamber) - 1 - cycle_height - return (1_000_000_000_000 // cycle_len * cycle_height) + cur_len + return (drop_count // cycle_len * cycle_height) + cur_len if __name__ == '__main__':