22_rng.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/env python3
  2. import sys
  3. from itertools import chain, islice, pairwise
  4. def permute(num):
  5. num = (num ^ num << 6) & 0xffffff
  6. num ^= num >> 5
  7. return (num ^ num << 11) & 0xffffff
  8. def prices(num):
  9. while True:
  10. yield num % 10
  11. num = permute(num)
  12. def window(seq, n):
  13. win = tuple(islice(seq, n))
  14. yield win
  15. for elem in seq:
  16. win = win[1:] + (elem,)
  17. yield win
  18. def sequence_prices(num):
  19. seen = {}
  20. for nums in window(islice(prices(num), 2001), 5):
  21. diffs = tuple(b - a for a, b in pairwise(nums))
  22. seen.setdefault(diffs, nums[-1])
  23. return seen
  24. def max_prices(initials):
  25. combined = {}
  26. for num in initials:
  27. for diffs, price in sequence_prices(num).items():
  28. combined[diffs] = combined.get(diffs, 0) + price
  29. return max(combined.values())
  30. def nth(num, n):
  31. for _ in range(n):
  32. num = permute(num)
  33. return num
  34. initials = list(map(int, sys.stdin))
  35. print(sum(nth(num, 2000) for num in initials))
  36. print(max_prices(initials))