22_rng.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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. all_seq_prices = list(map(sequence_prices, initials))
  26. sequences = set(chain.from_iterable(all_seq_prices))
  27. return max(sum(seq_prices.get(seq, 0) for seq_prices in all_seq_prices)
  28. for seq in sequences)
  29. def nth(num, n):
  30. for _ in range(n):
  31. num = permute(num)
  32. return num
  33. initials = list(map(int, sys.stdin))
  34. print(sum(nth(num, 2000) for num in initials))
  35. print(max_prices(initials))