summaryrefslogtreecommitdiffstats
path: root/solutions/py
diff options
context:
space:
mode:
authorGustav Sörnäs <gusso230@student.liu.se>2019-12-11 06:51:34 +0100
committerGustav Sörnäs <gusso230@student.liu.se>2019-12-11 06:51:34 +0100
commit7afab1ad3892084ee079fe5ef45edc7fb452af06 (patch)
tree8cf741296ed87740cd748df83266aacac4b4fe7e /solutions/py
parent9fbcd849e973ef231d62cf76da0fdc9858b74def (diff)
downloadaoc-7afab1ad3892084ee079fe5ef45edc7fb452af06.tar.gz
Day 11 py
I found a bug in my intcode-implementation which day 9 didn't catch. To solve it, I switched the memory from my past hybrid solution (initial memory as a list and extra memory as a dict) to a 100% dict-solution. I am not entirely sure why it didn't work before since Computer.write() checks if the write-position is outside the length, unless it got a negative address. It seems like dict is slower than list for memory so I might try to re-implement lists for (initial) memory later.
Diffstat (limited to 'solutions/py')
-rw-r--r--solutions/py/d11.py79
-rw-r--r--solutions/py/intcode.py15
2 files changed, 84 insertions, 10 deletions
diff --git a/solutions/py/d11.py b/solutions/py/d11.py
new file mode 100644
index 0000000..88d942f
--- /dev/null
+++ b/solutions/py/d11.py
@@ -0,0 +1,79 @@
+import intcode
+import time
+
+_input = open("../input/11","r").readlines()
+
+program = [int(x) for x in _input[0].split(",")]
+x, y = 0, 0
+direction = 0
+# 0 is up
+# 1 is left
+# 2 is down
+# 3 is right
+# 4 is up (again)
+# turning left is direction += 1
+# turning right is direction -= 1
+# direction is direction % 4
+painted = 0
+colors = {(0,0): 1} # (x,y): 1/0 (1 = white, 0 = black)
+
+got_color = False
+
+def draw(colors, ship, direction):
+ min_x, max_x, min_y, max_y = 0, 0, 0, 0
+ ship_c = ""
+ if direction == 0:
+ ship_c = "^"
+ elif direction == 1:
+ ship_c = "<"
+ elif direction == 2:
+ ship_c = "v"
+ elif direction == 3:
+ ship_c = ">"
+ for color in colors:
+ min_x = min(min_x, color[0])
+ max_x = max(max_x, color[0])
+ min_y = min(min_y, color[1])
+ max_y = max(max_y, color[1])
+ for y in range(min_y-5, max_y+5):
+ for x in range(min_x-5, max_x+5):
+ if (x,y) == ship:
+ print(ship_c, end="")
+ elif (x,y) in colors:
+ c = colors[(x,y)]
+ print("\u2588" if c == 1 else ".", end="")
+ else:
+ print(" ", end="")
+ print("")
+
+
+c = intcode.Computer(program)
+while c.memory[c.pointer] != 99:
+ # input
+ #print(x, y)
+ #draw(colors, (x,y), direction % 4)
+ #input()
+ #time.sleep(0.1)
+ c.input = colors.get((x, y), 0)
+ c.step()
+ if c.output is not None:
+ if not got_color:
+ colors[(x, y)] = c.output
+ c.output = None
+ got_color = True
+ elif got_color:
+ direction += (1 if c.output == 0 else -1)
+ dir = direction % 4
+ if dir == 0:
+ y -= 1
+ elif dir == 1:
+ x -= 1
+ elif dir == 2:
+ y += 1
+ elif dir == 3:
+ x += 1
+ got_color = False
+ c.output = None
+draw(colors, (0,0), 0)
+print(colors)
+print(len(colors))
diff --git a/solutions/py/intcode.py b/solutions/py/intcode.py
index 0f17962..aee72ee 100644
--- a/solutions/py/intcode.py
+++ b/solutions/py/intcode.py
@@ -13,8 +13,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.memory = {}
+ for i in range(len(program)):
+ self.memory[i] = program[i]
self.pointer = 0
self.phase_read = False # for day 7
self.relative_base = 0
@@ -35,16 +36,10 @@ class Computer(object):
self.output = None
def write(self, addr, val):
- if addr > self.memory_size:
- self.extra_mem[addr] = val
- else:
- self.memory[addr] = val
+ 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]
+ return self.memory.get(addr, 0)
def get_param(self, inst, num):
if inst[num] == 0: