14_polymer.py 835 B

12345678910111213141516171819202122232425262728293031
  1. #!/usr/bin/env python3
  2. import sys
  3. from collections import Counter
  4. def parse(f):
  5. yield next(f).rstrip()
  6. next(f)
  7. yield dict(line.rstrip().split(' -> ') for line in f)
  8. def grow(polymer, rules, steps):
  9. elements = Counter(polymer)
  10. pairs = Counter(polymer[i:i + 2] for i in range(len(polymer) - 1))
  11. for step in range(steps):
  12. new = Counter()
  13. for pair, num in pairs.items():
  14. if pair in rules:
  15. a, b = pair
  16. c = rules[pair]
  17. new[a + c] += num
  18. new[c + b] += num
  19. elements[c] += num
  20. else:
  21. new[pair] = num
  22. pairs = new
  23. return max(elements.values()) - min(elements.values())
  24. template, rules = parse(sys.stdin)
  25. print(grow(template, rules, 10))
  26. print(grow(template, rules, 40))