#!/usr/bin/env python import dataclasses import sys from collections.abc import Iterator @dataclasses.dataclass class Point: x: int y: int def solve(input: list[list[int]]) -> int: def up(p: Point) -> Iterator[Point]: x = p.x while (x := x - 1) >= 0: yield Point(x, p.y) def down(p: Point) -> Iterator[Point]: x = p.x while (x := x + 1) < len(input): yield Point(x, p.y) def left(p: Point) -> Iterator[Point]: y = p.y while (y := y - 1) >= 0: yield Point(p.x, y) def right(p: Point) -> Iterator[Point]: y = p.y while (y := y + 1) < len(input[0]): yield Point(p.x, y) def visible_trees(p: Point, neighbours: Iterator[Point]) -> Iterator[Point]: height = input[p.x][p.y] for n in neighbours: yield n if height <= input[n.x][n.y]: break def score(p: Point) -> int: score = 1 for neighbours in (up, down, left, right): score *= len(list(visible_trees(p, neighbours(p)))) return score scores = [ [score(Point(x, y)) for y in range(len(input[x]))] for x in range(len(input)) ] return max(map(max, scores)) def main() -> None: input = [[int(c) for c in line] for line in sys.stdin.read().splitlines()] print(solve(input)) if __name__ == "__main__": main()