69 lines
1.9 KiB
Python
69 lines
1.9 KiB
Python
|
|
from collections import deque
|
||
|
|
from output import answer
|
||
|
|
|
||
|
|
n = 3
|
||
|
|
title = "Gear Ratios"
|
||
|
|
|
||
|
|
|
||
|
|
@answer(1, "Sum of all part numbers is {} in the engine schematic")
|
||
|
|
def part_1(presolved):
|
||
|
|
s, _ = presolved
|
||
|
|
return s
|
||
|
|
|
||
|
|
|
||
|
|
@answer(2, "Gear ratio sums is {} in the engine schematic")
|
||
|
|
def part_2(presolved):
|
||
|
|
_, gr = presolved
|
||
|
|
return gr
|
||
|
|
|
||
|
|
|
||
|
|
def presolve(data):
|
||
|
|
data = data.split()
|
||
|
|
adj = (-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)
|
||
|
|
w = len(data[0])
|
||
|
|
h = len(data)
|
||
|
|
s = list()
|
||
|
|
gr = list()
|
||
|
|
for y in range(w):
|
||
|
|
for x in range(h):
|
||
|
|
if data[y][x] != "." and not data[y][x].isdigit():
|
||
|
|
seen = set()
|
||
|
|
t = list()
|
||
|
|
for oy, ox in adj:
|
||
|
|
if (y + oy, x + ox) in seen:
|
||
|
|
continue
|
||
|
|
if data[y + oy][x + ox].isdigit():
|
||
|
|
n = deque([data[y + oy][x + ox]])
|
||
|
|
i = x + ox - 1
|
||
|
|
while i in range(w) and data[y + oy][i].isdigit():
|
||
|
|
n.append(data[y + oy][i])
|
||
|
|
seen.add((y + oy, i))
|
||
|
|
i -= 1
|
||
|
|
i = x + ox + 1
|
||
|
|
while i in range(w) and data[y + oy][i].isdigit():
|
||
|
|
n.appendleft(data[y + oy][i])
|
||
|
|
seen.add((y + oy, i))
|
||
|
|
i += 1
|
||
|
|
t.append(sum(10**m * int(d) for m, d in enumerate(n)))
|
||
|
|
# part 1
|
||
|
|
s.append(sum(t))
|
||
|
|
# part 2
|
||
|
|
if data[y][x] == "*" and len(t) == 2:
|
||
|
|
a, b = t
|
||
|
|
gr.append(a * b)
|
||
|
|
|
||
|
|
return sum(s), sum(gr)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
with open("./input/03.txt", "r") as f:
|
||
|
|
inp = f.read().strip()
|
||
|
|
|
||
|
|
parsed = presolve(inp)
|
||
|
|
|
||
|
|
a = part_1(parsed)
|
||
|
|
b = part_2(parsed)
|
||
|
|
|
||
|
|
assert a == 553825
|
||
|
|
assert b == 93994191
|