| 1234567891011121314151617181920212223242526272829303132 |
- #!/usr/bin/env python3
- import sys
- import re
- def rotate(rocks):
- return tuple(''.join(rocks[y][x] for y in range(len(rocks) - 1, -1, -1))
- for x in range(len(rocks[0])))
- def roll(rocks):
- for row in rocks:
- subs = 1
- while subs:
- row, subs = re.subn(r'(\.+)(O+)', r'\2\1', row)
- yield row
- def load(rocks):
- return sum((len(rocks) - y) * row.count('O') for y, row in enumerate(rocks))
- def cycle(rocks, n):
- rocks = rotate(rotate(rotate(rocks)))
- seen = {rocks: 0}
- for i in range(1, n + 1):
- for _ in range(4):
- rocks = rotate(tuple(roll(rocks)))
- phase = i - seen.setdefault(rocks, i)
- if phase:
- return cycle(rotate(rocks), (n - i) % phase)
- return rotate(rocks)
- rocks = tuple(line.rstrip() for line in sys.stdin)
- print(load(rotate(tuple(roll(rotate(rotate(rotate(rocks))))))))
- print(load(cycle(rocks, 1000000000)))
|