diff options
| -rw-r--r-- | solutions/py/05.py | 83 | ||||
| -rw-r--r-- | solutions/py/07.py | 84 | ||||
| -rw-r--r-- | solutions/py/intcode.py | 77 |
3 files changed, 83 insertions, 161 deletions
diff --git a/solutions/py/05.py b/solutions/py/05.py index d2e3fb3..e9eb6c1 100644 --- a/solutions/py/05.py +++ b/solutions/py/05.py @@ -1,87 +1,10 @@ +import intcode 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 = intcode.Computer(program) c.input = 1 output = [] while c.memory[c.pointer] != 99: @@ -92,7 +15,7 @@ def pt1(program): return output def pt2(program): - c = Computer(program) + c = intcode.Computer(program) c.input = 5 output = [] while c.memory[c.pointer] != 99: diff --git a/solutions/py/07.py b/solutions/py/07.py index 2fffe3f..18c3b89 100644 --- a/solutions/py/07.py +++ b/solutions/py/07.py @@ -1,84 +1,6 @@ +import intcode 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 @@ -88,7 +10,7 @@ def pt2(program): q = queue.Queue(5) for phase in phase_seq: q.put(phase) - amps = [Computer(program) for i in range(5)] + amps = [intcode.Computer(program) for i in range(5)] for amp in amps: amp.input = q.get() @@ -128,6 +50,6 @@ if __name__ == "__main__": import cProfile import timeit - print(pt2(program)) + print(2, pt2(program)) print(timeit.timeit('pt2(program)', globals=globals(), number=1)*1000, "ms") cProfile.run("pt2(program)") diff --git a/solutions/py/intcode.py b/solutions/py/intcode.py new file mode 100644 index 0000000..f83a7ef --- /dev/null +++ b/solutions/py/intcode.py @@ -0,0 +1,77 @@ +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) |
