import fileinput from pprint import pprint inp = [[int(y) for y in x.strip()] for x in fileinput.input()] inp_ = list(zip(*inp)) part1 = 0 for y in range(1, len(inp) - 1): for x in range(1, len(inp[0]) - 1): x_min_max = max(inp_[x][:y]) y_min_max = max(inp[y][:x]) x_max_max = max(inp_[x][y + 1 :]) y_max_max = max(inp[y][x + 1 :]) n = inp[y][x] if n > x_min_max or n > y_min_max or n > x_max_max or n > y_max_max: part1 += 1 part1 += (len(inp) - 1) * 4 def viewing_dist(x: int, y: int, dx: int, dy: int) -> int: dist = 0 n = inp[y][x] m = 0 while n > m: x += dx y += dy if x < 0 or y < 0 or y >= len(inp) or x >= len(inp[0]): break dist += 1 m = inp[y][x] return dist scores = [] for y in range(1, len(inp) - 1): for x in range(1, len(inp[0]) - 1): a = viewing_dist(x, y, 0, -1) b = viewing_dist(x, y, -1, 0) c = viewing_dist(x, y, 1, 0) d = viewing_dist(x, y, 0, 1) scores.append(a * b * c * d) print(part1, max(scores))