finish 2023
This commit is contained in:
68
2023/go/day16/day16.py
Normal file
68
2023/go/day16/day16.py
Normal file
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/python3
|
||||
import sys
|
||||
import re
|
||||
from copy import deepcopy
|
||||
from math import gcd
|
||||
from collections import defaultdict, Counter, deque
|
||||
D = open(sys.argv[1]).read().strip()
|
||||
L = D.split('\n')
|
||||
G = [[c for c in row] for row in L]
|
||||
|
||||
R = len(G)
|
||||
C = len(G[0])
|
||||
|
||||
DR = [-1, 0, 1, 0]
|
||||
DC = [ 0, 1, 0,-1]
|
||||
|
||||
def step(r,c,d):
|
||||
return (r+DR[d], c+DC[d], d)
|
||||
|
||||
def score(sr,sc,sd):
|
||||
POS = [(sr,sc,sd)]
|
||||
SEEN = set()
|
||||
SEEN2 = set()
|
||||
while True:
|
||||
NP = []
|
||||
if not POS:
|
||||
break
|
||||
for (r,c,d) in POS:
|
||||
#print(r,c,d)
|
||||
if 0<=r<R and 0<=c<C:
|
||||
SEEN.add((r,c))
|
||||
if (r,c,d) in SEEN2:
|
||||
continue
|
||||
SEEN2.add((r,c,d))
|
||||
ch = G[r][c]
|
||||
if ch=='.':
|
||||
NP.append(step(r,c,d))
|
||||
elif ch=='/':
|
||||
# up right down left
|
||||
NP.append(step(r,c,{0:1, 1:0, 2:3, 3:2}[d]))
|
||||
elif ch=='\\':
|
||||
NP.append(step(r,c,{0:3, 1:2, 2:1, 3:0}[d]))
|
||||
elif ch=='|':
|
||||
if d in [0,2]:
|
||||
NP.append(step(r,c,d))
|
||||
else:
|
||||
NP.append(step(r, c, 0))
|
||||
NP.append(step(r, c, 2))
|
||||
elif ch=='-':
|
||||
if d in [1,3]:
|
||||
NP.append(step(r,c,d))
|
||||
else:
|
||||
NP.append(step(r, c, 1))
|
||||
NP.append(step(r, c, 3))
|
||||
else:
|
||||
assert False
|
||||
POS = NP
|
||||
return len(SEEN)
|
||||
|
||||
print(score(0,0,1))
|
||||
ans = 0
|
||||
for r in range(R):
|
||||
ans = max(ans, score(r,0,1))
|
||||
ans = max(ans, score(r,C-1,3))
|
||||
for c in range(C):
|
||||
ans = max(ans, score(0,c,2))
|
||||
ans = max(ans, score(R-1,c,0))
|
||||
print(ans)
|
||||
Reference in New Issue
Block a user