Advertisement
Guest User

Untitled

a guest
Dec 14th, 2021
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.34 KB | None | 0 0
  1. import Inputs
  2.  
  3.  
  4. sample = '''NNCB
  5.        CH -> B
  6.        HH -> N
  7.        CB -> H
  8.        NH -> C
  9.        HB -> C
  10.        HC -> B
  11.        HN -> C
  12.        NN -> C
  13.        BH -> H
  14.        NC -> B
  15.        NB -> B
  16.        BN -> B
  17.        BB -> N
  18.        BC -> B
  19.        CC -> N
  20.        CN -> C'''
  21.  
  22. def poly_length(poly):
  23.     counter = 0
  24.     for pair in poly:
  25.         counter += poly[pair]
  26.     # +1 because the last character doesn't have two pairs assigned
  27.     return counter+1
  28.  
  29.  
  30. puz_input = Inputs.Day14()
  31. # puz_input = sample
  32.  
  33. rules = dict()
  34. rules_count = dict()
  35. ch_occ = dict()
  36.  
  37. input_template = puz_input.splitlines()[0]
  38. input_rules = puz_input.splitlines()[1:]
  39.  
  40. # make rules count dict
  41. for line in input_rules:
  42.     line = line.replace(" ", "")
  43.    
  44.     inp_rule = line.split("->")
  45.     cond = inp_rule[0]
  46.     res_ = inp_rule[1]
  47.    
  48.  
  49.     # The polymer process division
  50.     result = ([cond[0]+res_, res_+cond[1]])
  51.     rules[cond] = result
  52.     rules_count[cond] = 0
  53.    
  54.  
  55. # Template line, after the dicts initialization
  56. # to be able to add counters easy
  57. input_template = input_template.replace(" ", "")
  58. i=0
  59. while i < len(input_template)-1:
  60.     cond = input_template[i]+input_template[i+1]
  61.     rules_count[cond] += 1
  62.     i += 1
  63.            
  64. steps = 40
  65.  
  66. for step in range(steps):
  67.  
  68.     rule_count_copy = rules_count.copy()
  69.     for rl in rule_count_copy:
  70.  
  71.         if rule_count_copy[rl] > 0:
  72.            
  73.             res = rules[rl]
  74.  
  75.             # the new elements count will each new poly count plus
  76.             # the original poly count
  77.             rules_count[res[0]] += rule_count_copy[rl]
  78.             rules_count[res[1]] += rule_count_copy[rl]
  79.  
  80.             # The original pair gets used
  81.             rules_count[rl] -= rule_count_copy[rl]
  82.  
  83. # For each character in every pair, add it's count to
  84. # the character occurrences dict
  85. for rl in rules_count:
  86.     # first char
  87.     ch_occ[rl[0]] = ch_occ.get(rl[0], 0) + rules_count[rl]
  88.     # second
  89.     ch_occ[rl[1]] = ch_occ.get(rl[1], 0) + rules_count[rl]
  90.  
  91.  
  92. # Round .5 values up
  93. from math import ceil
  94.  
  95. mx = ceil(max(ch_occ.values())/2)
  96. mn = ceil(min(ch_occ.values())/2)
  97.  
  98. print("Answer is:", mx-mn)
  99.  
  100.  
  101. print("String lenght:", poly_length(rules_count))
  102.  
  103. # Correct answers
  104. assert mx-mn == 3816397135460
  105. assert poly_length(rules_count) == 20890720927745
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement