summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gusso230@student.liu.se>2019-12-07 20:34:20 +0100
committerGustav Sörnäs <gusso230@student.liu.se>2019-12-07 20:34:20 +0100
commite81a7f7be01ff2cb89bdfd4c3c0136acfa00f050 (patch)
tree791bb3b670c4bca8a0ad7afebe8a19d1b27238e4
parent827368492d9f3c3ecb13cc967e2fd9e41bb03d06 (diff)
downloadaoc-e81a7f7be01ff2cb89bdfd4c3c0136acfa00f050.tar.gz
Day 5 py
-rw-r--r--solutions/input/051
-rw-r--r--solutions/py/05.py125
2 files changed, 122 insertions, 4 deletions
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))