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)