day05
This commit is contained in:
parent
37aad25422
commit
c98135a75a
24
day05.py
Normal file
24
day05.py
Normal 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
1
inputs/input05
Normal 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
|
||||
63
intcode.py
63
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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user