280 tokens in Python for part 2 by LiquidFun
Download solution
fromcollectionsimportdefaultdict
lines=open(0).read().splitlines()
gear_to_num=defaultdict(list)
is_valid=lambday,x:0<=y<len(lines)and0<=x<len(lines[0])
foryinrange(len(lines)):
forx_startinrange(len(lines[y])):
x_end=x_start
iflines[y][x_start].isdigit()and(notis_valid(y,x_start-1)ornotlines[y][x_start-1].isdigit()):
whileis_valid(y,x_end+1)andlines[y][x_end+1].isdigit():
x_end+=1
good=False
forydinrange(y-1,y+2):
forxdinrange(x_start-1,x_end+2):
ifis_valid(yd,xd)andlines[yd][xd]notin'.0123456789':
good=True
iflines[yd][xd]in'*':
gear_to_num[(yd,xd)].append(int(lines[y][x_start:x_end+1]))
print(sum(n[0]*n[1]forningear_to_num.values()iflen(n)==2))