Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

30 lines
657B

  1. import collections
  2. import re
  3. import sys
  4. text = sys.stdin.read()
  5. rev = collections.defaultdict(list)
  6. fwd = collections.defaultdict(list)
  7. for line in text.splitlines():
  8. (_, src), *targets = re.findall(r'(\d*) ?(\w+ \w+) bag', line)
  9. for n, tgt in targets:
  10. rev[tgt].append(src)
  11. fwd[src].append((tgt, int(n or '0')))
  12. edge = {'shiny gold'}
  13. seen = set()
  14. while edge:
  15. edge = {new for old in edge for new in rev[old]} - seen
  16. seen |= edge
  17. print(len(seen))
  18. edge = [('shiny gold', 1)]
  19. seen = []
  20. while edge:
  21. edge = [(new, n * m) for old, n in edge for new, m in fwd[old] if n * m]
  22. seen += edge
  23. print(sum(n for _, n in seen))