From 041d9e3beccddf86b6a2c820c51597e387c2037d Mon Sep 17 00:00:00 2001 From: Nikhil Vengal Date: Fri, 12 Dec 2025 21:25:07 -0800 Subject: [PATCH] Use python's `cache` decorator --- day7/part2.py | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/day7/part2.py b/day7/part2.py index 21ad567..7223301 100644 --- a/day7/part2.py +++ b/day7/part2.py @@ -1,25 +1,32 @@ from pathlib import Path +from functools import cache FILE = "input.txt" +class Foo: + def __init__(self, grid: list[str]) -> None: + self.grid: list[str] = grid + + def timelines(self) -> int: + start = self.grid[0].index('S') + return self.traverse(start, 1) + + @cache + def traverse(self, position: int, level: int) -> int: + grid = self.grid[level:] + if not len(grid): + return 1 + if grid[0][position] == '^': + return ( + self.traverse(position-1, level + 1) + + self.traverse(position+1, level + 1) + ) + return self.traverse(position, level + 1) + def main(): raw_lines = Path(FILE).read_text().splitlines() - position = raw_lines[0].index('S') - return traverse(position, raw_lines[1:], 0, dict()) + return Foo(raw_lines).timelines() -def traverse(position: int, grid: list[str], level: int, memo: dict[tuple[int, int], int]) -> int: - if (position, level) in memo.keys(): - return memo[(position, level)] - if not len(grid): - return 1 - if grid[0][position] == '^': - memo[(position, level)] = ( - traverse(position-1, grid[1:], level+1, memo) + - traverse(position+1, grid[1:], level+1, memo) - ) - return memo[(position, level)] - memo[(position, level)] = traverse(position, grid[1:], level+1, memo) - return memo[(position, level)] if __name__ == "__main__": print(main())