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])
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
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)
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')
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()
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)
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)
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)
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
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)
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])
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])