| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- #!/usr/bin/env python3
- import sys
- from collections import deque
- from itertools import islice
- from intcode import read_program, run
- def deploy_drone(program, x, y):
- return next(run(program, [y, x].pop, 1000))
- def scan(program, w, 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 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 = read_program(sys.stdin)
- #print(sum(sum(row) for row in scan(program, 50, 50)))
- print(sum(min(r, 50) - l for l, r in islice(bounds(program), 50) if l < 50))
- # part 2
- bx, by = find_box(program, 100)
- print(bx * 10000 + by)
|