Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

51 linhas
1.3KB

  1. def parse(string):
  2. return {
  3. complex(x, y): val
  4. for y, row in enumerate(string.splitlines())
  5. for x, val in enumerate(row)
  6. }
  7. def render(grid):
  8. xmin, *_, xmax = sorted({int(p.real) for p in grid})
  9. ymin, *_, ymax = sorted({int(p.imag) for p in grid})
  10. for y in range(ymin, ymax + 1):
  11. for x in range(xmin, xmax + 1):
  12. print(grid[complex(x, y)], end='')
  13. print()
  14. def rotate(grid, angle):
  15. swaps_ongoing = 1
  16. while swaps_ongoing:
  17. swaps_ongoing = 0
  18. for pos, val in grid.items():
  19. if val == 'O':
  20. while grid.get(pos + angle) == '.':
  21. pos, old = pos + angle, pos
  22. grid[pos], grid[old] = val, '.'
  23. swaps_ongoing += 1
  24. return grid
  25. def calc_load(state):
  26. return int(sum(height - p.imag + 1 for p, val in state.items() if val == 'O'))
  27. text = open(0).read()
  28. grid = parse(text)
  29. height = max(p.imag for p in grid)
  30. print(calc_load(rotate(grid, -1j)))
  31. seq = []
  32. while True:
  33. signature = frozenset(grid.items())
  34. if signature in seq:
  35. break
  36. seq.append(signature)
  37. for angle in [-1j, -1, 1j, 1]:
  38. grid = rotate(grid, angle)
  39. prelude = seq.index(signature)
  40. cycle_length = len(seq) - prelude
  41. print(calc_load(dict(seq[prelude + (1_000_000_000 - prelude) % cycle_length])))