import functools from collections import defaultdict def solve(data): G = defaultdict(set) for line in data.splitlines(): f, *t = line.split() G[f[:-1]] = set(t) @functools.cache def _traverse(k, fasttrack=True, fft=False, dac=False): if k == "out": return fasttrack or (fft and dac) return sum( _traverse(nk, fasttrack, fft or k == "fft", dac or k == "dac") for nk in G[k] ) return _traverse("you"), _traverse("svr", fasttrack=False) if __name__ == "__main__": with open("./input/11.txt", "r") as f: inp = f.read().strip() p1, p2 = solve(inp) print(p1) print(p2) assert p1 == 649 assert p2 == 458948453421420