diff options
| author | Gustav Sörnäs <gusso230@student.liu.se> | 2019-12-07 20:23:53 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gusso230@student.liu.se> | 2019-12-07 20:23:53 +0100 |
| commit | 827368492d9f3c3ecb13cc967e2fd9e41bb03d06 (patch) | |
| tree | f39a0e6fb4702ba6949a2d63597323b296c33c9a | |
| parent | 07a417614ea826ecf989359d5a69b24895b63462 (diff) | |
| download | aoc-827368492d9f3c3ecb13cc967e2fd9e41bb03d06.tar.gz | |
Day 7 py
| -rw-r--r-- | solutions/input/07 | 1 | ||||
| -rw-r--r-- | solutions/input/07-test2-1 | 1 | ||||
| -rw-r--r-- | solutions/input/07-test2-2 | 1 | ||||
| -rw-r--r-- | solutions/py/07.py | 133 |
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)") |
