14_polymer.py 794 B

12345678910111213141516171819202122232425262728
  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. for pair, num in list(pairs.items()):
  13. if num and pair in rules:
  14. a, b = pair
  15. c = rules[pair]
  16. pairs[pair] -= num
  17. pairs[a + c] += num
  18. pairs[c + b] += num
  19. elements[c] += num
  20. return max(elements.values()) - min(elements.values())
  21. template, rules = parse(sys.stdin)
  22. print(grow(template, rules, 10))
  23. print(grow(template, rules, 40))