#advent of code 2020 #day 07 #cool PuzzleInput = open("07.in","r"); rules = {}; target = "shinygold"; queue = []; options = set(); #parse, removing filler wording and splitting bag names to dictionary for line in PuzzleInput: line = line.replace("\n","").replace(" bags","").replace(" bag","").replace("no other","1 no other")[:-1]; rk, rv = line.split(" contain "); #rule key, rule value rv = rv.split(", "); rk = rk.replace(" ",""); rules[rk] = dict(); for rval in rv: rv1,rv2,rv3 = rval.split(" "); rules[rk][rv2+rv3] = int(rv1); if target in rules[rk]: queue.append(rk); options.add(rk); PuzzleInput.close(); #part 1 visited = []; while queue: bag = queue.pop(); if bag in visited: continue; visited.append(bag); for rk in rules: if bag in rules[rk]: queue.append(rk); options.add(rk); p1 = len(options); #part 2 queue = [(1,target)]; AllBags = dict(); while queue: total, bag = queue.pop(); for b in rules[bag]: if b == "noother": continue; AllBags[b] = AllBags.get(b,0) + total*rules[bag][b]; queue.append((total*rules[bag][b], b)); p2 = sum([AllBags[bag] for bag in AllBags]); print("part 1 =",p1); print("part 2 =",p2);