Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from collections import deque, Counter
- from argparse import ArgumentParser, FileType
- def parse(src):
- return [int(line) for line in src.splitlines() if line != '']
- def mix_prune(secret, other):
- return (secret ^ other) & 0xFFFFFF
- def step(secret):
- secret = mix_prune(secret, secret << 6)
- secret = mix_prune(secret, secret >> 5)
- return mix_prune(secret, secret << 11)
- def score_sequences(number):
- current_sequence = deque([], maxlen=4)
- scores = Counter()
- for n in range(2000):
- if n >= 4:
- sequence = tuple(current_sequence)
- if sequence not in scores: # only count the first appearance
- scores[tuple(current_sequence)] = number % 10
- new_number = step(number)
- current_sequence.append((new_number % 10) - (number % 10))
- number = new_number
- return scores
- def main(numbers, verbose):
- total_scores = Counter()
- for number in numbers:
- total_scores += score_sequences(number)
- if verbose:
- best_seq, result = total_scores.most_common(1)[0]
- print(f'current best: {best_seq}, {result}')
- if not verbose:
- result = total_scores.most_common(1)[0][1]
- return result
- arg_parser = ArgumentParser()
- arg_parser.add_argument('src', type=FileType('r'))
- arg_parser.add_argument('-v', '--verbose', action='store_true')
- if __name__ == '__main__':
- args = arg_parser.parse_args()
- print(main(parse(args.src.read()), args.verbose))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement