|
|
@@ -0,0 +1,34 @@ |
|
|
|
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)) |