Solution to problem 9 part 1 in Python

This commit is contained in:
David Doblas Jiménez 2022-04-30 12:18:36 +02:00
parent 06467e9586
commit a55487c839

72
src/Year_2021/P9.py Normal file
View File

@ -0,0 +1,72 @@
# --- Day 9: Smoke Basin ---
# These caves seem to be lava tubes. Parts are even still volcanically active;
# small hydrothermal vents release smoke into the caves that slowly settles
# like rain.
# If you can model how the smoke flows through the caves, you might be able to
# avoid it and be that much safer. The submarine generates a heightmap of the
# floor of the nearby caves for you (your puzzle input).
# Smoke flows to the lowest point of the area it's in. For example, consider
# the following heightmap:
# 2199943210
# 3987894921
# 9856789892
# 8767896789
# 9899965678
# Each number corresponds to the height of a particular location, where 9 is
# the highest and 0 is the lowest a location can be.
# Your first goal is to find the low points - the locations that are lower than
# any of its adjacent locations. Most locations have four adjacent locations
# (up, down, left, and right); locations on the edge or corner of the map have
# three or two adjacent locations, respectively. (Diagonal locations do not
# count as adjacent.)
# In the above example, there are four low points, all highlighted: two are in
# the first row (a 1 and a 0), one is in the third row (a 5), and one is in the
# bottom row (also a 5). All other locations on the heightmap have some lower
# adjacent location, and so are not low points.
# The risk level of a low point is 1 plus its height. In the above example, the
# risk levels of the low points are 2, 1, 6, and 6. The sum of the risk levels
# of all low points in the heightmap is therefore 15.
# Find all of the low points on your heightmap. What is the sum of the risk
# levels of all low points on your heightmap?
from collections import defaultdict
with open("files/P9.txt") as f:
heightmap = [line for line in f.read().strip().split()]
heightmap_dic = defaultdict(int)
for i, line in enumerate(heightmap):
for j, number in enumerate(line):
if number != "9":
heightmap_dic[i, j] = int(number)
def is_low(x, y, value):
for neighbor in ((x - 1, y), (x + 1, y), (x, y + 1), (x, y - 1)):
if value > heightmap_dic.get(neighbor, 9):
break
else:
return True
def part_1() -> None:
res = 0
for pos, value in heightmap_dic.items():
if not is_low(*pos, value):
continue
res += value + 1
print(res)
if __name__ == "__main__":
part_1()