| 123456789101112131415161718192021222324252627282930313233343536373839 |
- #!/usr/bin/env python3
- import sys
- def parse(inp):
- numbers = []
- nmap = {}
- symbols = {}
- for y, line in enumerate(inp):
- num = ''
- for x, char in enumerate(line):
- if char.isdigit():
- num += char
- nmap[(x, y)] = len(numbers)
- else:
- if num:
- numbers.append(int(num))
- num = ''
- if char not in '.\n':
- symbols[(x, y)] = char
- return numbers, nmap, symbols
- def neighbors(x, y):
- for nx in (x - 1, x, x + 1):
- for ny in (y - 1, y, y + 1):
- if nx != x or ny != y:
- yield nx, ny
- def gear_ratios(numbers, nmap, symbols):
- for (x, y), symbol in symbols.items():
- if symbol == '*':
- nb_nrs = set(nmap[nxy] for nxy in neighbors(x, y) if nxy in nmap)
- if len(nb_nrs) == 2:
- a, b = nb_nrs
- yield numbers[a] * numbers[b]
- numbers, nmap, symbols = parse(sys.stdin)
- partnrs = set(nmap.get(nxy, -1) for x, y in symbols for nxy in neighbors(x, y))
- print(sum(numbers[i] for i in partnrs if i >= 0))
- print(sum(gear_ratios(numbers, nmap, symbols)))
|