Use python's cache decorator
This commit is contained in:
@@ -1,25 +1,32 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from functools import cache
|
||||||
|
|
||||||
FILE = "input.txt"
|
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():
|
def main():
|
||||||
raw_lines = Path(FILE).read_text().splitlines()
|
raw_lines = Path(FILE).read_text().splitlines()
|
||||||
position = raw_lines[0].index('S')
|
return Foo(raw_lines).timelines()
|
||||||
return traverse(position, raw_lines[1:], 0, dict())
|
|
||||||
|
|
||||||
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__":
|
if __name__ == "__main__":
|
||||||
print(main())
|
print(main())
|
||||||
|
|||||||
Reference in New Issue
Block a user