19_beam.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/env python3
  2. import sys
  3. from collections import deque
  4. from itertools import islice
  5. from intcode import read_program, run
  6. def deploy_drone(program, x, y):
  7. return next(run(program, [y, x].pop, 1000))
  8. def scan(program, w, h):
  9. return [[deploy_drone(program, x, y) for x in range(w)] for y in range(h)]
  10. def bounds(program):
  11. left = 0
  12. right = 1
  13. y = 0
  14. while True:
  15. yield left, right
  16. y += 1
  17. left += 1
  18. while not deploy_drone(program, left, y):
  19. left += 1
  20. right += 1
  21. while deploy_drone(program, right, y):
  22. right += 1
  23. def find_box(program, size):
  24. buf = deque([], size - 1)
  25. for y2, (left2, right2) in enumerate(bounds(program)):
  26. if len(buf) == size - 1:
  27. y1, left1, right1 = buf.popleft()
  28. if right1 - left2 >= size:
  29. return left2, y1
  30. buf.append((y2, left2, right2))
  31. # part 1
  32. program = read_program(sys.stdin)
  33. #print(sum(sum(row) for row in scan(program, 50, 50)))
  34. print(sum(min(r, 50) - l for l, r in islice(bounds(program), 50) if l < 50))
  35. # part 2
  36. bx, by = find_box(program, 100)
  37. print(bx * 10000 + by)