Day 9 part 2
This commit is contained in:
parent
9ea88dd879
commit
9c5b53e91e
1 changed files with 137 additions and 0 deletions
137
9/9_2.py
Executable file
137
9/9_2.py
Executable file
|
@ -0,0 +1,137 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# 2021 - Advent Of Code - 9 part 2
|
||||||
|
|
||||||
|
def parse_file(file):
|
||||||
|
hmap = []
|
||||||
|
with open(file) as f:
|
||||||
|
for line in f.readlines():
|
||||||
|
linemap = []
|
||||||
|
for n in line.strip():
|
||||||
|
linemap.append(int(n))
|
||||||
|
hmap.append(linemap)
|
||||||
|
|
||||||
|
return hmap
|
||||||
|
|
||||||
|
|
||||||
|
def print_hmap(hmap):
|
||||||
|
for y in range(len(hmap)):
|
||||||
|
for x in range(len(hmap[y])):
|
||||||
|
print(hmap[y][x], end='')
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
def find_lowpoints(hmap):
|
||||||
|
lpoints = []
|
||||||
|
|
||||||
|
# first line
|
||||||
|
x = 0
|
||||||
|
y = 0
|
||||||
|
if hmap[y][x] < hmap[y][x + 1] and hmap[y][x] < hmap[y + 1][x]:
|
||||||
|
lpoints.append([x, y])
|
||||||
|
|
||||||
|
for x in range(1, len(hmap[y]) - 1):
|
||||||
|
v = hmap[y][x]
|
||||||
|
if v < hmap[y][x - 1] and v < hmap[y][x + 1] and v < hmap[y + 1][x]:
|
||||||
|
lpoints.append([x, y])
|
||||||
|
|
||||||
|
x = len(hmap[y]) - 1
|
||||||
|
if hmap[y][x] < hmap[y][x - 1] and hmap[y][x] < hmap[y + 1][x]:
|
||||||
|
lpoints.append([x, y])
|
||||||
|
|
||||||
|
# middle lines
|
||||||
|
for y in range(1, len(hmap) - 1):
|
||||||
|
x = 0
|
||||||
|
if hmap[y][x] < hmap[y][x + 1] and hmap[y][x] < hmap[y - 1][x] and hmap[y][x] < hmap[y + 1][x]:
|
||||||
|
lpoints.append([x, y])
|
||||||
|
|
||||||
|
for x in range(1, len(hmap[y]) - 1):
|
||||||
|
v = hmap[y][x]
|
||||||
|
if v < hmap[y][x - 1] and v < hmap[y][x + 1] and v < hmap[y - 1][x] and v < hmap[y + 1][x]:
|
||||||
|
lpoints.append([x, y])
|
||||||
|
|
||||||
|
x = len(hmap[y]) - 1
|
||||||
|
if hmap[y][x] < hmap[y][x - 1] and hmap[y][x] < hmap[y - 1][x] and hmap[y][x] < hmap[y + 1][x]:
|
||||||
|
lpoints.append([x, y])
|
||||||
|
|
||||||
|
# last line
|
||||||
|
y = len(hmap) - 1
|
||||||
|
x = 0
|
||||||
|
if hmap[y][x] < hmap[y][x + 1] and hmap[y][x] < hmap[y - 1][x]:
|
||||||
|
lpoints.append([x, y])
|
||||||
|
|
||||||
|
for x in range(1, len(hmap[y]) - 1):
|
||||||
|
v = hmap[y][x]
|
||||||
|
if v < hmap[y][x - 1] and v < hmap[y][x + 1] and v < hmap[y - 1][x]:
|
||||||
|
lpoints.append([x, y])
|
||||||
|
|
||||||
|
x = len(hmap[y]) - 1
|
||||||
|
if hmap[y][x] < hmap[y][x - 1] and hmap[y][x] < hmap[y - 1][x]:
|
||||||
|
lpoints.append([x, y])
|
||||||
|
|
||||||
|
return lpoints
|
||||||
|
|
||||||
|
|
||||||
|
def find_basin(hmap, bpoints, point):
|
||||||
|
bpoints.append(point)
|
||||||
|
# print(f'bpoints: {bpoints}')
|
||||||
|
x = point[0]
|
||||||
|
y = point[1]
|
||||||
|
|
||||||
|
# halt if edge, already in list or value is 9
|
||||||
|
# up
|
||||||
|
if y > 0:
|
||||||
|
if hmap[y-1][x] != 9:
|
||||||
|
if [x, y-1] not in bpoints:
|
||||||
|
find_basin(hmap, bpoints, [x, y-1])
|
||||||
|
# down
|
||||||
|
if y < len(hmap) - 1:
|
||||||
|
if hmap[y+1][x] != 9:
|
||||||
|
if [x, y+1] not in bpoints:
|
||||||
|
find_basin(hmap, bpoints, [x, y+1])
|
||||||
|
|
||||||
|
# left
|
||||||
|
if x > 0:
|
||||||
|
if hmap[y][x-1] != 9:
|
||||||
|
if [x-1, y] not in bpoints:
|
||||||
|
find_basin(hmap, bpoints, [x-1, y])
|
||||||
|
|
||||||
|
# right
|
||||||
|
if x < len(hmap[y]) - 1:
|
||||||
|
if hmap[y][x+1] != 9:
|
||||||
|
if [x+1, y] not in bpoints:
|
||||||
|
find_basin(hmap, bpoints, [x+1, y])
|
||||||
|
|
||||||
|
return bpoints
|
||||||
|
|
||||||
|
|
||||||
|
# heightmap = parse_file('input_example.txt')
|
||||||
|
heightmap = parse_file('input.txt')
|
||||||
|
# print_hmap(heightmap)
|
||||||
|
low_points = find_lowpoints(heightmap)
|
||||||
|
|
||||||
|
risk_levels = 0
|
||||||
|
basins = []
|
||||||
|
for p in low_points:
|
||||||
|
basins_points = []
|
||||||
|
find_basin(heightmap, basins_points, p)
|
||||||
|
basins.append(basins_points)
|
||||||
|
|
||||||
|
|
||||||
|
sizes = [0] * len(basins)
|
||||||
|
i = 0
|
||||||
|
for b in basins:
|
||||||
|
size = 0
|
||||||
|
for p in b:
|
||||||
|
size += 1
|
||||||
|
sizes[i] = size
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
# 3 biggest basins
|
||||||
|
biggest_basins = sorted(zip(sizes, basins))[-3:]
|
||||||
|
|
||||||
|
product = 1
|
||||||
|
for s, b in biggest_basins:
|
||||||
|
print(f'basin size: {s}')
|
||||||
|
product *= s
|
||||||
|
|
||||||
|
print(f'product: {product}')
|
Loading…
Reference in a new issue