Use python's cache decorator

This commit is contained in:
2025-12-12 21:25:07 -08:00
parent 6c76a4a921
commit 041d9e3bec

View File

@@ -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())