#!/usr/bin/env python3 import re from collections import Counter lines = (x.strip() for x in open("input.txt")) first = next(lines) combinations = Counter(first[a:a+2] for a in range(len(first)-1)) replacements = dict() next(lines) for line in lines: before, insert = re.match(r"([A-Z]{2}) -> ([A-Z])", line).groups() replacements[before] = (before[0]+insert, insert+before[1]) print(combinations) for _ in range(40): nxt = {} for before, afters in replacements.items(): for after in afters: add = combinations.get(before, 0) + nxt.get(after, 0) if add: nxt[after] = add combinations = nxt print(combinations) letters = {} for key, cnt in combinations.items(): letters[key[0]] = letters.get(key[0], 0) + cnt letters[key[1]] = letters.get(key[1], 0) + cnt print(letters) print((max(*letters.values())+1) // 2 - (min(*letters.values())+1) // 2)