Exemplo n.º 1
0
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
Exemplo n.º 2
0
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"