"""Day 7.""" import re from collections import defaultdict pattern = r"(\d+) ([a-z]+) ([a-z]+) (bag[s]?)" prog = re.compile(pattern) with open("input") as f: sections = f.read().rstrip().split("\n") mapping = defaultdict(lambda: []) # Put bags into dict structure for section in sections: parent, child_str = section.split(" bags contain ") children = [] if "no other bags" not in child_str: for child in child_str.replace(".", "").split(", "): _, adjective, color, _ = prog.match(child).groups() children.append(f"{adjective} {color}") for child in children: mapping[child].append(parent) # Part 1 bags = set(mapping['shiny gold']) while True: new_bags = bags.copy() for bag in bags: for new_bag in mapping[bag]: new_bags.add(new_bag) if len(new_bags) == len(bags): print(len(bags)) break else: bags = new_bags mapping = dict() # Put bags into dict structure for section in sections: parent, child_str = section.split(" bags contain ") children = [] if "no other bags" not in child_str: for child in child_str.replace(".", "").split(", "): count, adjective, color, _ = prog.match(child).groups() for x in range(int(count)): children.append(f"{adjective} {color}") if parent not in mapping: mapping[parent] = [] for child in children: mapping[parent].append(child) bags = list(mapping['shiny gold']) count = 0 new_bags = [] while True: new_bags = [] for x in bags: count += 1 if mapping[x] == []: continue else: new_bags.extend(mapping[x]) bags = new_bags if new_bags == []: print(count) break