1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
def move_on_trail(summits_found: set[tuple[int, int]], map_positions: list[list[int]], current_row: int, current_col: int, next_height: int) -> None:
row_count = len(map_positions)
col_count = len(map_positions[0])
for dir_row, dir_col in ((-1, 0), (1, 0), (0, -1), (0, 1)):
next_row = current_row + dir_row
next_col = current_col + dir_col
if not (0 <= next_row < row_count and 0 <= next_col < col_count):
continue
if map_positions[next_row][next_col] == next_height:
if next_height == 9:
summits_found.add((next_row, next_col))
else:
move_on_trail(summits_found, map_positions, next_row, next_col, next_height + 1)
def get_trailhead_score(map_positions: list[list[int]], head_row: int, head_col: int) -> int:
summits_reached = set()
move_on_trail(summits_reached, map_positions, head_row, head_col, 1)
return len(summits_reached)
data = []
with open("input") as f:
for line in f:
data.append([int(elem) for elem in tuple(line.strip())])
count = 0
for row, line in enumerate(data):
for col, height in enumerate(line):
if height == 0:
count += get_trailhead_score(data, row, col)
print(count)
|