From e81a7f7be01ff2cb89bdfd4c3c0136acfa00f050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Sat, 7 Dec 2019 20:34:20 +0100 Subject: Day 5 py --- solutions/input/05 | 1 + solutions/py/05.py | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 solutions/input/05 diff --git a/solutions/input/05 b/solutions/input/05 new file mode 100644 index 0000000..fe477a1 --- /dev/null +++ b/solutions/input/05 @@ -0,0 +1 @@ +3,225,1,225,6,6,1100,1,238,225,104,0,1002,114,46,224,1001,224,-736,224,4,224,1002,223,8,223,1001,224,3,224,1,223,224,223,1,166,195,224,1001,224,-137,224,4,224,102,8,223,223,101,5,224,224,1,223,224,223,1001,169,83,224,1001,224,-90,224,4,224,102,8,223,223,1001,224,2,224,1,224,223,223,101,44,117,224,101,-131,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,1101,80,17,225,1101,56,51,225,1101,78,89,225,1102,48,16,225,1101,87,78,225,1102,34,33,224,101,-1122,224,224,4,224,1002,223,8,223,101,7,224,224,1,223,224,223,1101,66,53,224,101,-119,224,224,4,224,102,8,223,223,1001,224,5,224,1,223,224,223,1102,51,49,225,1101,7,15,225,2,110,106,224,1001,224,-4539,224,4,224,102,8,223,223,101,3,224,224,1,223,224,223,1102,88,78,225,102,78,101,224,101,-6240,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,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,677,224,102,2,223,223,1006,224,329,101,1,223,223,1108,226,677,224,1002,223,2,223,1005,224,344,101,1,223,223,8,226,677,224,102,2,223,223,1006,224,359,1001,223,1,223,1007,226,677,224,1002,223,2,223,1005,224,374,101,1,223,223,1008,677,677,224,1002,223,2,223,1005,224,389,1001,223,1,223,1108,677,226,224,1002,223,2,223,1006,224,404,1001,223,1,223,1007,226,226,224,1002,223,2,223,1005,224,419,1001,223,1,223,1107,677,226,224,1002,223,2,223,1006,224,434,101,1,223,223,108,677,677,224,1002,223,2,223,1005,224,449,1001,223,1,223,1107,677,677,224,102,2,223,223,1005,224,464,1001,223,1,223,108,226,226,224,1002,223,2,223,1006,224,479,1001,223,1,223,1008,226,226,224,102,2,223,223,1005,224,494,101,1,223,223,108,677,226,224,102,2,223,223,1005,224,509,1001,223,1,223,8,677,226,224,1002,223,2,223,1006,224,524,101,1,223,223,7,226,677,224,1002,223,2,223,1006,224,539,101,1,223,223,7,677,226,224,102,2,223,223,1006,224,554,1001,223,1,223,7,226,226,224,1002,223,2,223,1006,224,569,101,1,223,223,107,677,677,224,102,2,223,223,1006,224,584,101,1,223,223,1108,677,677,224,102,2,223,223,1006,224,599,1001,223,1,223,1008,677,226,224,1002,223,2,223,1005,224,614,1001,223,1,223,8,677,677,224,1002,223,2,223,1006,224,629,1001,223,1,223,107,226,677,224,1002,223,2,223,1006,224,644,101,1,223,223,1007,677,677,224,102,2,223,223,1006,224,659,101,1,223,223,107,226,226,224,1002,223,2,223,1006,224,674,1001,223,1,223,4,223,99,226 diff --git a/solutions/py/05.py b/solutions/py/05.py index 28b2626..d2e3fb3 100644 --- a/solutions/py/05.py +++ b/solutions/py/05.py @@ -1,4 +1,121 @@ -''' -this code has been redacted due to ugliness -please check back later -''' +import itertools +import queue +import sys + +params = {1:3, 2:3, 3:1, 4:1, 5:2, 6:2, 7:3, 8:3, 99:0} +ADD = 1 +MULT = 2 +IN = 3 +OUT = 4 +JNZ = 5 +JEZ = 6 +LET = 7 +EQV = 8 +HAL = 99 + +class Computer(object): + def __init__(self, program): + self.memory = program.copy() + self.pointer = 0 + self.phase_read = False + + self.input = None + self.output = None + + def parse_op(self, op): + code = op % 100 + return [code] + [(op // 10**(i+2)) % 10**(i+1) for i in range(params[code])] + + def clear_flags(self): + self.input = None + self.output = None + + def get_param(self, inst, num): + return self.memory[self.pointer + num] if inst[num] == True else\ + self.memory[self.memory[self.pointer + num]] + + def step(self): + inst = self.parse_op(self.memory[self.pointer]) + if inst[0] == HAL: + return + elif inst[0] == ADD: + self.memory[self.memory[self.pointer+3]] = \ + self.get_param(inst, 1) + self.get_param(inst, 2) + self.pointer += 4 + elif inst[0] == MULT: + self.memory[self.memory[self.pointer+3]] = \ + self.get_param(inst, 1) * self.get_param(inst, 2) + self.pointer += 4 + elif inst[0] == IN: + self.memory[self.memory[self.pointer+1]] = self.input + self.input = None + self.pointer += 2 + elif inst[0] == OUT: + self.output = self.get_param(inst, 1) + self.pointer += 2 + elif inst[0] == JNZ: + if self.get_param(inst, 1) != 0: + self.pointer = self.get_param(inst, 2) + else: + self.pointer += 3 + elif inst[0] == JEZ: + if self.get_param(inst, 1) == 0: + self.pointer = self.get_param(inst, 2) + else: + self.pointer += 3 + elif inst[0] == LET: + self.memory[self.memory[self.pointer+3]] = 1 if \ + self.get_param(inst, 1) < self.get_param(inst, 2) \ + else 0 + self.pointer += 4 + elif inst[0] == EQV: + self.memory[self.memory[self.pointer+3]] = 1 if \ + self.get_param(inst, 1) == self.get_param(inst, 2) \ + else 0 + self.pointer += 4 + else: + print(self.memory) + print(self.pointer) + print("invalid instruction", self.memory[self.pointer]) + print(inst) + sys.exit() + +def pt1(program): + c = Computer(program) + c.input = 1 + output = [] + while c.memory[c.pointer] != 99: + c.step() + if c.output != None: + output.append(c.output) + c.output = None + return output + +def pt2(program): + c = Computer(program) + c.input = 5 + output = [] + while c.memory[c.pointer] != 99: + c.step() + if c.output != None: + output.append(c.output) + c.output = None + return output + +if __name__ == "__main__": + f = open("../input/05", "r") + program = [int(x) for x in f.readline().split(",")] + + import cProfile + import timeit + + print("PART 1") + print(timeit.timeit('pt1(program)', globals=globals(), number=1000), "ms") + cProfile.run("pt1(program)") + + print("PART 2") + print(timeit.timeit('pt2(program)', globals=globals(), number=1000), "ms") + cProfile.run("pt2(program)") + + print(1, pt1(program)) + print(2, pt2(program)) -- cgit v1.2.1