|
- import collections
- import sys
-
-
- text = sys.stdin.read()
- text = text.replace('bags', 'bag')
-
-
- reverse = collections.defaultdict(list)
- bags = collections.defaultdict(list)
- for line in text.splitlines():
- source, targets = line.split('contain')
- source = source.strip()
- for target in targets.strip('.').split(','):
- n, stuff = target.strip().split(' ', 1)
- n = int('0' if n == 'no' else n)
- reverse[stuff.strip()].append(source)
- bags[source].append((n, stuff))
-
-
- edge = {'shiny gold bag'}
- seen = set()
- while edge:
- edge = {new for old in edge for new in reverse[old]} - seen
- seen |= edge
- print(len(seen))
-
-
- edge = [(1, 'shiny gold bag')]
- seen = []
- while edge:
- edge = [(n * m, name) for n, sub in edge for m, name in bags[sub] if n * m]
- seen += edge
- print(sum(n for n, _ in seen))
|