51 lines
1 KiB
Python
51 lines
1 KiB
Python
|
|
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
|