def test_day2_testinput2(self): code_day2 = ic.parse_code( 'C:/Users/Admin/Documents/Code/advent_of_code/2019/5/testinput2.txt' ) day2 = ic.Intcode(code_day2) day2.run(debug=False) self.assertEqual({0: 1101, 1: 100, 2: -1, 3: 4, 4: 99}, day2.code)
def test_day7_part2(self): code = ic.parse_code( 'C:/Users/Admin/Documents/Code/advent_of_code/2019/7/input.txt') seqs = list(itertools.permutations(range(5, 10), 5)) max_results = [] for seq in seqs: results = [] amps = [] inp2 = 0 for i in range(5): inp1 = seq[i] amps.append(ic.Intcode(code)) #print("inp1:", inp1, "inp2:", inp2) inp2 = amps[i].run([inp1, inp2], reset=False, debug=False) #print("*** OUTPUT:", inp2) while True: i += 1 i = i % len(seq) inp1 = seq[i] #print("inp2:", inp2) inp2 = amps[i].run([inp2], reset=False, debug=False) #print("*** OUTPUT:", inp2) if i == 4: results.append(inp2) if i == 4 and amps[i].code[amps[i].pointer] == 99: break max_results.append(max(results)) self.assertEqual(21596786, max(max_results))
def test_day5_testinput(self): testcode_day5 = ic.parse_code( 'C:/Users/Admin/Documents/Code/advent_of_code/2019/5/testinput.txt' ) day5test = ic.Intcode(testcode_day5) self.assertEqual({0: 1002, 1: 4, 2: 3, 3: 4, 4: 33}, day5test.code) day5test.run() self.assertEqual({0: 1002, 1: 4, 2: 3, 3: 4, 4: 99}, day5test.code)
def test_day5_part1(self): code_day5 = ic.parse_code( 'C:/Users/Admin/Documents/Code/advent_of_code/2019/5/input.txt') day5 = ic.Intcode(code_day5) while True: result = day5.run(input=1, reset=False) if result != 0: break self.assertEqual(result, 14155342)
def test_longer_example_day5_2(self): #999 if value below 8, 1000 if equal to 8, 1001 if larger than 8 self.code = ic.parse( "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.prog = ic.Intcode(self.code) self.assertEqual(999, self.prog.run(7, debug=False)) self.assertEqual(1000, self.prog.run(8, reset=True)) self.assertEqual(1001, self.prog.run(9))
def test_day7_1_ex1(self): code = ic.parse('3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0') seq = [4, 3, 2, 1, 0] amps = [] inp2 = 0 for i in range(5): inp1 = seq[i] amps.append(ic.Intcode(code)) inp2 = amps[i].run([inp1, inp2], reset=False, debug=False) self.assertEqual(43210, inp2)
def test_day7_ex1(self): code = ic.parse( "109,1,204,-1,1001,100,1,100,1008,100,16,101,1006,101,0,99") expected = [ 109, 1, 204, -1, 1001, 100, 1, 100, 1008, 100, 16, 101, 1006, 101, 0, 99 ] prog = ic.Intcode(code) for _ in range(len(code)): result = prog.run(reset=False, debug=False, return_all=True) self.assertEqual(expected, result)
def test_day7_1_ex3(self): code = ic.parse( '3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0' ) seq = [1, 0, 4, 3, 2] amps = [] inp2 = 0 for i in range(5): inp1 = seq[i] amps.append(ic.Intcode(code)) inp2 = amps[i].run([inp1, inp2], reset=False, debug=False) self.assertEqual(65210, inp2)
def test_day7_1_ex2(self): code = ic.parse( '3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0' ) seq = [0, 1, 2, 3, 4] amps = [] inp2 = 0 for i in range(5): inp1 = seq[i] amps.append(ic.Intcode(code)) inp2 = amps[i].run([inp1, inp2], reset=False, debug=False) self.assertEqual(54321, inp2)
def main(): with open('input1.txt', 'r') as file: program = file.read().strip() comp = IntCode.IntCode(program) comp.push(1) comp.run() print(f"Part 1 solution is: {comp.output.pop()}") comp2 = IntCode.IntCode(program) comp2.push(5) comp2.run() print(f"Part 2 solution is: {comp2.pop()}")
def test_day7_part1(self): code = ic.parse_code( 'C:/Users/Admin/Documents/Code/advent_of_code/2019/7/input.txt') seq = list(itertools.permutations(range(5), 5)) results = [] for s in seq: amps = [] inp2 = 0 for i in range(5): inp1 = s[i] amps.append(ic.Intcode(code)) inp2 = amps[i].run([inp1, inp2], reset=False, debug=False) results.append(inp2) result = max(results) self.assertEqual(result, 366376)
def part_one(code: list[int]) -> None: machine: IntCode.Machine = IntCode.Machine(code, [1]) machine.run() if any(machine.output_vals[:-1]): print(f"Failed tests: {machine.output_vals}") else: print(machine.output_vals[-1])
def test_add_immediate(self): self.code = ic.parse("1,97,2,6,4,95,-1") self.prog = ic.Intcode(self.code) self.prog.par1.value = 97 self.prog.par2.value = 2 self.prog.par3.value = 6 self.prog.par1.mode = 1 self.prog.par2.mode = 1 self.prog.par3.mode = 1 self.prog.add(debug=False) self.assertEqual({ 0: 1, 1: 97, 2: 2, 3: 6, 4: 4, 5: 95, 6: 99 }, self.prog.code)
def test_add_position(self): self.code = ic.parse("1,1,2,-1,4,95,-1") self.prog = ic.Intcode(self.code) self.prog.par1.value = 1 self.prog.par2.value = 2 self.prog.par3.value = 3 self.prog.par1.mode = 0 self.prog.par2.mode = 0 self.prog.par3.mode = 0 self.prog.add(debug=False) self.assertEqual({ 0: 1, 1: 1, 2: 2, 3: 3, 4: 4, 5: 95, 6: -1 }, self.prog.code)
def test_relative_mode(self): prog = ic.Intcode([109, -1, 204, 1, 99]) self.assertEqual(109, prog.run()) prog = ic.Intcode([109, 1, 9, 2, 204, -6, 99]) self.assertEqual(204, prog.run()) prog = ic.Intcode([109, 1, 109, 9, 204, -6, 99]) self.assertEqual(204, prog.run()) prog = ic.Intcode([109, 1, 209, -1, 204, -106, 99]) self.assertEqual(204, prog.run()) prog = ic.Intcode([109, 1, 3, 3, 204, 2, 99]) self.assertEqual(66, prog.run(66)) prog = ic.Intcode([109, 1, 203, 2, 204, 2, 99]) self.assertEqual(66, prog.run(66))
def arcade(code, play_free=False): codes = [int(x) for x in code.split(',')] computer = IntCode(codes) tiles = dict() outputs = [] score = 0 if play_free: computer.edit(0, 2) while True: res = computer.run() if res == R_HALT: break elif res == R_OUTPUT: outputs.append(computer.read()) if len(outputs) == 3: x = outputs[0] y = outputs[1] tile_id = outputs[2] if x == -1 and y == 0: score = tile_id else: tiles[(x, y)] = tile_id if tile_id == 3: paddle = x elif tile_id == 4: ball = x outputs = [] elif res == R_INPUT: computer.write(cmp(ball, paddle)) return tiles, score
def run(code: list[int], x: int) -> int: machine: IntCode.Machine = IntCode.Machine(code, [x]) machine.run() [ans] = machine.output_vals return ans
def run_with_noun_verb(code: list[int], noun: int, verb: int) -> int: machine: IntCode.Machine = IntCode.Machine(code) machine.code[1] = noun machine.code[2] = verb machine.run() return machine.code[0]
import sys sys.path.append("C:/Users/Admin/Documents/Code/advent_of_code/2019/5") import IntCode as ic code = ic.parse_code( 'C:/Users/Admin/Documents/Code/advent_of_code/2019/9/input.txt') prog = ic.Intcode(code) print(prog.run(reset=False, debug=True, input=1))
import sys sys.path.append("C:/Users/Admin/Documents/Code/advent_of_code/2019/5") import IntCode as ic code_day5 = ic.parse_code('C:/Users/Admin/Documents/Code/advent_of_code/2019/5/input.txt') day5 = ic.Intcode(code_day5) result = 0 while result == 0: result = day5.run(input=1, reset=False) print(result) assert result == 14155342
def test_equals_8_immediate_mode(self): self.code = ic.parse("3,3,1108,-1,8,3,4,3,99") self.prog = ic.Intcode(self.code) self.assertEqual(self.prog.run(8, reset=True), 1) self.assertEqual(self.prog.run(7), 0)
import sys sys.path.append("C:/Users/Admin/Documents/Code/advent_of_code/2019/5") import IntCode as ic # EXAMPLES code = ic.parse( '3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5' ) seq = [9, 8, 7, 6, 5] code = ic.parse( '3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,' '0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10') seq = [9, 7, 8, 5, 6] results = [] amps = [] inp2 = 0 for i in range(5): #print("*** Amp", i) inp1 = seq[i] amps.append(ic.Intcode(code)) #print("*** called with input", inp1, inp2) inp2 = amps[i].run([inp1, inp2], reset=False) #print("Amp", i, "'s code:", amps[i].code) while True: i += 1 i = i % len(seq)
def test_jump_zero_if_input_zero_immediate(self): self.code = ic.parse("3,3,1105,-1,9,1101,0,0,12,4,12,99,1") self.prog = ic.Intcode(self.code) self.assertEqual(self.prog.run(0, reset=True), 0) self.assertEqual(self.prog.run(2323), 1)
def test_jump_zero_if_input_zero(self): self.code = ic.parse("3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9") self.prog = ic.Intcode(self.code) self.assertEqual(self.prog.run(0, debug=False, reset=True), 0) self.assertEqual(self.prog.run(3, debug=False), 1)
def test_less_than_8_immediate_mode(self): self.code = ic.parse("3,3,1107,-1,8,3,4,3,99") self.prog = ic.Intcode(self.code) self.assertEqual(self.prog.run(8, debug=False, reset=True), 0) self.assertEqual(self.prog.run(7), 1)
def maximize_thrust(program: IntCode, phases: list, feedback_loop: bool = False) -> int: """ Return maximal possible thrust. """ list_phases = list(permutations(phases)) list_thrust = [ amplify_thrust(program, phase, feedback_loop) for phase in list_phases ] return max(list_thrust) if __name__ == '__main__': # 1 program_test_1 = IntCode( [3, 15, 3, 16, 1002, 16, 10, 16, 1, 16, 15, 15, 4, 15, 99, 0, 0]) assert maximize_thrust(program_test_1, list(range(5))) == 43210 program_test_2 = IntCode([ 3, 23, 3, 24, 1002, 24, 10, 24, 1002, 23, -1, 23, 101, 5, 23, 23, 1, 24, 23, 23, 4, 23, 99, 0, 0 ]) assert maximize_thrust(program_test_2, list(range(5))) == 54321 program_test_3 = IntCode([ 3, 31, 3, 32, 1002, 32, 10, 32, 1001, 31, -2, 31, 1007, 31, 0, 33, 1002, 33, 7, 33, 1, 33, 31, 31, 1, 32, 31, 31, 4, 31, 99, 0, 0, 0 ]) assert maximize_thrust(program_test_3, list(range(5))) == 65210 program = IntCode("input.csv")
self.move(dif_dir[tuple(dif)]) # remove the last element from the route. self.route.pop() self.map[tuple(self.position)] = "D" self.uturn = True # if the previous move was not a u-turn but this one is, return a -1 code to let the system know # we're at a dead end. if not self.previous_uturn: print("recorded a dead end", dead_end_dist, "steps from oxygen system at", dead_end_pos) #display_grid(droid.map) self.distances.append(dead_end_dist) return -1 code = ic.parse_code( 'C:/Users/Admin/SURFdrive/Code/advent_of_code/2019/15/input.txt') software = ic.Intcode(code) droid = RepairDroid(software) output = None while not output == 99: output = droid.scan_and_move() droid.map[(0, 0)] = "S" display_grid(droid.map) print(droid.oxygen_pos) map = droid.map # start a new droid
def part_two(code: list[int]) -> None: machine: IntCode.Machine = IntCode.Machine(code, [5]) machine.run() print(machine.output_vals[-1])
return self.panels.get((self.y, self.x), 0) def set_color(self, c): self.panels[(self.y, self.x)] = c def run(self): for (c, t) in pairs(self.code): self.set_color(c) self.turn(t) self.move() self.inp.append(self.get_color()) # Answer part 1 inp = [0] robot = Robot(IntCode.fromfile('input.txt', iter(inp)), inp) robot.run() print len(robot.panels) # Answer part 2 inp = [1] robot = Robot(IntCode.fromfile('input.txt', iter(inp)), inp, {(0, 0): 1}) robot.run() xmin = min(x for (y, x) in robot.panels.keys()) xmax = max(x for (y, x) in robot.panels.keys()) ymin = min(y for (y, x) in robot.panels.keys()) ymax = max(y for (y, x) in robot.panels.keys()) image = np.zeros(((ymax - ymin + 1), (xmax - xmin + 1)), dtype=int) for ((y, x), c) in robot.panels.iteritems(): image[y, x] = c
def test_less_than_8(self): self.code = ic.parse("3,9,7,9,10,9,4,9,99,-1,8") self.prog = ic.Intcode(self.code) self.assertEqual(self.prog.run(8, reset=True), 0) self.assertEqual(self.prog.run(7), 1)