Guest User

Advent of code day 14 recursive cached bruteforce

a guest
Dec 14th, 2021
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.23 KB | None | 0 0
  1. from collections import Counter
  2. import numpy as np
  3. import functools
  4. import time
  5.  
  6. with open("input.txt", "r") as input_file:
  7.     lines = input_file.read().splitlines()
  8.  
  9. start_state = lines[0]
  10. rules = dict()
  11. for line in lines[2:]:
  12.     pair, output = line.split(" -> ")
  13.     rules[pair] = output
  14.  
  15. @functools.lru_cache(10000)
  16. def get_counts_for_pair(pair, depth):
  17.     rule_output = rules.get(pair)
  18.     if rule_output is None or depth == 0:
  19.         if pair[0] == pair[1]:
  20.             return {pair[0]: 2}
  21.         else:
  22.             return {pair[0]: 1, pair[1]: 1}
  23.     else:
  24.         c = Counter()
  25.         c.update(get_counts_for_pair(pair[0] + rule_output, depth - 1))
  26.         c.update(get_counts_for_pair(rule_output + pair[1], depth - 1))
  27.         c.update({rule_output: -1})
  28.         return c
  29.  
  30. letter_counts = Counter()
  31. letter_counts.update(get_counts_for_pair(start_state[0] + start_state[1], 40))
  32. for letter_index in range(1,len(start_state) - 1):
  33.     pair = start_state[letter_index] + start_state[letter_index + 1]
  34.     letter_counts.update(get_counts_for_pair(pair, 40))
  35.     letter_counts.update({start_state[letter_index]: -1})
  36.  
  37. raw_counts = np.array(list(letter_counts.values()))
  38. print(np.max(raw_counts) - np.min(raw_counts))
  39.  
Advertisement
Add Comment
Please, Sign In to add comment