diff --git a/2019/day-5/copy.py b/2019/day-5/copy.py new file mode 100644 index 0000000..10114ee --- /dev/null +++ b/2019/day-5/copy.py @@ -0,0 +1,94 @@ +class ComputationFinished(Exception): + pass + +class Computer: + def __init__(self, memory, input_=(), pointer=0): + self.memory = memory + self.pointer = pointer + self.input = iter(input_) + + self.READ_MODES = { + 0: (self.point, self.point, self.point), + 100: (self.point, self.point, self.value), + 10: (self.point, self.value, self.point), + 110: (self.point, self.value, self.value), + 1: (self.value, self.point, self.point), + 101: (self.value, self.point, self.value), + 11: (self.value, self.value, self.point), + 111: (self.value, self.value, self.value),} + + self.OP_CODES = { + 1: (self.op_add, 3), + 2: (self.op_mul, 3), + 3: (self.op_input, 1), + 4: (self.op_print, 1), + 5: (self.op_jit, 2), + 6: (self.op_jif, 2), + 7: (self.op_lt, 3), + 8: (self.op_eq, 3), + 99: (self.op_exit, 0), } + + def step(self): + op, parameters, offset = self.read_opcode(self.pointer) + self.pointer += offset + op(*parameters) + + def read_opcode(self, pointer): + code = self.memory[pointer] + readmodes, opcode = divmod(code, 100) + op, nargs = self.OP_CODES[opcode] + argument_functions = self.READ_MODES[readmodes][:nargs] + parameters = [f(ptr) for f, ptr in zip(argument_functions, range(pointer+1, pointer+4))] + return op, parameters, nargs + 1 + + def op_add(self, par1, par2, par3): + self.memory[par3] = self.memory[par1] + self.memory[par2] + + def op_mul(self, par1, par2, par3): + self.memory[par3] = self.memory[par1] * self.memory[par2] + + def op_input(self, par1): + self.memory[par1] = next(self.input) + + def op_print(self, par1): + print(self.memory[par1]) + + def op_exit(self,): + raise ComputationFinished + + def op_jit(self, par1, par2): + if self.memory[par1] != 0: + self.pointer = self.memory[par2] + + def op_jif(self, par1, par2): + if self.memory[par1] == 0: + self.pointer = self.memory[par2] + + def op_lt(self, par1, par2, par3): + self.memory[par3] = int(self.memory[par1] < self.memory[par2]) + + def op_eq(self, par1, par2, par3): + self.memory[par3] = int(self.memory[par1] == self.memory[par2]) + + def value(self, location): + return location + + def point(self, location): + ptr = self.memory[location] + return ptr + + def run(self): + try: + while True: + self.step() + except ComputationFinished: + return + + +def day5(data, input_=(1,)): + tape = list(map(int, data.split(","))) + computer = Computer(tape, input_=input_) + computer.run() + +day5(open("F://Programming//advent-of-code//2019//day-5//input").read()) +day5(open("F://Programming//advent-of-code//2019//day-5//input").read(), input_=(5,)) \ No newline at end of file diff --git a/2019/day-5/input b/2019/day-5/input new file mode 100644 index 0000000..e1f3f2d --- /dev/null +++ b/2019/day-5/input @@ -0,0 +1 @@ +3,225,1,225,6,6,1100,1,238,225,104,0,1101,32,43,225,101,68,192,224,1001,224,-160,224,4,224,102,8,223,223,1001,224,2,224,1,223,224,223,1001,118,77,224,1001,224,-87,224,4,224,102,8,223,223,1001,224,6,224,1,223,224,223,1102,5,19,225,1102,74,50,224,101,-3700,224,224,4,224,1002,223,8,223,1001,224,1,224,1,223,224,223,1102,89,18,225,1002,14,72,224,1001,224,-3096,224,4,224,102,8,223,223,101,5,224,224,1,223,224,223,1101,34,53,225,1102,54,10,225,1,113,61,224,101,-39,224,224,4,224,102,8,223,223,101,2,224,224,1,223,224,223,1101,31,61,224,101,-92,224,224,4,224,102,8,223,223,1001,224,4,224,1,223,224,223,1102,75,18,225,102,48,87,224,101,-4272,224,224,4,224,102,8,223,223,1001,224,7,224,1,224,223,223,1101,23,92,225,2,165,218,224,101,-3675,224,224,4,224,1002,223,8,223,101,1,224,224,1,223,224,223,1102,8,49,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,226,226,224,1002,223,2,223,1005,224,329,1001,223,1,223,1007,677,226,224,1002,223,2,223,1006,224,344,1001,223,1,223,108,677,226,224,102,2,223,223,1006,224,359,1001,223,1,223,7,226,226,224,1002,223,2,223,1005,224,374,101,1,223,223,107,677,677,224,1002,223,2,223,1006,224,389,1001,223,1,223,1007,677,677,224,1002,223,2,223,1006,224,404,1001,223,1,223,1107,677,226,224,1002,223,2,223,1005,224,419,1001,223,1,223,108,226,226,224,102,2,223,223,1006,224,434,1001,223,1,223,1108,226,677,224,1002,223,2,223,1006,224,449,1001,223,1,223,1108,677,226,224,102,2,223,223,1005,224,464,1001,223,1,223,107,226,226,224,102,2,223,223,1006,224,479,1001,223,1,223,1008,226,226,224,102,2,223,223,1005,224,494,101,1,223,223,7,677,226,224,1002,223,2,223,1005,224,509,101,1,223,223,8,226,677,224,1002,223,2,223,1006,224,524,1001,223,1,223,1007,226,226,224,1002,223,2,223,1006,224,539,101,1,223,223,1008,677,677,224,1002,223,2,223,1006,224,554,101,1,223,223,1108,677,677,224,102,2,223,223,1006,224,569,101,1,223,223,1107,226,677,224,102,2,223,223,1005,224,584,1001,223,1,223,8,677,226,224,1002,223,2,223,1006,224,599,101,1,223,223,1008,677,226,224,102,2,223,223,1006,224,614,1001,223,1,223,7,226,677,224,1002,223,2,223,1005,224,629,101,1,223,223,107,226,677,224,102,2,223,223,1005,224,644,101,1,223,223,8,677,677,224,102,2,223,223,1005,224,659,1001,223,1,223,108,677,677,224,1002,223,2,223,1005,224,674,101,1,223,223,4,223,99,226 \ No newline at end of file diff --git a/2019/day-5/python/main.py b/2019/day-5/python/main.py new file mode 100644 index 0000000..9f4d29d --- /dev/null +++ b/2019/day-5/python/main.py @@ -0,0 +1,60 @@ +import os +import sys + +PATH = os.path.join(sys.path[0], '..', 'input') +memory = list(open(PATH, 'r').read().split(',')) + +def getParams(pos, opcode, type1, type2, type3): + params = [] + if opcode in ['03', '04']: + params.append(memory[pos + 1]) + # if type1 == '0': + # params[-1] = memory[int(params[-1])] + elif opcode in ['01', '02']: + params.append(memory[pos + 1]) + if type1 == '0': + params[-1] = memory[int(params[-1])] + params.append(memory[pos + 2]) + if type2 == '0': + params[-1] = memory[int(params[-1])] + params.append(memory[pos + 3]) + # if type3 == '0': + # params[-1] = memory[int(params[-1])] + # print(memory[pos:pos+4]) + elif opcode in ['99']: + pass + return params + +inputs = [1] +pos = 0 + +while pos < len(memory) - 4: + if len(memory[pos]) < 5: + memory[pos] = ('0' * (5 - len(memory[pos]))) + memory[pos] + opcode = memory[pos][-2:] + + type1 = memory[pos][-3] + type2 = memory[pos][-4] + type3 = memory[pos][-5] + + params = getParams(pos, opcode, type1, type2, type3) + if opcode == '01': + memory[int(params[2])] = str(int(params[0]) + int(params[1])) + pos += 4 + elif opcode == '02': + memory[int(params[2])] = str(int(params[0]) * int(params[1])) + pos += 4 + elif opcode == '03': + memory[int(params[0])] = str(inputs.pop(0)) + pos += 2 + elif opcode == '04': + print(f'OUTPUT: {params[0]}') + pos += 2 + elif opcode == '99': + print('PROGRAM BREAK') + pos += 1 + break + else: + print(f'Unknown Opcode "{opcode}"') + break + print(f'#{pos // 4} {type3}{type2}{type1}{opcode} {params}') \ No newline at end of file