| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- #!/usr/bin/env python3
- import sys
- from itertools import chain, islice, pairwise
- def permute(num):
- num = (num ^ num << 6) & 0xffffff
- num ^= num >> 5
- return (num ^ num << 11) & 0xffffff
- def prices(num):
- while True:
- yield num % 10
- num = permute(num)
- def window(seq, n):
- win = tuple(islice(seq, n))
- yield win
- for elem in seq:
- win = win[1:] + (elem,)
- yield win
- def sequence_prices(num):
- seen = {}
- for nums in window(islice(prices(num), 2001), 5):
- diffs = tuple(b - a for a, b in pairwise(nums))
- seen.setdefault(diffs, nums[-1])
- return seen
- def max_prices(initials):
- all_seq_prices = list(map(sequence_prices, initials))
- sequences = set(chain.from_iterable(all_seq_prices))
- return max(sum(seq_prices.get(seq, 0) for seq_prices in all_seq_prices)
- for seq in sequences)
- def nth(num, n):
- for _ in range(n):
- num = permute(num)
- return num
- initials = list(map(int, sys.stdin))
- print(sum(nth(num, 2000) for num in initials))
- print(max_prices(initials))
|