Exemplo n.º 1
0
def find_keycode(intcode: List[int]) -> int:
    intcomp = Intcomp(intcode, [1])
    intcomp.run()
    return intcomp.next_output()
Exemplo n.º 2
0
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
Exemplo n.º 3
0
def get_coordinates(intcode: List[int]) -> int:
    intcomp = Intcomp(intcode, [2])
    intcomp.run()
    return intcomp.next_output()