This commit is contained in:
69
day-09/day-09.py
Normal file
69
day-09/day-09.py
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def part_1(input):
|
||||
result = 0
|
||||
m = [[int(d) for d in l.rstrip()] for l in input]
|
||||
for y, l in enumerate(m):
|
||||
for x, d in enumerate(l):
|
||||
lowest = True
|
||||
if 0 < y and d >= m[y-1][x]:
|
||||
lowest = False
|
||||
elif (len(m) - 1) > y and d >= m[y+1][x]:
|
||||
lowest = False
|
||||
elif 0 < x and d >= m[y][x-1]:
|
||||
lowest = False
|
||||
elif (len(l) - 1) > x and d >= m[y][x+1]:
|
||||
lowest = False
|
||||
if lowest:
|
||||
result += d + 1
|
||||
|
||||
print("Part 1 result:", result)
|
||||
|
||||
|
||||
def part_2(input):
|
||||
result = 0
|
||||
m = [[int(d) for d in l.rstrip()] for l in input]
|
||||
p_lowest = set()
|
||||
p_low = set()
|
||||
for y, l in enumerate(m):
|
||||
for x, d in enumerate(l):
|
||||
low = True
|
||||
if d != 9:
|
||||
p_low.add((x, y))
|
||||
if 0 < y and d >= m[y-1][x]:
|
||||
low = False
|
||||
elif (len(m) - 1) > y and d >= m[y+1][x]:
|
||||
low = False
|
||||
elif 0 < x and d >= m[y][x-1]:
|
||||
low = False
|
||||
elif (len(l) - 1) > x and d >= m[y][x+1]:
|
||||
low = False
|
||||
if low:
|
||||
p_lowest.add((x, y))
|
||||
b_size = []
|
||||
neighbors = [[-1, 0], [0, -1], [0, 1], [1, 0]]
|
||||
for k in p_lowest:
|
||||
to_check = [k]
|
||||
basin = set()
|
||||
while len(to_check):
|
||||
p = to_check.pop(0)
|
||||
basin.add(p)
|
||||
for n in neighbors:
|
||||
tup = (p[0] + n[0], p[1] + n[1])
|
||||
if tup in p_low and tup not in basin and tup not in to_check:
|
||||
to_check.append(tup)
|
||||
b_size.append(len(basin))
|
||||
|
||||
b_size.sort()
|
||||
result = b_size[-3] * b_size[-2] * b_size[-1]
|
||||
print("Part 2 result:", result)
|
||||
|
||||
|
||||
input = list()
|
||||
p = Path(__file__).with_name('input.txt')
|
||||
with open(p) as f:
|
||||
input = f.readlines()
|
||||
part_1(input)
|
||||
part_2(input)
|
||||
Reference in New Issue
Block a user