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)