from collections import defaultdict from lib import get_data data = get_data(__file__) algs_to_ings = defaultdict(set) ings_counts = defaultdict(int) for line in data.splitlines(): a, b = line.split(" (contains ") ings = a.split(" ") algs = b[:-1].split(", ") for ing in ings: ings_counts[ing] += 1 for a in algs: if a not in algs_to_ings: algs_to_ings[a] = set(ings) else: algs_to_ings[a] &= set(ings) for ings in algs_to_ings.values(): for ing in ings: if ing in ings_counts: del ings_counts[ing] t = sum(ings_counts.values()) print(t) algs_to_ings = {a: list(ing) for a, ing in algs_to_ings.items()} handled = set() while True: to_remove = None for alg, ings in algs_to_ings.items(): if len(ings) == 1 and ings[0] not in handled: to_remove = ings[0] break else: break assert to_remove is not None handled.add(to_remove) for ings in algs_to_ings.values(): if len(ings) > 1 and to_remove in ings: ings.remove(to_remove) xs = sorted([(a, i[0]) for a, i in algs_to_ings.items()]) xs = ",".join([x[1] for x in xs]) print(xs)