import queue with open("7.txt") as f: edges = dict() edges2 = dict() import re pat = re.compile(""" ^(.*)\ bags?\ contain\ (?: (?:no\ other\ bags) | (?: (\d+)\ (.*)\ bags? (,\ (\d+)\ (.*)\ bags?)* ) ) .$ """, flags=re.VERBOSE) for line in f: a, b = line.split("contain") outer = a.strip().rstrip("bags").strip() if outer not in edges2: edges2[outer] = dict() inner = b.strip().rstrip(".").split(", ") # print(inner) if inner == ["no other bags"]: continue for n in inner: num = int(re.match("^(\d+)\s.*", n).groups()[0]) color = re.sub("^(\d+)\s", "", n) color = re.sub("\sbags?$", "", color) # print(color) edges2[outer][color] = num if color not in edges: edges[color] = set() edges[color].add(outer) # print(edges) found = set() q = queue.Queue() q.put("shiny gold") while not q.empty(): c = q.get() r = edges.get(c, set()) # print(c, r) for c1 in r: if c1 not in found: q.put(c1) found.add(c1) print(len(found)) print(edges2) def visit(color): r = edges2.get(color, set()) c = 1 for col, n in r.items(): c += n * visit(col) # print(f"{color} contains {c} other bags") return c print(visit("shiny gold") - 1)