14_dish.py 933 B

1234567891011121314151617181920212223242526272829303132
  1. #!/usr/bin/env python3
  2. import sys
  3. import re
  4. def rotate(rocks):
  5. return tuple(''.join(rocks[y][x] for y in range(len(rocks) - 1, -1, -1))
  6. for x in range(len(rocks[0])))
  7. def roll(rocks):
  8. for row in rocks:
  9. subs = 1
  10. while subs:
  11. row, subs = re.subn(r'(\.+)(O+)', r'\2\1', row)
  12. yield row
  13. def load(rocks):
  14. return sum((len(rocks) - y) * row.count('O') for y, row in enumerate(rocks))
  15. def cycle(rocks, n):
  16. rocks = rotate(rotate(rotate(rocks)))
  17. seen = {rocks: 0}
  18. for i in range(1, n + 1):
  19. for _ in range(4):
  20. rocks = rotate(tuple(roll(rocks)))
  21. phase = i - seen.setdefault(rocks, i)
  22. if phase:
  23. return cycle(rotate(rocks), (n - i) % phase)
  24. return rotate(rocks)
  25. rocks = tuple(line.rstrip() for line in sys.stdin)
  26. print(load(rotate(tuple(roll(rotate(rotate(rotate(rocks))))))))
  27. print(load(cycle(rocks, 1000000000)))