03_gondola.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/env python3
  2. import sys
  3. def parse(inp):
  4. numbers = []
  5. nmap = {}
  6. symbols = {}
  7. for y, line in enumerate(inp):
  8. num = ''
  9. for x, char in enumerate(line):
  10. if char.isdigit():
  11. num += char
  12. nmap[(x, y)] = len(numbers)
  13. else:
  14. if num:
  15. numbers.append(int(num))
  16. num = ''
  17. if char not in '.\n':
  18. symbols[(x, y)] = char
  19. return numbers, nmap, symbols
  20. def neighbors(x, y):
  21. for nx in (x - 1, x, x + 1):
  22. for ny in (y - 1, y, y + 1):
  23. if nx != x or ny != y:
  24. yield nx, ny
  25. def gear_ratios(numbers, nmap, symbols):
  26. for (x, y), symbol in symbols.items():
  27. if symbol == '*':
  28. nb_nrs = set(nmap[nxy] for nxy in neighbors(x, y) if nxy in nmap)
  29. if len(nb_nrs) == 2:
  30. a, b = nb_nrs
  31. yield numbers[a] * numbers[b]
  32. numbers, nmap, symbols = parse(sys.stdin)
  33. partnrs = set(nmap.get(nxy, -1) for x, y in symbols for nxy in neighbors(x, y))
  34. print(sum(numbers[i] for i in partnrs if i >= 0))
  35. print(sum(gear_ratios(numbers, nmap, symbols)))