This commit is contained in:
Stefan Harmuth 2021-11-27 06:34:51 +01:00
parent 37aad25422
commit c98135a75a
3 changed files with 77 additions and 11 deletions

24
day05.py Normal file
View File

@ -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

1
inputs/input05 Normal file
View File

@ -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

View File

@ -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