20_enhancement.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/env python3
  2. import sys
  3. def parse(f):
  4. yield [char == '#' for char in f.readline().rstrip()]
  5. f.readline()
  6. yield {(x, y) for y, line in enumerate(f)
  7. for x, char in enumerate(line) if char == '#'}
  8. def index(x, y, is_light):
  9. i = 0
  10. for ny in range(y - 1, y + 2):
  11. for nx in range(x - 1, x + 2):
  12. i = i << 1 | is_light(nx, ny)
  13. return i
  14. def enhance(light, algo, step):
  15. xmin = min(x for x, y in light)
  16. xmax = max(x for x, y in light)
  17. ymin = min(y for x, y in light)
  18. ymax = max(y for x, y in light)
  19. def is_light(x, y):
  20. if algo[0] and not (xmin <= x <= xmax and ymin <= y <= ymax):
  21. return step % 2
  22. return (x, y) in light
  23. return {(x, y) for y in range(ymin - 1, ymax + 2)
  24. for x in range(xmin - 1, xmax + 2)
  25. if algo[index(x, y, is_light)]}
  26. def enhance_times(light, algo, times):
  27. for step in range(times):
  28. light = enhance(light, algo, step)
  29. return light
  30. algo, light = parse(sys.stdin)
  31. print(len(enhance_times(light, algo, 2)))
  32. print(len(enhance_times(light, algo, 50)))