day17 - small optimizations

This commit is contained in:
Stefan Harmuth 2022-12-18 13:00:25 +01:00
parent 71c4075d48
commit 553705dc49

View File

@ -36,16 +36,10 @@ 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: def settles(chamber: list, rock_shape: list, rock_x: int, rock_y: int) -> bool:
for i, c in enumerate(rock_shape[-1]): for i, c in enumerate(rock_shape[-1]):
if c == ' ': if c != ' ' and rock_y >= -1 and chamber[rock_y + 1][i + rock_x] == '#':
continue
if rock_y >= -1 and chamber[rock_y + 1][i + rock_x] == '#':
return True return True
if rock_shape[-1] == ' # ': if rock_shape[-1] == ' # ' and rock_y >= 0 and (chamber[rock_y][rock_x] == '#' or chamber[rock_y][rock_x + 2] == '#'):
for i, c in enumerate(rock_shape[-2]):
if c == ' ':
continue
if rock_y > -1 and chamber[rock_y][i + rock_x] == '#':
return True return True
return False return False
@ -109,12 +103,10 @@ class Day(AOCDay):
return len(chamber) - 1 return len(chamber) - 1
def part2(self) -> Any: def part2(self) -> Any:
drop_count = 1_000_000_000_000
chamber = Chamber(['#######']) chamber = Chamber(['#######'])
jet = self.get_jet_pattern() jet = self.get_jet_pattern()
jet_index = drop_rock(chamber, ROCK_SHAPES[0], jet, 0) jet_index, rock_index, cycle, cycle_cache = 0, 0, 0, {}
rock_index = 1
cycle = 1
cycle_cache = {}
while (jet_index, rock_index, chamber.hash()) not in cycle_cache: while (jet_index, rock_index, chamber.hash()) not in cycle_cache:
cycle_cache[(jet_index, rock_index, chamber.hash())] = (cycle, len(chamber) - 1) cycle_cache[(jet_index, rock_index, chamber.hash())] = (cycle, len(chamber) - 1)
jet_index = drop_rock(chamber, ROCK_SHAPES[rock_index], jet, jet_index) jet_index = drop_rock(chamber, ROCK_SHAPES[rock_index], jet, jet_index)
@ -128,13 +120,12 @@ class Day(AOCDay):
chamber = Chamber(['#######']) chamber = Chamber(['#######'])
jet_index = 0 jet_index = 0
rock_index = 0 rock_index = 0
bottom_part = 1_000_000_000_000 % cycle_len for _ in range(cycle_len + drop_count % cycle_len):
for _ in range(cycle_len + bottom_part):
jet_index = drop_rock(chamber, ROCK_SHAPES[rock_index % 5], jet, jet_index) jet_index = drop_rock(chamber, ROCK_SHAPES[rock_index % 5], jet, jet_index)
rock_index += 1 rock_index += 1
cur_len = len(chamber) - 1 - cycle_height 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__': if __name__ == '__main__':