def find_keycode(intcode: List[int]) -> int: intcomp = Intcomp(intcode, [1]) intcomp.run() return intcomp.next_output()
def find_oxygen(data: List[int]): def move_robot(goal): if distance(robot.position, attempt) > 1: path = find_path(robot.position, goal, grid) for pos in reversed(path): comp.add_input(direction(robot.position, pos)) out = comp.next_output() if out != 1: print('invalid path?') exit() robot.position = pos # final step comp.add_input(direction(robot.position, goal)) comp = Intcomp(data) grid = np.zeros([50, 50]) # 0 unknown, 1 traversable, 2 walls, 3 oxygen start = 25 + 25j robot = Robot(start) grid[robot.y, robot.x] = 1 # start position is traversable to_visit = neighbors(robot.position) len_to_oxygen = 0 to_oxygenate = [] # for part 2 while to_visit: attempt = to_visit.pop( ) # get latest coord added (to minimize travel distance?) move_robot(attempt) output = comp.next_output() if output == 2: # oxygen found robot.position = attempt grid[robot.y, robot.x] = 3 len_to_oxygen = len(find_path(start, robot.position, grid)) + 1 to_oxygenate.append(robot.position) elif output == 1: robot.position = attempt grid[robot.y, robot.x] = 1 for neighbor in neighbors(robot.position): if not grid[int(neighbor.imag), int(neighbor.real)]: # if unknown to_visit.append(neighbor) elif output == 0: grid[int(attempt.imag), int(attempt.real)] = 2 else: print('unknown output from intcomputer:', output) exit() minutes = -1 # -1 as the first minute is for the spread in location of oxygen system while to_oxygenate: spread = [] for pos in to_oxygenate: grid[int(pos.imag), int(pos.real)] = 3 for neighbor in neighbors(pos): if grid[int(neighbor.imag), int(neighbor.real)] == 1: spread.append(neighbor) minutes += 1 to_oxygenate = spread #plt.imshow(grid) #plt.show() return len_to_oxygen, minutes
def get_coordinates(intcode: List[int]) -> int: intcomp = Intcomp(intcode, [2]) intcomp.run() return intcomp.next_output()