diff --git a/2022/d08/ex1/ex1.py b/2022/d08/ex1/ex1.py new file mode 100755 index 0000000..204f855 --- /dev/null +++ b/2022/d08/ex1/ex1.py @@ -0,0 +1,55 @@ +#!/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 is_visible(p: Point) -> bool: + height = input[p.x][p.y] + for neighbours in (up, down, left, right): + if all(input[n.x][n.y] < height for n in neighbours(p)): + return True + return False + + visibility = [ + [is_visible(Point(x, y)) for y in range(len(input[x]))] + for x in range(len(input)) + ] + return sum(map(sum, visibility)) + + +def main() -> None: + input = [[int(c) for c in line] for line in sys.stdin.read().splitlines()] + print(solve(input)) + + +if __name__ == "__main__": + main()