|
|
@@ -0,0 +1,40 @@ |
|
|
|
def reflect(pos, dirx): |
|
|
|
match '-' if dirx.real else '|', graph.get(pos, ' '): |
|
|
|
case [_, ' ']: return [] |
|
|
|
case [_, '.']: return [0] |
|
|
|
case ['-', '-']: return [0] |
|
|
|
case ['-', 'L']: return [1] |
|
|
|
case ['-', '/']: return [-1] |
|
|
|
case ['-', '|']: return [1, -1] |
|
|
|
case ['|', '|']: return [0] |
|
|
|
case ['|', '/']: return [1] |
|
|
|
case ['|', 'L']: return [-1] |
|
|
|
case ['|', '-']: return [1, -1] |
|
|
|
case other: raise RuntimeError(other) |
|
|
|
|
|
|
|
|
|
|
|
def solve(start): |
|
|
|
seen = set() |
|
|
|
state = {start} |
|
|
|
while state: |
|
|
|
seen |= state |
|
|
|
state = {(pp + dd * 1j ** rr, dd * 1j ** rr) for pp, dd in state for rr in reflect(pp, dd)} - seen |
|
|
|
return len({x for x, y in seen} & set(graph)) |
|
|
|
|
|
|
|
|
|
|
|
text = open(0).read().replace('\\', 'L') |
|
|
|
graph = { |
|
|
|
complex(x, y): val |
|
|
|
for y, row in enumerate(text.splitlines()) |
|
|
|
for x, val in enumerate(row) |
|
|
|
} |
|
|
|
print(solve((0, 1))) |
|
|
|
|
|
|
|
xmin, *_, xmax = sorted(int(p.real) for p in graph) |
|
|
|
ymin, *_, ymax = sorted(int(p.imag) for p in graph) |
|
|
|
starts = [] |
|
|
|
starts += [(complex(x, ymin), 1j) for x in range(xmin, xmax + 1)] |
|
|
|
starts += [(complex(x, ymax),-1j) for x in range(xmin, xmax + 1)] |
|
|
|
starts += [(complex(xmin, y), 1 ) for y in range(ymin, ymax + 1)] |
|
|
|
starts += [(complex(xmax, y),-1 ) for y in range(ymin, ymax + 1)] |
|
|
|
print(max(solve(start) for start in starts)) |