Solve 2025 day 7 pt 1-2

For part 1, BFS is used since there is no need to
visit each splitter more than once to count visited
splitters.

For part 2, the code initially removed the visited
check. This failed miserably, losing momentum aound
Y=54-56.

A recursive function with memoization solves it much
faster.
This commit is contained in:
Anders Englöf Ytterström 2025-12-07 14:57:28 +01:00 committed by Anders Englöf Ytterström
parent 68be80a4d4
commit 8683885438

View file

@ -0,0 +1,50 @@
import functools
from output import grid
def solve(data):
G = grid(data, o="^")
p1 = set()
p2 = 0
H = len(data.split())
W = len(data.split()[0])
S = (0, data.split()[0].index("S"))
Q = [S]
while Q:
y, x = Q.pop(0)
if y == H:
continue
if (y, x) in p1:
continue
if (y, x) in G:
Q.append((y, x - 1))
Q.append((y, x + 1))
p1.add((y, x))
else:
Q.append((y + 1, x))
p1 = len(p1)
@functools.cache
def _timelines(p):
y, x = p
if not 0 <= y < H or not 0 <= x < W:
return 1
if p in G:
return _timelines((y, x - 1)) + _timelines((y, x + 1))
return _timelines((y + 1, x))
p2 = _timelines(S)
return p1, p2
if __name__ == "__main__":
with open("./input/07.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)
assert p1 == 1539
assert p2 == 6479180385864