day 3 solutions
parent
83e3c497c7
commit
46ba7f1593
|
@ -0,0 +1,68 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
input = sys.stdin
|
||||||
|
data = [line.strip() for line in input]
|
||||||
|
|
||||||
|
def issymbol(c):
|
||||||
|
return c != '.' and not c.isalnum()
|
||||||
|
|
||||||
|
def nexttosymbol(row, col):
|
||||||
|
for x in [col-1, col, col+1]:
|
||||||
|
for y in [row-1, row, row+1]:
|
||||||
|
if 0 <= y < len(data) and 0 <= x < len(data[y]):
|
||||||
|
if issymbol(data[y][x]):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def findgears(row, col):
|
||||||
|
for x in [col-1, col, col+1]:
|
||||||
|
for y in [row-1, row, row+1]:
|
||||||
|
if 0 <= y < len(data) and 0 <= x < len(data[y]):
|
||||||
|
if data[y][x] == '*':
|
||||||
|
yield y,x
|
||||||
|
|
||||||
|
|
||||||
|
part1 = 0
|
||||||
|
gears = {}
|
||||||
|
for no, line in enumerate(data):
|
||||||
|
places = []
|
||||||
|
digits = []
|
||||||
|
i = 0
|
||||||
|
while i < len(line):
|
||||||
|
if line[i].isdigit() and (i == 0 or not line[i-1].isdigit()):
|
||||||
|
j = i+1
|
||||||
|
while j < len(line) and line[j].isdigit():
|
||||||
|
j += 1
|
||||||
|
digits.append(int(line[i:j]))
|
||||||
|
places.append(list(range(i,j)))
|
||||||
|
i = j
|
||||||
|
else:
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
for n, pos in zip(digits, places):
|
||||||
|
if any(nexttosymbol(no, i) for i in pos):
|
||||||
|
print(n)
|
||||||
|
part1 += n
|
||||||
|
|
||||||
|
seen = set()
|
||||||
|
for i in pos:
|
||||||
|
for g in findgears(no,i):
|
||||||
|
if g not in seen:
|
||||||
|
gears.setdefault(g, []).append(n)
|
||||||
|
seen.add(g)
|
||||||
|
|
||||||
|
print(part1)
|
||||||
|
|
||||||
|
part2 = 0
|
||||||
|
for g, nums in gears.items():
|
||||||
|
if len(nums) == 2:
|
||||||
|
part2 += nums[0] * nums[1]
|
||||||
|
print(part2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue