def manual_game(puzzle_input): computer = Intcode(puzzle_input) while not computer.finished: computer.run_program() computer.print_output() print(get_doors(computer.get_output_string())) print(get_items(computer.get_output_string())) computer.add_ascii_input(input()) computer.output.clear() return None, None
def main(puzzle_input): blacklist = [ "molten lava", "photons", "infinite loop", "giant electromagnet", "escape pod" ] opposites = { "north": "south", "south": "north", "east": "west", "west": "east" } computer = Intcode(puzzle_input) computer.run_program() items = [] doors = {} graph = nx.Graph() closed_set = set() open_set = [] # (room_name, door) room_name = get_room_name(computer.get_output_string()) for door in get_doors(computer.get_output_string()): open_set.append((room_name, door)) computer.output.clear() # Explore the maze while len(open_set): source_room, door_to_check = open_set.pop() closed_set.add((source_room, door_to_check)) if source_room != room_name: path = nx.shortest_path(graph, source=room_name, target=source_room) path_edges = zip(path, path[1:]) for edge in path_edges: computer.add_ascii_input(doors[edge]) computer.run_program() computer.output.clear() computer.add_ascii_input(door_to_check) computer.run_program() new_room = get_room_name(computer.get_output_string()) doors[(source_room, new_room)] = door_to_check doors[(new_room, source_room)] = opposites[door_to_check] closed_set.add((new_room, opposites[door_to_check])) graph.add_edge(source_room, new_room) if new_room != "Pressure-Sensitive Floor": for door in get_doors(computer.get_output_string()): if (new_room, door) not in closed_set and (new_room, door) not in open_set: open_set.append((new_room, door)) room_name = new_room for item in get_items(computer.get_output_string()): if not item in blacklist: computer.add_ascii_input("take " + item) #print("take ", item) items.append(item) computer.output.clear() # Get to Security Checkpoint if room_name != "Security Checkpoint": path = nx.shortest_path(graph, source=room_name, target="Security Checkpoint") path_edges = zip(path, path[1:]) for edge in path_edges: computer.add_ascii_input(doors[edge]) computer.run_program() computer.output.clear() # Try all combinations inventory = items.copy() for permutation in gray_code(len(items)): computer.output.clear() for i, s in enumerate(permutation): if s == "1" and not items[i] in inventory: computer.add_ascii_input("take " + items[i]) inventory.append(items[i]) if s == "0" and items[i] in inventory: computer.add_ascii_input("drop " + items[i]) inventory.remove(items[i]) computer.add_ascii_input(doors[("Security Checkpoint", "Pressure-Sensitive Floor")]) computer.run_program() if computer.get_output_string().find("Checkpoint") == -1: break part1 = computer.get_output_string().split("typing")[1].strip().split( " ")[0] return part1, "Align the Warp Drive"