Advertisement
globmont

AoC 21-14

Dec 17th, 2021
1,232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.55 KB | None | 0 0
  1. from collections import Counter
  2.  
  3. file = "inputs/2021/14/data.txt"
  4. with open(file, "r") as f:
  5.     template = f.readline().strip()
  6.     f.readline()
  7.     rules = f.read().split("\n")
  8.     rules = {rule.split(" -> ")[0]: rule.split(" -> ")[1] for rule in rules}
  9.    
  10. def polymerize(n_polymerizations, template, rules):
  11.    
  12.     # Initialize pair_counts
  13.     pair_counts = Counter()
  14.     for idx in range(len(template) - 1):
  15.         pair_counts[template[idx:idx + 2]] += 1
  16.    
  17.     # Run polymerization
  18.     for polymerization_idx in range(n_polymerizations):
  19.         new_pair_counts = Counter()
  20.         for pair, count in pair_counts.items():
  21.             insertion = rules[pair]
  22.             new_pair_counts[pair[0] + insertion] += count
  23.             new_pair_counts[insertion + pair[1]] += count
  24.        
  25.         pair_counts = new_pair_counts
  26.    
  27.     # Calculate result        
  28.     letter_counts = Counter()
  29.     for pair, count in pair_counts.items():
  30.         letter_counts[pair[0]] += count
  31.         letter_counts[pair[1]] += count
  32.  
  33.     # Adjust letter counts for duplication
  34.     for letter in letter_counts:
  35.         letter_counts[letter] = letter_counts[letter] - letter_counts[letter] // 2
  36.    
  37.     return letter_counts
  38.  
  39.  
  40. part_1_base_counts = polymerize(10, template, rules)
  41. part_1 = max(part_1_base_counts.values()) - min(part_1_base_counts.values())
  42. print(f"Part 1: {part_1:,d}")
  43.  
  44. part_2_base_counts = polymerize(40, template, rules)
  45. part_2 = max(part_2_base_counts.values()) - min(part_2_base_counts.values())
  46. print(f"Part 2: {part_2:,d}")
  47.    
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement