summaryrefslogtreecommitdiffstats
path: root/solutions
diff options
context:
space:
mode:
Diffstat (limited to 'solutions')
-rw-r--r--solutions/py/05.py83
-rw-r--r--solutions/py/07.py84
-rw-r--r--solutions/py/intcode.py77
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)