You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3 年之前
3 年之前
12345678910111213141516171819202122232425262728293031
  1. from collections import Counter
  2. def sum_counts(counts):
  3. """
  4. >>> sum_counts([('a', 20), ('b', 10), ('a', 30)])
  5. {'a': 50, 'b': 10}
  6. """
  7. final = Counter()
  8. for k, v in counts:
  9. final[k] += v
  10. return final
  11. polymer, eqs = open(0).read().split('\n\n')
  12. mapping = dict(eq.split(' -> ') for eq in eqs.splitlines())
  13. grow = {(a, b): ((a, x), (x, b)) for (a, b), x in mapping.items()}
  14. duos = Counter(duo for duo in zip(polymer, polymer[1:]))
  15. scores = {}
  16. for n in range(40):
  17. duos = sum_counts((new, N) for old, N in duos.items() for new in grow[old])
  18. # account for double-counting when scoring, except at edges
  19. singles = sum_counts((k, N) for ab, N in duos.items() for k in ab)
  20. singles[polymer[0]] += 1
  21. singles[polymer[-1]] += 1
  22. xmax, *_, xmin = [N // 2 for _, N in singles.most_common()]
  23. scores[n + 1] = xmax - xmin
  24. print(scores[10])
  25. print(scores[40])