Advertisement
alexandrajay2002

Advent of Code 2024 day 22 part 2

Dec 22nd, 2024 (edited)
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.51 KB | Source Code | 0 0
  1. from collections import deque, Counter
  2. from argparse import ArgumentParser, FileType
  3.  
  4.  
  5. def parse(src):
  6.     return [int(line) for line in src.splitlines() if line != '']
  7.  
  8.  
  9. def mix_prune(secret, other):
  10.     return (secret ^ other) & 0xFFFFFF
  11.  
  12.  
  13. def step(secret):
  14.     secret = mix_prune(secret, secret << 6)
  15.     secret = mix_prune(secret, secret >> 5)
  16.     return mix_prune(secret, secret << 11)
  17.  
  18.  
  19. def score_sequences(number):
  20.     current_sequence = deque([], maxlen=4)
  21.     scores = Counter()
  22.  
  23.     for n in range(2000):
  24.         if n >= 4:
  25.             sequence = tuple(current_sequence)
  26.             if sequence not in scores:  # only count the first appearance
  27.                 scores[tuple(current_sequence)] = number % 10
  28.  
  29.         new_number = step(number)
  30.         current_sequence.append((new_number % 10) - (number % 10))
  31.         number = new_number
  32.  
  33.     return scores
  34.  
  35.  
  36. def main(numbers, verbose):
  37.     total_scores = Counter()
  38.     for number in numbers:
  39.         total_scores += score_sequences(number)
  40.         if verbose:
  41.             best_seq, result = total_scores.most_common(1)[0]
  42.             print(f'current best: {best_seq}, {result}')
  43.  
  44.     if not verbose:
  45.         result = total_scores.most_common(1)[0][1]
  46.     return result
  47.  
  48.  
  49. arg_parser = ArgumentParser()
  50. arg_parser.add_argument('src', type=FileType('r'))
  51. arg_parser.add_argument('-v', '--verbose', action='store_true')
  52.  
  53. if __name__ == '__main__':
  54.     args = arg_parser.parse_args()
  55.     print(main(parse(args.src.read()), args.verbose))
  56.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement