|
|
@@ -0,0 +1,31 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+import sys
|
|
|
+from collections import Counter
|
|
|
+
|
|
|
+def parse(f):
|
|
|
+ yield next(f).rstrip()
|
|
|
+ next(f)
|
|
|
+ yield dict(line.rstrip().split(' -> ') for line in f)
|
|
|
+
|
|
|
+def grow(polymer, rules, steps):
|
|
|
+ elements = Counter(polymer)
|
|
|
+ pairs = Counter(polymer[i:i + 2] for i in range(len(polymer) - 1))
|
|
|
+
|
|
|
+ for step in range(steps):
|
|
|
+ new = Counter()
|
|
|
+ for pair, num in pairs.items():
|
|
|
+ if pair in rules:
|
|
|
+ a, b = pair
|
|
|
+ c = rules[pair]
|
|
|
+ new[a + c] += num
|
|
|
+ new[c + b] += num
|
|
|
+ elements[c] += num
|
|
|
+ else:
|
|
|
+ new[pair] = num
|
|
|
+ pairs = new
|
|
|
+
|
|
|
+ return max(elements.values()) - min(elements.values())
|
|
|
+
|
|
|
+template, rules = parse(sys.stdin)
|
|
|
+print(grow(template, rules, 10))
|
|
|
+print(grow(template, rules, 40))
|