ソースを参照

Solve 2019 day 19

Taddeus Kroes 6 年 前
コミット
3202b92ba0
1 ファイル変更32 行追加7 行削除
  1. 32 7
      2019/19_beam.py

+ 32 - 7
2019/19_beam.py

@@ -1,5 +1,6 @@
 #!/usr/bin/env python3
 import sys
+from collections import deque
 from operator import add, mul, lt, eq
 
 def run(p, get_input, memsize=0):
@@ -38,16 +39,40 @@ def run(p, get_input, memsize=0):
             relbase += pload(1)
             pc += 2
 
+def deploy_drone(program, x, y):
+    return next(run(program, [y, x].pop, 1000))
+
 def scan(program, w, h):
-    def deploy_drone(x, y):
-        return next(run(program, [y, x].pop, 1000))
-    return [[deploy_drone(x, y) for x in range(w)] for y in range(h)]
+    return [[deploy_drone(program, x, y) for x in range(w)] for y in range(h)]
+
+def bounds(program):
+    left = 0
+    right = 1
+    y = 0
+    while True:
+        yield left, right
+        y += 1
+        left += 1
+        while not deploy_drone(program, left, y):
+            left += 1
+        right += 1
+        while deploy_drone(program, right, y):
+            right += 1
 
-def draw(grid):
-    for row in grid:
-        print(''.join('.#O'[x] for x in row))
+def find_box(program, size):
+    buf = deque([], size - 1)
+    for y2, (left2, right2) in enumerate(bounds(program)):
+        if len(buf) == size - 1:
+            y1, left1, right1 = buf.popleft()
+            if right1 - left2 >= size:
+                return left2, y1
+        buf.append((y2, left2, right2))
 
+# part 1
 program = list(map(int, sys.stdin.readline().split(',')))
 grid = scan(program, 50, 50)
-draw(grid)
 print(sum(sum(row) for row in grid))
+
+# part 2
+bx, by = find_box(program, 100)
+print(bx * 10000 + by)