11_seats.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/env python3
  2. import sys
  3. FLOOR, EMPTY, OCCUPIED = '.L#'
  4. def parse(f):
  5. grid = f.read().rstrip()
  6. return grid.replace('\n', ''), grid.find('\n')
  7. def evolve(state, w, tolerance, see_far):
  8. h = len(state) // w
  9. def see_occupied(x, y, dx, dy):
  10. x += dx
  11. y += dy
  12. if x < 0 or x >= w or y < 0 or y >= h:
  13. return False
  14. seat = state[y * w + x]
  15. if seat != FLOOR:
  16. return seat == OCCUPIED
  17. return see_far and see_occupied(x, y, dx, dy)
  18. def occupied_nb(i):
  19. y, x = divmod(i, w)
  20. return sum(see_occupied(x, y, dx, dy)
  21. for dx in (-1, 0, 1) for dy in (-1, 0, 1) if dx or dy)
  22. for i, seat in enumerate(state):
  23. if seat == EMPTY and occupied_nb(i) == 0:
  24. yield OCCUPIED
  25. elif seat == OCCUPIED and occupied_nb(i) >= tolerance:
  26. yield EMPTY
  27. else:
  28. yield seat
  29. def stabilize(state, *args):
  30. prev = None
  31. while state != prev:
  32. prev = state
  33. state = ''.join(evolve(state, *args))
  34. return state
  35. state, w = parse(sys.stdin)
  36. print(stabilize(state, w, 4, False).count(OCCUPIED))
  37. print(stabilize(state, w, 5, True).count(OCCUPIED))