summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gusso230@student.liu.se>2019-12-07 20:23:53 +0100
committerGustav Sörnäs <gusso230@student.liu.se>2019-12-07 20:23:53 +0100
commit827368492d9f3c3ecb13cc967e2fd9e41bb03d06 (patch)
treef39a0e6fb4702ba6949a2d63597323b296c33c9a
parent07a417614ea826ecf989359d5a69b24895b63462 (diff)
downloadaoc-827368492d9f3c3ecb13cc967e2fd9e41bb03d06.tar.gz
Day 7 py
-rw-r--r--solutions/input/071
-rw-r--r--solutions/input/07-test2-11
-rw-r--r--solutions/input/07-test2-21
-rw-r--r--solutions/py/07.py133
4 files changed, 136 insertions, 0 deletions
diff --git a/solutions/input/07 b/solutions/input/07
new file mode 100644
index 0000000..016f35f
--- /dev/null
+++ b/solutions/input/07
@@ -0,0 +1 @@
+3,8,1001,8,10,8,105,1,0,0,21,30,55,80,101,118,199,280,361,442,99999,3,9,101,4,9,9,4,9,99,3,9,101,4,9,9,1002,9,4,9,101,4,9,9,1002,9,5,9,1001,9,2,9,4,9,99,3,9,101,5,9,9,1002,9,2,9,101,3,9,9,102,4,9,9,1001,9,2,9,4,9,99,3,9,102,2,9,9,101,5,9,9,102,3,9,9,101,3,9,9,4,9,99,3,9,1001,9,2,9,102,4,9,9,1001,9,3,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,99,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,99
diff --git a/solutions/input/07-test2-1 b/solutions/input/07-test2-1
new file mode 100644
index 0000000..ad78133
--- /dev/null
+++ b/solutions/input/07-test2-1
@@ -0,0 +1 @@
+3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5
diff --git a/solutions/input/07-test2-2 b/solutions/input/07-test2-2
new file mode 100644
index 0000000..cd43fb9
--- /dev/null
+++ b/solutions/input/07-test2-2
@@ -0,0 +1 @@
+3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10
diff --git a/solutions/py/07.py b/solutions/py/07.py
new file mode 100644
index 0000000..2fffe3f
--- /dev/null
+++ b/solutions/py/07.py
@@ -0,0 +1,133 @@
+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 pt2(program):
+ highest_signal = 0
+ highest_sequence = None
+ for phase_seq in list(itertools.permutations(list(range(5,10)))):
+ signal = 0
+ q = queue.Queue(5)
+ for phase in phase_seq:
+ q.put(phase)
+ amps = [Computer(program) for i in range(5)]
+ for amp in amps:
+ amp.input = q.get()
+
+ signal = 0
+ current_amp = 0
+ while True:
+ amp = amps[current_amp]
+ amp.step()
+ if amp.input == None:
+ if amp.phase_read == False:
+ amp.phase_read = True
+ amp.input = signal
+ else:
+ pass
+ if amp.output is not None:
+ signal = amp.output
+ amp.output = None
+ current_amp = (current_amp + 1) % 5
+ if amps[current_amp].phase_read == True:
+ amps[current_amp].input = signal
+ continue
+ if amp.memory[amp.pointer] == 99:
+ if current_amp == 4:
+ break
+ current_amp = (current_amp + 1) % 5
+ amps[current_amp].input = signal
+ continue
+ if signal > highest_signal:
+ highest_signal = signal
+ highest_sequence = phase_seq
+ return highest_signal
+
+if __name__ == "__main__":
+ f = open("../input/07", "r")
+ program = [int(x) for x in f.readline().split(",")]
+
+ import cProfile
+ import timeit
+
+ print(pt2(program))
+ print(timeit.timeit('pt2(program)', globals=globals(), number=1)*1000, "ms")
+ cProfile.run("pt2(program)")