def part1():
    """Output the answer to part 1 - """
    cpu = IntCodeProcessor(path='day11input.txt')

    heading = (0, 1)
    path = [(0, 0)]
    paint = {}
    result = None
    next_input = None

    while result is None:
        try:
            result = cpu.execute_program(next_input, reset=False)
        except ExecutionError as err:
            assert err.reason == ExecutionCode.NEED_INPUT
            pass

        output_count = len(cpu.outputs)
        assert output_count == 2 or output_count == 0
        if output_count == 2:
            new_color = cpu.outputs.pop(0)
            turn = cpu.outputs.pop(0)
            heading = step_robot(new_color, turn, path, heading, paint)
        next_input = paint.get(path[-1], 0)
    print(f'Part 1 answer: {len(paint)}')
def part1(inputs=None):
    """Output the answer to part 1 - """
    cpu = IntCodeProcessor(path='day13input.txt')
    output = cpu.execute_program()
    block_count = sum(
        [1 for instruction in output[2::3] if instruction == BLOCK])
    print(f'Part 1 answer: {block_count}')
def part2():
    """Output the answer to part 2 - What's the final score"""

    program = IntCodeProcessor.load_program('day13input.txt')
    program[0] = 2
    cpu = IntCodeProcessor(program)
    result = None
    next_input = None
    ball_pos = None
    paddle_pos = None
    score = None
    while result is None:
        try:
            result = cpu.execute_program(next_input, reset=False)
        except ExecutionError as err:
            assert err.reason == ExecutionCode.NEED_INPUT

        ball_pos, paddle_pos, score = process_output(cpu.outputs, ball_pos,
                                                     paddle_pos, score)
        cpu.outputs = []
        next_input = next_input_for(ball_pos, paddle_pos)
    print(f'Part 2 answer: {score}')
from intcode import IntCodeProcessor

cpu = IntCodeProcessor(path='day05input.txt')
print('Part 1 answer: ', cpu.execute_program(1)[-1])
print('Part 2 answer: ', cpu.execute_program(5)[0])

if __name__ == '__main__':
    #part1()
    part2()

    cpu = IntCodeProcessor(path='day11input.txt')
    heading = (0, 1)
    path = [(0, 0)]
    paint = {}
    result = None
    next_input = 1

    while result is None:
        try:
            result = cpu.execute_program(next_input, reset=False)
        except ExecutionError as err:
            assert err.reason == ExecutionCode.NEED_INPUT
            pass

        output_count = len(cpu.outputs)
        assert output_count == 2 or output_count == 0
        if output_count == 2:
            new_color = cpu.outputs.pop(0)
            turn = cpu.outputs.pop(0)
            heading = step_robot(new_color, turn, path, heading, paint)
        next_input = paint.get(path[-1], 0)

    s = {}
    for loc, color in paint.items():
        s.setdefault(loc[1], []).append((loc[0], color))
def generate_thruster_signal(program, phase_settings):
    cpu = IntCodeProcessor(program)
    signal = 0
    for phase in phase_settings:
        signal = cpu.execute_program([phase, signal])[0]
    return signal