From c98135a75a70bc1079f1b90b4578a0c3d9aa1b2a Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Sat, 27 Nov 2021 06:34:51 +0100 Subject: [PATCH] day05 --- day05.py | 24 +++++++++++++++++++ inputs/input05 | 1 + intcode.py | 63 +++++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 day05.py create mode 100644 inputs/input05 diff --git a/day05.py b/day05.py new file mode 100644 index 0000000..8846d57 --- /dev/null +++ b/day05.py @@ -0,0 +1,24 @@ +from aoc import AOCDay +from intcode import IntCode +from typing import Any + + +class Day(AOCDay): + test_solutions_p1 = [] + test_solutions_p2 = [] + + def part1(self) -> Any: + comp = IntCode(self.getInputAsArraySplit(",", int)) + comp.input.put(1) + comp.run() + while True: + if (check := comp.output.get()) != 0: + return check + + def part2(self) -> Any: + comp = IntCode(self.getInputAsArraySplit(",", int)) + comp.input.put(5) + comp.run() + while True: + if (check := comp.output.get()) != 0: + return check diff --git a/inputs/input05 b/inputs/input05 new file mode 100644 index 0000000..9111f01 --- /dev/null +++ b/inputs/input05 @@ -0,0 +1 @@ +3,225,1,225,6,6,1100,1,238,225,104,0,1102,16,13,225,1001,88,68,224,101,-114,224,224,4,224,1002,223,8,223,1001,224,2,224,1,223,224,223,1101,8,76,224,101,-84,224,224,4,224,102,8,223,223,101,1,224,224,1,224,223,223,1101,63,58,225,1102,14,56,224,101,-784,224,224,4,224,102,8,223,223,101,4,224,224,1,223,224,223,1101,29,46,225,102,60,187,224,101,-2340,224,224,4,224,102,8,223,223,101,3,224,224,1,224,223,223,1102,60,53,225,1101,50,52,225,2,14,218,224,101,-975,224,224,4,224,102,8,223,223,1001,224,3,224,1,223,224,223,1002,213,79,224,101,-2291,224,224,4,224,102,8,223,223,1001,224,2,224,1,223,224,223,1,114,117,224,101,-103,224,224,4,224,1002,223,8,223,101,4,224,224,1,224,223,223,1101,39,47,225,101,71,61,224,101,-134,224,224,4,224,102,8,223,223,101,2,224,224,1,224,223,223,1102,29,13,225,1102,88,75,225,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,1107,677,677,224,102,2,223,223,1006,224,329,1001,223,1,223,108,677,677,224,1002,223,2,223,1005,224,344,101,1,223,223,1008,226,226,224,102,2,223,223,1006,224,359,1001,223,1,223,1107,226,677,224,102,2,223,223,1006,224,374,1001,223,1,223,8,677,226,224,102,2,223,223,1006,224,389,101,1,223,223,8,226,226,224,102,2,223,223,1006,224,404,101,1,223,223,7,677,677,224,1002,223,2,223,1006,224,419,101,1,223,223,7,677,226,224,1002,223,2,223,1005,224,434,101,1,223,223,1108,677,226,224,1002,223,2,223,1006,224,449,1001,223,1,223,108,677,226,224,1002,223,2,223,1006,224,464,101,1,223,223,1108,226,677,224,1002,223,2,223,1006,224,479,101,1,223,223,1007,677,677,224,1002,223,2,223,1006,224,494,1001,223,1,223,107,226,226,224,102,2,223,223,1005,224,509,1001,223,1,223,1008,677,226,224,102,2,223,223,1005,224,524,1001,223,1,223,1007,226,226,224,102,2,223,223,1006,224,539,101,1,223,223,1108,677,677,224,102,2,223,223,1005,224,554,1001,223,1,223,1008,677,677,224,1002,223,2,223,1006,224,569,101,1,223,223,1107,677,226,224,1002,223,2,223,1006,224,584,1001,223,1,223,7,226,677,224,102,2,223,223,1005,224,599,101,1,223,223,108,226,226,224,1002,223,2,223,1005,224,614,101,1,223,223,107,226,677,224,1002,223,2,223,1005,224,629,1001,223,1,223,107,677,677,224,1002,223,2,223,1006,224,644,101,1,223,223,1007,677,226,224,1002,223,2,223,1006,224,659,101,1,223,223,8,226,677,224,102,2,223,223,1005,224,674,1001,223,1,223,4,223,99,226 diff --git a/intcode.py b/intcode.py index c967d40..19f688c 100644 --- a/intcode.py +++ b/intcode.py @@ -1,4 +1,5 @@ from typing import List +from queue import Queue class IntCode: @@ -6,24 +7,64 @@ class IntCode: self.instr_ptr = 0 self.halted = False self.memory = memory + self.input = Queue() + self.output = Queue() if len(self.memory) < mem_size: self.memory.extend([0] * (mem_size - len(self.memory))) + def get_parameter_value(self, address: int, mode: int) -> int: + if mode == 0: + return self.memory[self.memory[address]] + elif mode == 1: + return self.memory[address] + def run(self): while not self.halted: - instr = self.memory[self.instr_ptr] + instr = self.memory[self.instr_ptr] % 100 + p1_mode = self.memory[self.instr_ptr] // 100 % 10 + p2_mode = self.memory[self.instr_ptr] // 1_000 % 10 + # p3_mode = self.memory[self.instr_ptr] // 10_000 % 10 - if instr == 1: - address1 = self.memory[self.instr_ptr + 1] - address2 = self.memory[self.instr_ptr + 2] - address3 = self.memory[self.instr_ptr + 3] - self.memory[address3] = self.memory[address1] + self.memory[address2] + if instr == 1: # add + param1 = self.get_parameter_value(self.instr_ptr + 1, p1_mode) + param2 = self.get_parameter_value(self.instr_ptr + 2, p2_mode) + target_addr = self.memory[self.instr_ptr + 3] + self.memory[target_addr] = param1 + param2 self.instr_ptr += 4 - elif instr == 2: - address1 = self.memory[self.instr_ptr + 1] - address2 = self.memory[self.instr_ptr + 2] - address3 = self.memory[self.instr_ptr + 3] - self.memory[address3] = self.memory[address1] * self.memory[address2] + elif instr == 2: # multiply + param1 = self.get_parameter_value(self.instr_ptr + 1, p1_mode) + param2 = self.get_parameter_value(self.instr_ptr + 2, p2_mode) + target_addr = self.memory[self.instr_ptr + 3] + self.memory[target_addr] = param1 * param2 + self.instr_ptr += 4 + elif instr == 3: # input + target_addr = self.memory[self.instr_ptr + 3] + self.memory[target_addr] = self.input.get() + self.instr_ptr += 2 + elif instr == 4: # output + self.output.put(self.get_parameter_value(self.instr_ptr + 1, p1_mode)) + self.instr_ptr += 2 + elif instr == 5: # jump-if-true + if self.get_parameter_value(self.instr_ptr + 1, p1_mode) != 0: + self.instr_ptr = self.get_parameter_value(self.instr_ptr + 2, p2_mode) + else: + self.instr_ptr += 3 + elif instr == 6: # jump-if-false + if self.get_parameter_value(self.instr_ptr + 1, p1_mode) == 0: + self.instr_ptr = self.get_parameter_value(self.instr_ptr + 2, p2_mode) + else: + self.instr_ptr += 3 + elif instr == 7: # less than + param1 = self.get_parameter_value(self.instr_ptr + 1, p1_mode) + param2 = self.get_parameter_value(self.instr_ptr + 2, p2_mode) + target_addr = self.memory[self.instr_ptr + 3] + self.memory[target_addr] = param1 < param2 + self.instr_ptr += 4 + elif instr == 8: # equals + param1 = self.get_parameter_value(self.instr_ptr + 1, p1_mode) + param2 = self.get_parameter_value(self.instr_ptr + 2, p2_mode) + target_addr = self.memory[self.instr_ptr + 3] + self.memory[target_addr] = param1 == param2 self.instr_ptr += 4 elif instr == 99: self.halted = True