07_bags.py 918 B

1234567891011121314151617181920212223242526272829
  1. #!/usr/bin/env python3
  2. import re
  3. import sys
  4. def parse(f):
  5. contains = {}
  6. contained_by = {}
  7. for line in f:
  8. parent, children = line.split(' bags contain ')
  9. contains[parent] = parent_contains = {}
  10. for match in re.findall(r'\d+ \w+ \w+', children):
  11. num, child = match.split(' ', 1)
  12. parent_contains[child] = int(num)
  13. contained_by.setdefault(child, []).append(parent)
  14. return contains, contained_by
  15. def containers(color, contained_by):
  16. def traverse(child):
  17. for parent in contained_by.get(child, []):
  18. yield parent
  19. yield from traverse(parent)
  20. return set(traverse(color))
  21. def count(color, contains):
  22. return sum(n + n * count(c, contains) for c, n in contains[color].items())
  23. contains, contained_by = parse(sys.stdin)
  24. print(len(containers('shiny gold', contained_by)))
  25. print(count('shiny gold', contains))