|
|
|
|
|
|
|
|
|
|
|
import sys |
|
|
|
|
|
|
|
|
|
|
|
from intcode import compute |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WALL, MOVE, GOAL = range(3) |
|
|
|
|
|
N, S, W, E = range(1, 5) |
|
|
|
|
|
ORIENTATIONS = {-1j: N, 1j: S, -1: W, 1: E} |
|
|
|
|
|
|
|
|
|
|
|
commands = [] |
|
|
|
|
|
command_iter = iter(commands) |
|
|
|
|
|
text = sys.stdin.read() |
|
|
|
|
|
bot = compute(text, command_iter) |
|
|
|
|
|
|
|
|
|
|
|
# hug the wall until we get back home |
|
|
|
|
|
pos, ori, grid = 0, -1j, {} |
|
|
|
|
|
while 0 not in grid: |
|
|
|
|
|
commands += [ORIENTATIONS[ori]] |
|
|
|
|
|
result = next(bot) |
|
|
|
|
|
if result == WALL: |
|
|
|
|
|
grid[pos + ori] = 1 |
|
|
|
|
|
ori *= -1j |
|
|
|
|
|
else: |
|
|
|
|
|
if result == GOAL: |
|
|
|
|
|
target = pos |
|
|
|
|
|
grid[pos + ori] = 0 |
|
|
|
|
|
pos += ori |
|
|
|
|
|
ori *= 1j |
|
|
|
|
|
|
|
|
|
|
|
# determine viable spaces |
|
|
|
|
|
valid = {p for p, v in grid.items() if v == 0} |
|
|
|
|
|
|
|
|
|
|
|
# from start to end |
|
|
|
|
|
hops = 0 |
|
|
|
|
|
seen = set() |
|
|
|
|
|
edge = {0} |
|
|
|
|
|
while target not in seen: |
|
|
|
|
|
hops += 1 |
|
|
|
|
|
seen |= edge |
|
|
|
|
|
edge = {p + d for p in edge for d in ORIENTATIONS} & valid - seen |
|
|
|
|
|
print(hops) |
|
|
|
|
|
|
|
|
|
|
|
# from end to all |
|
|
|
|
|
hops = 0 |
|
|
|
|
|
seen = set() |
|
|
|
|
|
edge = {target} |
|
|
|
|
|
while seen != valid: |
|
|
|
|
|
hops += 1 |
|
|
|
|
|
seen |= edge |
|
|
|
|
|
edge = {p + d for p in edge for d in ORIENTATIONS} & valid - seen |
|
|
|
|
|
print(hops) |