11_paintrobot.py 1004 B

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/env python3
  2. import sys
  3. from intcode import read_program, run_getter
  4. def paint(firmware, color):
  5. robot = run_getter(firmware, lambda: color)
  6. painted = set()
  7. white = set()
  8. x = y = 0
  9. dx, dy = 0, -1
  10. for make_white in robot:
  11. painted.add((x, y))
  12. (white.add if make_white else white.discard)((x, y))
  13. dx, dy = (-dy, dx) if next(robot) else (dy, -dx)
  14. x += dx
  15. y += dy
  16. color = int((x, y) in white)
  17. return white, len(painted)
  18. def draw(coords):
  19. xmin = min(x for x, y in coords)
  20. xmax = max(x for x, y in coords)
  21. ymin = min(y for x, y in coords)
  22. ymax = max(y for x, y in coords)
  23. grid = [[0] * (xmax - xmin + 1) for y in range(ymin, ymax + 1)]
  24. for x, y in coords:
  25. grid[y - ymin][x - xmin] = 1
  26. for row in grid:
  27. print(''.join(' @'[c] for c in row))
  28. firmware = read_program(sys.stdin)
  29. white, npainted = paint(firmware, 0)
  30. print(npainted)
  31. white, npainted = paint(firmware, 1)
  32. draw(white)