"""Solution to 2020/07 Part 2""" import pprint from collections import defaultdict # key: bag, value: list of tuples (count, bag which must be contained) tree = defaultdict(list) def words(sentence, start, end): """ Strips consecutive words from a sentance Words are whitespace separated. Words are 1-indexed. """ return ' '.join(sentence.split(' ')[start-1:end]) with open('input', 'r') as f: for line in f.readlines(): source, targets = line.strip().split(' contain ') source = words(source, 1, 2) if targets == 'no other bags.': continue for target in targets.split(', '): count = int(target.split(' ')[0]) color = words(target, 2, 3) tree[source].append((count, color)) # pprint.pprint(tree) processed = set() queue = [(1, 'shiny gold')] count = 0 while len(queue): source_count, source = queue.pop() count += source_count for target_count, target in tree[source]: queue.append((source_count * target_count, target)) print(count - 1) # Wrong: 41560