from typing import List class IntCode: def __init__(self, memory: List[int], mem_size: int = 0): self.instr_ptr = 0 self.halted = False self.memory = memory if len(self.memory) < mem_size: self.memory.extend([0] * (mem_size - len(self.memory))) def run(self): while not self.halted: instr = self.memory[self.instr_ptr] 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] 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] self.instr_ptr += 4 elif instr == 99: self.halted = True else: raise ValueError("Invalid instruction encountered at pos %d: %d" % (self.instr_ptr, instr))