40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
|
|
|
|
inp = open('input.txt').read().strip().split('\n')
|
|
|
|
chars = [(i, j, c) for i, line in enumerate(inp) for j, c in enumerate(line) if c!='.' and not '0'<=c<='9']
|
|
|
|
nums = []
|
|
for i, line in enumerate(inp):
|
|
line = '.'+line+'.'
|
|
for j, (l, r) in enumerate(zip(line, line[1:])):
|
|
if not l.isdigit() and r.isdigit():
|
|
s = j-1
|
|
if l.isdigit() and not r.isdigit():
|
|
nums.append((i, s+1, j-1-s, int(line[s+2:j+1])))
|
|
|
|
places = {}
|
|
for n, (i, j, l, _) in enumerate(nums):
|
|
for k in range(j, j+l):
|
|
places[(i, k)] = n
|
|
|
|
sel = set()
|
|
neigh = {(di, dj) for di in range(-1, 2) for dj in range(-1, 2)} - {(0,0)}
|
|
for i, j, _ in chars:
|
|
for di, dj in neigh:
|
|
if (i+di, j+dj) in places:
|
|
sel.add(places[(i+di, j+dj)])
|
|
|
|
print(sum(nums[i][3] for i in sel))
|
|
|
|
from math import prod
|
|
s = 0
|
|
for i, j, _ in filter(lambda x: x[2]=='*', chars):
|
|
sel = set()
|
|
for di, dj in neigh:
|
|
if (i+di, j+dj) in places:
|
|
sel.add(places[(i+di, j+dj)])
|
|
if len(sel)==2:
|
|
s += prod(nums[i][3] for i in sel)
|
|
print(s)
|