diff options
Diffstat (limited to '19/py/d11.py')
| -rw-r--r-- | 19/py/d11.py | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/19/py/d11.py b/19/py/d11.py new file mode 100644 index 0000000..e9b280c --- /dev/null +++ b/19/py/d11.py @@ -0,0 +1,165 @@ +import intcode +import time + + +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]) + s = "" + for y in range(min_y, max_y+1): + s += "\n" + for x in range(min_x, max_x+1): + if (x,y) == ship: + s += ship_c + elif (x,y) in colors: + c = colors[(x,y)] + s += "\u2588" if c == 1 else " " + else: + s += "." + return s + +def pt1(input): + program = [int(x) for x in input[0].split(",")] + x=y = 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 + colors = {} # (x,y): 1/0 (1 = white, 0 = black) + + got_color = False + 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 + return len(colors) + +def pt2(input): + program = [int(x) for x in input[0].split(",")] + x=y = 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 + colors = {(0,0): 1} # (x,y): 1/0 (1 = white, 0 = black) + + got_color = False + c = intcode.Computer(program) + while c.memory[c.pointer] != 99: + 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 + return draw(colors, (0,0), 0) + +def visualize(input): + program = [int(x) for x in input[0].split(",")] + x=y = 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 + colors = {(0,0): 1} # (x,y): 1/0 (1 = white, 0 = black) + + got_color = False + c = intcode.Computer(program) + while c.memory[c.pointer] != 99: + time.sleep(0.002) + print(draw(colors, (x,y), direction % 4)) + 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 + +if __name__ == "__main__": + import cProfile + + input = open("../input/11", "r").readlines() + cProfile.run("pt1(input)") + cProfile.run("pt2(input)") + print(pt1(input)) + print(pt2(input)) + visualize(input) |
