Beispiel #1
0
def turtle(start_panel_colour):

    x, y, heading = 0, 0, N  # turtle start state
    grid = {}  # grid coordinates with colour values

    computer = IntCodeComputer(puzzle_input)
    # add current colour to computer input queue
    computer.input_queue.append(start_panel_colour)
    paint_colour = computer.run()  # get new paint brush colour

    while not computer.opcode == Opcode.HALT:

        grid[(x, y)] = paint_colour

        turn_direction = computer.run()
        # turn direction = 0 is left, turn direction = 1  is right
        heading = [L, R][turn_direction][heading]
        x, y = x + heading[X_INCREMENT_INDEX], y + heading[Y_INCREMENT_INDEX]

        # get current colour, if not already seen it will be black
        current_colour = grid.get((x, y), BLACK)

        # add current colour to computer input queue
        computer.input_queue.append(current_colour)
        paint_colour = computer.run()  # current paint brush colour

    return grid
 def test_intcode_IN_input_queue(self):
     self.computer = IntCodeComputer("3,0,3,2,99")
     self.computer.input_queue.append(5)
     self.computer.input_queue.append(6)
     self.computer.run()
     self.assertListEqual(list(self.computer.memory.values()),
                          [5, 0, 6, 2, 99])
Beispiel #3
0
 def __init__(self, program):
     self.computer = IntCodeComputer(program)
     self.maze = {(0, 0): RepairDroid.START_CHAR}
     self.system = None
     self.init_window()
     self.update_window(2, 0, 0)  #display start
     self.step_count = 0
Beispiel #4
0
    def __init__(self, program, is_play_free=False, is_show_animation=False):

        # indexes of tile types ... the intcode computer output uses these indexes
        self.EMPTY = 0
        self.WALL = 1
        self.BLOCK = 2
        self.PADDLE = 3
        self.BALL = 4

        # intitialize a few vars used later
        self.x = self.y = None
        self.blocks_total = self.score = 0
        self.ball_x = self.paddle_x = 0

        # init the intcode computer and setup event handlers
        self.computer = IntCodeComputer(program, is_enable_events=True)
        self.computer.input_event.listeners += [self.input_handler]
        self.computer.output_event.listeners += [self.output_handler]

        # if playing free (part 2) then set memory location 0 =2
        if is_play_free:
            self.computer.memory[0] = 2

        # if animating (part 2) then get the turtle graphics initialized
        if is_show_animation:
            self.init_window()
        self.is_show_animation = is_show_animation
 def test_intcode_IN_event_handler_input(self):
     self.computer = IntCodeComputer("3,0,99", is_enable_events=True)
     self.event_handlers = IntcodeComputerTestEventHandler(self.computer)
     self.event_handlers.input = 88
     self.event_handlers.is_test_input_queue_exception = False
     self.computer.run()
     self.assertEqual(self.computer.input, self.event_handlers.input)
Beispiel #6
0
def run(controller_input, phase_settings):
    input_signal = 0
    for phase_setting in phase_settings:
        computer = IntCodeComputer(program=copy(controller_input),
                                   phase_setting=phase_setting)
        computer.run(input_signal)
        input_signal = computer.value
    return input_signal
 def test_intcode_modes(self):  # using day 5 diagnostic test
     self.computer = IntCodeComputer(
         aoc_download.aoc.puzzle_input_file(year=2019, day=5))
     self.computer.input_queue.append(1)
     while not (self.computer.output
                or self.computer.opcode == Opcode.HALT):
         self.computer.run()
     self.assertEqual(self.computer.output, 6069343)
 def test_intcode_relative_mode(self):
     self.computer = IntCodeComputer(
         "109,1,204,-1,1001,100,1,100,1008,100,16,101,1006,101,0,99",
         is_enable_events=True)
     self.event_handlers = IntcodeComputerTestEventHandler(self.computer)
     self.computer.run()
     self.assertEqual(
         self.event_handlers.output_cache,
         '109,1,204,-1,1001,100,1,100,1008,100,16,101,1006,101,0,99')
Beispiel #9
0
class Amplifier:

    def __init__(self, stream):
        self.computer = IntCodeComputer(stream)

    def output(self):
        return self.computer.output

    def run(self, input_queue):
        self.computer.input_queue += input_queue
        self.computer.run()

    def reset(self):
        self.computer.reset()
Beispiel #10
0
def solve_day_19(input):
    regex = re.compile("-{0,1}\d+")
    f = open(input, "r")
    computer = IntCodeComputer(regex.findall(f.readline()))
    size = 50
    p1 = 0
    for x in range(size):
        for y in range(size):
            # I have no clue why I need three inputs, but I do
            computer.write([0, x, y])
            computer.run()
            result = computer.read()[0]
            p1 += result
            computer.reset()
            print(result, end="")
        print()
    return (p1, 0)
Beispiel #11
0
def solve_day_02(input):
    regex = re.compile("\d+")
    f = open(input, "r")
    computer = IntCodeComputer(regex.findall(f.readline()))
    computer.run()
    p1 = computer.memory[0]
    p2 = 0
    has_found = False
    for noun in range(99):
        for verb in range(99):
            computer.reset()
            computer.memory[1] = noun
            computer.memory[2] = verb
            computer.run()
            if computer.memory[0] == 19690720:
                p2 = 100 * noun + verb
                has_found = True
                break
        if has_found:
            break
    return (p1, p2)
Beispiel #12
0
def solve_day_15(input):
    droid = Droid()
    tiles = {(0, 0): "❌"}
    coords = [(0, 0), (0, -1), (0, 1), (-1, 0), (1, 0)]
    regex = re.compile("-{0,1}\d+")
    f = open(input, "r")
    computer = IntCodeComputer(regex.findall(f.readline()))
    p1 = None
    while computer.status != Status.TERMINATED:
        p1 = scout_area(computer, coords, droid, tiles)
    print_area(None, tiles)
    p2 = flood_area([p1[0]], coords, tiles)
    return (p1[1], p2)
Beispiel #13
0
def run_part2(controller_input, phase_settings):
    computers = [
        IntCodeComputer(program=copy(controller_input),
                        phase_setting=phase,
                        yield_at_output=True) for phase in phase_settings
    ]

    completed = False
    input_signal = 0
    while not completed:
        for computer in computers:
            computer.run(input_signal)
            input_signal = computer.value

        completed = all(c.completed for c in computers)

    return computers[0].value
Beispiel #14
0
def solve_day_13(input):
    regex = re.compile("-{0,1}\d+")
    f = open(input, "r")
    computer = IntCodeComputer(regex.findall(f.readline()))
    ts = play(computer, {})
    tiles = ts[0]
    score = ts[1]
    p1 = sum(value == 2 for value in tiles.values())
    print_arcade(tiles)
    computer.reset()
    computer.memory[0] = 2
    while computer.status != Status.TERMINATED:
        computer.write(get_joystick(tiles))
        ts = play(computer, tiles)
        tiles = ts[0]
        score = ts[1]
        # print_arcade(tiles)
    return (p1, score)
class TestIntCodeComputer(unittest.TestCase):

    # def setUp(self):
    #     self.computer = IntCodeComputer()

    def test_intcode_load(self):
        self.computer = IntCodeComputer("2,3,0,3,99")
        self.assertListEqual(list(self.computer.memory.values()),
                             [2, 3, 0, 3, 99])

    def test_intcode_opcode_exeption(self):
        self.computer = IntCodeComputer("0,0,99")
        self.assertRaises(IntCodeComputerOpCodeException, self.computer.run)

    def test_intcode_ADD(self):
        self.computer = IntCodeComputer("1,0,0,0,99")
        self.computer.run()
        self.assertListEqual(list(self.computer.memory.values()),
                             [2, 0, 0, 0, 99])

    def test_intcode_MUL(self):
        self.computer = IntCodeComputer("2,3,0,3,99")
        self.computer.run()
        self.assertListEqual(list(self.computer.memory.values()),
                             [2, 3, 0, 6, 99])

    def test_intcode_IN_input_queue(self):
        self.computer = IntCodeComputer("3,0,3,2,99")
        self.computer.input_queue.append(5)
        self.computer.input_queue.append(6)
        self.computer.run()
        self.assertListEqual(list(self.computer.memory.values()),
                             [5, 0, 6, 2, 99])

    def test_intcode_IN_input_queue_empty_exception(self):
        self.computer = IntCodeComputer("3,0,99")
        self.assertRaises(IntCodeComputerInputQueueException,
                          self.computer.run)

    def test_intcode_IN_event_handler_input(self):
        self.computer = IntCodeComputer("3,0,99", is_enable_events=True)
        self.event_handlers = IntcodeComputerTestEventHandler(self.computer)
        self.event_handlers.input = 88
        self.event_handlers.is_test_input_queue_exception = False
        self.computer.run()
        self.assertEqual(self.computer.input, self.event_handlers.input)

    def test_intcode_IN_event_handler_input_queue_empty_exception(self):
        self.computer = IntCodeComputer("3,0,99", is_enable_events=True)
        self.event_handlers = IntcodeComputerTestEventHandler(self.computer)
        self.event_handlers.is_test_input_queue_exception = True
        self.assertRaises(IntCodeComputerInputQueueException,
                          self.computer.run)

    def test_intcode_IN_event_handler_missing_exeption(self):
        self.computer = IntCodeComputer("3,0,99", is_enable_events=True)
        self.assertRaises(IntCodeComputerEventHandlerException,
                          self.computer.run)

    def test_intcode_OUT(self):
        self.computer = IntCodeComputer("104,88,99")
        self.assertEqual(self.computer.run(), 88)

    def test_intcode_OUT_event_handler(self):
        self.computer = IntCodeComputer("104,88,99", is_enable_events=True)
        self.event_handlers = IntcodeComputerTestEventHandler(self.computer)
        self.computer.run()
        self.assertEqual(self.event_handlers.output, 88)

    def test_intcode_OUT_event_handler_missing_exeption(self):
        self.computer = IntCodeComputer("104,88,99", is_enable_events=True)
        self.assertRaises(IntCodeComputerEventHandlerException,
                          self.computer.run)

    def test_intcode_modes(self):  # using day 5 diagnostic test
        self.computer = IntCodeComputer(
            aoc_download.aoc.puzzle_input_file(year=2019, day=5))
        self.computer.input_queue.append(1)
        while not (self.computer.output
                   or self.computer.opcode == Opcode.HALT):
            self.computer.run()
        self.assertEqual(self.computer.output, 6069343)

    def test_intcode_EQ_true(self):
        self.computer = IntCodeComputer("3,9,8,9,10,9,4,9,99,-1,8")
        self.assertEqual(self.computer.run(8), 1)

    def test_intcode_EQ_false(self):
        self.computer = IntCodeComputer("3,9,8,9,10,9,4,9,99,-1,8")
        self.assertEqual(self.computer.run(7), 0)

    def test_intcode_LT_true(self):
        self.computer = IntCodeComputer("3,3,1107,-1,8,3,4,3,99")
        self.assertEqual(self.computer.run(7), 1)

    def test_intcode_LT_false(self):
        self.computer = IntCodeComputer("3,3,1107,-1,8,3,4,3,99")
        self.assertEqual(self.computer.run(8), 0)

    # def test_intcode_JZ_true(self):
    #     self.computer = IntCodeComputer("3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9")
    #     self.assertEqual(self.computer.run(0),0)

    def test_intcode_JZ_false(self):
        self.computer = IntCodeComputer(
            "3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9")
        self.assertEqual(self.computer.run(10), 1)

    def test_intcode_jumps_test1(self):
        self.computer = IntCodeComputer(
            "3,21,1008,21,8,20,1005,20,22,107,8,21,20,1006,20,31,1106,0,36,98,0,0,1002,21,125,20,4,20,1105,1,46,104,999,1105,1,46,1101,1000,1,20,4,20,1105,1,46,98,99"
        )
        self.assertEqual(self.computer.run(5), 999)

    def test_intcode_jumps_test2(self):
        self.computer = IntCodeComputer(
            "3,21,1008,21,8,20,1005,20,22,107,8,21,20,1006,20,31,1106,0,36,98,0,0,1002,21,125,20,4,20,1105,1,46,104,999,1105,1,46,1101,1000,1,20,4,20,1105,1,46,98,99"
        )
        self.assertEqual(self.computer.run(8), 1000)

    def test_intcode_jumps_test3(self):
        self.computer = IntCodeComputer(
            "3,21,1008,21,8,20,1005,20,22,107,8,21,20,1006,20,31,1106,0,36,98,0,0,1002,21,125,20,4,20,1105,1,46,104,999,1105,1,46,1101,1000,1,20,4,20,1105,1,46,98,99"
        )
        self.assertEqual(self.computer.run(10), 1001)

    def test_intcode_relative_mode(self):
        self.computer = IntCodeComputer(
            "109,1,204,-1,1001,100,1,100,1008,100,16,101,1006,101,0,99",
            is_enable_events=True)
        self.event_handlers = IntcodeComputerTestEventHandler(self.computer)
        self.computer.run()
        self.assertEqual(
            self.event_handlers.output_cache,
            '109,1,204,-1,1001,100,1,100,1008,100,16,101,1006,101,0,99')

    def test_intcode_large_numbers(self):
        self.computer = IntCodeComputer("104,1125899906842624,99")
        self.assertEqual(self.computer.run(), 1125899906842624)
 def test_intcode_OUT(self):
     self.computer = IntCodeComputer("104,88,99")
     self.assertEqual(self.computer.run(), 88)
 def test_intcode_IN_event_handler_input_queue_empty_exception(self):
     self.computer = IntCodeComputer("3,0,99", is_enable_events=True)
     self.event_handlers = IntcodeComputerTestEventHandler(self.computer)
     self.event_handlers.is_test_input_queue_exception = True
     self.assertRaises(IntCodeComputerInputQueueException,
                       self.computer.run)
 def test_intcode_IN_input_queue_empty_exception(self):
     self.computer = IntCodeComputer("3,0,99")
     self.assertRaises(IntCodeComputerInputQueueException,
                       self.computer.run)
 def test_intcode_JZ_false(self):
     self.computer = IntCodeComputer(
         "3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9")
     self.assertEqual(self.computer.run(10), 1)
 def test_intcode_jumps_test3(self):
     self.computer = IntCodeComputer(
         "3,21,1008,21,8,20,1005,20,22,107,8,21,20,1006,20,31,1106,0,36,98,0,0,1002,21,125,20,4,20,1105,1,46,104,999,1105,1,46,1101,1000,1,20,4,20,1105,1,46,98,99"
     )
     self.assertEqual(self.computer.run(10), 1001)
 def test_intcode_OUT_event_handler(self):
     self.computer = IntCodeComputer("104,88,99", is_enable_events=True)
     self.event_handlers = IntcodeComputerTestEventHandler(self.computer)
     self.computer.run()
     self.assertEqual(self.event_handlers.output, 88)
 def test_intcode_LT_true(self):
     self.computer = IntCodeComputer("3,3,1107,-1,8,3,4,3,99")
     self.assertEqual(self.computer.run(7), 1)
 def test_intcode_OUT_event_handler_missing_exeption(self):
     self.computer = IntCodeComputer("104,88,99", is_enable_events=True)
     self.assertRaises(IntCodeComputerEventHandlerException,
                       self.computer.run)
 def test_intcode_large_numbers(self):
     self.computer = IntCodeComputer("104,1125899906842624,99")
     self.assertEqual(self.computer.run(), 1125899906842624)
 def test_intcode_EQ_false(self):
     self.computer = IntCodeComputer("3,9,8,9,10,9,4,9,99,-1,8")
     self.assertEqual(self.computer.run(7), 0)
 def test_intcode_opcode_exeption(self):
     self.computer = IntCodeComputer("0,0,99")
     self.assertRaises(IntCodeComputerOpCodeException, self.computer.run)
Beispiel #27
0
def solve_day_05(input):
    regex = re.compile("-{0,1}\d+")
    f = open(input, "r")
    computer = IntCodeComputer(regex.findall(f.readline()))
    computer.write(1)
    computer.run()
    p1 = computer.read()[-1]
    computer.reset()
    computer.write(5)
    computer.run()
    p2 = computer.read()[0]
    return (p1, p2)
 def test_intcode_ADD(self):
     self.computer = IntCodeComputer("1,0,0,0,99")
     self.computer.run()
     self.assertListEqual(list(self.computer.memory.values()),
                          [2, 0, 0, 0, 99])
Beispiel #29
0
import aoc_download
from intcode_computer import IntCodeComputer
YEAR = 2019
DAY = 9

puzzle_input = aoc_download.aoc.puzzle_input_file(YEAR, DAY)

computer = IntCodeComputer(puzzle_input)
computer.input_queue.append(1)
computer.run()

print("part 1:", computer.output)

computer.reset()
computer.input_queue.append(2)
computer.run()

print("part 2:", computer.output)
 def test_intcode_MUL(self):
     self.computer = IntCodeComputer("2,3,0,3,99")
     self.computer.run()
     self.assertListEqual(list(self.computer.memory.values()),
                          [2, 3, 0, 6, 99])