summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gusso230@student.liu.se>2019-12-09 07:26:56 +0100
committerGustav Sörnäs <gusso230@student.liu.se>2019-12-09 09:19:31 +0100
commitf79931b49d78b4a1cd9189a3d14dfc426be8f545 (patch)
tree3cc01026b28e2e13cc4d5fae7afd6a3b43ab80cb
parenteb9c3d11134a32323454e36487b0bd67b2fc090c (diff)
downloadaoc-f79931b49d78b4a1cd9189a3d14dfc426be8f545.tar.gz
Day 9 py
-rw-r--r--solutions/input/091
-rw-r--r--solutions/py/d09.py13
-rw-r--r--solutions/py/intcode.py62
3 files changed, 62 insertions, 14 deletions
diff --git a/solutions/input/09 b/solutions/input/09
new file mode 100644
index 0000000..27b47ee
--- /dev/null
+++ b/solutions/input/09
@@ -0,0 +1 @@
+1102,34463338,34463338,63,1007,63,34463338,63,1005,63,53,1101,0,3,1000,109,988,209,12,9,1000,209,6,209,3,203,0,1008,1000,1,63,1005,63,65,1008,1000,2,63,1005,63,904,1008,1000,0,63,1005,63,58,4,25,104,0,99,4,0,104,0,99,4,17,104,0,99,0,0,1101,0,252,1023,1101,0,0,1020,1102,1,39,1013,1102,1,234,1029,1102,26,1,1016,1101,37,0,1005,1101,0,27,1011,1101,21,0,1000,1101,0,29,1019,1101,35,0,1003,1102,22,1,1007,1102,1,32,1001,1101,1,0,1021,1102,1,216,1027,1102,30,1,1012,1102,1,24,1009,1101,36,0,1002,1101,0,31,1010,1101,0,243,1028,1102,787,1,1024,1102,255,1,1022,1102,33,1,1017,1102,1,23,1004,1102,778,1,1025,1102,1,28,1008,1101,0,223,1026,1102,1,25,1015,1101,0,20,1006,1102,34,1,1014,1101,38,0,1018,109,-4,1202,5,1,63,1008,63,32,63,1005,63,203,4,187,1106,0,207,1001,64,1,64,1002,64,2,64,109,37,2106,0,-6,1001,64,1,64,1106,0,225,4,213,1002,64,2,64,109,3,2106,0,-8,4,231,1001,64,1,64,1105,1,243,1002,64,2,64,109,-12,2105,1,-1,1105,1,261,4,249,1001,64,1,64,1002,64,2,64,109,-13,2102,1,-3,63,1008,63,31,63,1005,63,285,1001,64,1,64,1106,0,287,4,267,1002,64,2,64,109,6,21102,40,1,0,1008,1017,40,63,1005,63,313,4,293,1001,64,1,64,1105,1,313,1002,64,2,64,109,-10,2107,31,-6,63,1005,63,331,4,319,1105,1,335,1001,64,1,64,1002,64,2,64,109,-6,2102,1,7,63,1008,63,28,63,1005,63,357,4,341,1105,1,361,1001,64,1,64,1002,64,2,64,109,2,21107,41,40,8,1005,1011,377,1106,0,383,4,367,1001,64,1,64,1002,64,2,64,109,-1,1201,2,0,63,1008,63,26,63,1005,63,403,1106,0,409,4,389,1001,64,1,64,1002,64,2,64,109,22,1205,-4,425,1001,64,1,64,1105,1,427,4,415,1002,64,2,64,109,-9,21101,42,0,3,1008,1018,39,63,1005,63,451,1001,64,1,64,1105,1,453,4,433,1002,64,2,64,109,3,21107,43,44,0,1005,1018,475,4,459,1001,64,1,64,1105,1,475,1002,64,2,64,109,-7,21101,44,0,0,1008,1011,44,63,1005,63,497,4,481,1105,1,501,1001,64,1,64,1002,64,2,64,109,17,1206,-7,513,1105,1,519,4,507,1001,64,1,64,1002,64,2,64,109,-24,1207,5,25,63,1005,63,537,4,525,1105,1,541,1001,64,1,64,1002,64,2,64,109,7,21108,45,43,2,1005,1013,557,1106,0,563,4,547,1001,64,1,64,1002,64,2,64,109,-5,1207,-3,34,63,1005,63,583,1001,64,1,64,1106,0,585,4,569,1002,64,2,64,109,5,21108,46,46,5,1005,1016,607,4,591,1001,64,1,64,1105,1,607,1002,64,2,64,109,-12,2108,20,8,63,1005,63,627,1001,64,1,64,1105,1,629,4,613,1002,64,2,64,109,24,1206,-3,647,4,635,1001,64,1,64,1105,1,647,1002,64,2,64,109,-30,2108,32,8,63,1005,63,665,4,653,1106,0,669,1001,64,1,64,1002,64,2,64,109,22,1208,-9,20,63,1005,63,691,4,675,1001,64,1,64,1106,0,691,1002,64,2,64,109,-4,21102,47,1,3,1008,1014,49,63,1005,63,715,1001,64,1,64,1105,1,717,4,697,1002,64,2,64,109,-10,2101,0,1,63,1008,63,36,63,1005,63,743,4,723,1001,64,1,64,1105,1,743,1002,64,2,64,109,16,1201,-9,0,63,1008,63,28,63,1005,63,769,4,749,1001,64,1,64,1105,1,769,1002,64,2,64,109,2,2105,1,5,4,775,1001,64,1,64,1106,0,787,1002,64,2,64,109,-5,1202,-6,1,63,1008,63,26,63,1005,63,807,1106,0,813,4,793,1001,64,1,64,1002,64,2,64,109,-16,2107,37,4,63,1005,63,833,1001,64,1,64,1105,1,835,4,819,1002,64,2,64,109,2,2101,0,1,63,1008,63,34,63,1005,63,855,1105,1,861,4,841,1001,64,1,64,1002,64,2,64,109,19,1205,2,875,4,867,1105,1,879,1001,64,1,64,1002,64,2,64,109,-2,1208,-8,23,63,1005,63,899,1001,64,1,64,1106,0,901,4,885,4,64,99,21101,0,27,1,21102,915,1,0,1106,0,922,21201,1,61455,1,204,1,99,109,3,1207,-2,3,63,1005,63,964,21201,-2,-1,1,21102,942,1,0,1105,1,922,22102,1,1,-1,21201,-2,-3,1,21102,1,957,0,1105,1,922,22201,1,-1,-2,1106,0,968,22101,0,-2,-2,109,-3,2105,1,0
diff --git a/solutions/py/d09.py b/solutions/py/d09.py
new file mode 100644
index 0000000..5a8f132
--- /dev/null
+++ b/solutions/py/d09.py
@@ -0,0 +1,13 @@
+import intcode
+
+input = open("../input/09", "r").readlines()[0]
+
+program = [int(x) for x in input.split(",")]
+c = intcode.Computer(program)
+c.input = 2
+while c.memory[c.pointer] != 99:
+ c.step()
+ #print(c.relative_base, c.pointer, c.memory)
+ if c.output is not None:
+ print(c.output)
+ c.output = None
diff --git a/solutions/py/intcode.py b/solutions/py/intcode.py
index f83a7ef..0f17962 100644
--- a/solutions/py/intcode.py
+++ b/solutions/py/intcode.py
@@ -1,4 +1,4 @@
-params = {1:3, 2:3, 3:1, 4:1, 5:2, 6:2, 7:3, 8:3, 99:0}
+param_amount = {1:3, 2:3, 3:1, 4:1, 5:2, 6:2, 7:3, 8:3, 9:1, 99:0}
ADD = 1
MULT = 2
@@ -8,43 +8,74 @@ JNZ = 5
JEZ = 6
LET = 7
EQV = 8
+BAS = 9
HAL = 99
class Computer(object):
def __init__(self, program):
self.memory = program.copy()
+ self.memory_size = len(self.memory) # pointers greater than this go in extra memory
self.pointer = 0
- self.phase_read = False
+ self.phase_read = False # for day 7
+ self.relative_base = 0
+ self.extra_mem = {}
self.input = None
self.output = None
def parse_op(self, op):
+ #TODO
code = op % 100
- return [code] + [(op // 10**(i+2)) % 10**(i+1) for i in range(params[code])]
+ ops = str(op).zfill(param_amount[code]+2)
+ return [code] + [int(x) for x in ops[:-2][::-1]]
+ #return [code] + [(op // 10**(i+2)) % 10**(i+1) for i in range(param_amount[code])]
def clear_flags(self):
self.input = None
self.output = None
+ def write(self, addr, val):
+ if addr > self.memory_size:
+ self.extra_mem[addr] = val
+ else:
+ self.memory[addr] = val
+
+ def get(self, addr):
+ if addr > self.memory_size:
+ return self.extra_mem[addr] if addr in self.extra_mem else 0
+ else:
+ return self.memory[addr]
+
def get_param(self, inst, num):
- return self.memory[self.pointer + num] if inst[num] == True else\
- self.memory[self.memory[self.pointer + num]]
+ if inst[num] == 0:
+ return self.get(self.get(self.pointer + num))
+ elif inst[num] == 1:
+ return self.get(self.pointer + num)
+ elif inst[num] == 2:
+ return self.get(self.relative_base + self.get(self.pointer + num))
+
+ def write_param(self, inst, num, val):
+ if inst[num] == 0:
+ self.write(self.get(self.pointer + num), val)
+ elif inst[num] == 1:
+ self.write(self.pointer + num, val)
+ elif inst[num] == 2:
+ self.write(self.relative_base + self.get(self.pointer + num), val)
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.write_param(inst, 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.write_param(inst, 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.write_param(inst, 1, self.input)
self.input = None
self.pointer += 2
elif inst[0] == OUT:
@@ -61,15 +92,18 @@ class Computer(object):
else:
self.pointer += 3
elif inst[0] == LET:
- self.memory[self.memory[self.pointer+3]] = 1 if \
+ self.write_param(inst, 3, 1 if \
self.get_param(inst, 1) < self.get_param(inst, 2) \
- else 0
+ else 0)
self.pointer += 4
elif inst[0] == EQV:
- self.memory[self.memory[self.pointer+3]] = 1 if \
+ self.write_param(inst, 3, 1 if \
self.get_param(inst, 1) == self.get_param(inst, 2) \
- else 0
+ else 0)
self.pointer += 4
+ elif inst[0] == BAS:
+ self.relative_base += self.get_param(inst, 1)
+ self.pointer += 2
else:
print(self.memory)
print(self.pointer)