From 6719edb9150384c4bb241986082df6078b7305a4 Mon Sep 17 00:00:00 2001 From: Sebastian Mark Date: Wed, 11 Dec 2024 23:30:06 +0100 Subject: [PATCH] add 2022/day08.1 --- 2022/08/main.py | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 2022/08/main.py diff --git a/2022/08/main.py b/2022/08/main.py new file mode 100644 index 0000000..c5d4fbe --- /dev/null +++ b/2022/08/main.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# -*- encoding: utf-8; py-indent-offset: 4 -*- + +# Author: Sebastian Mark +# CC-BY-SA (https://creativecommons.org/licenses/by-sa/4.0/deed.de) + +# pylint: disable=missing-module-docstring,missing-function-docstring,consider-using-f-string + + +def readinput(): + with open("input", "r", encoding="utf-8") as file: + lines = [list(line.strip()) for line in file] + return lines + + +def is_visible(trees: list, tree_y: int, tree_x: int) -> bool: + height = len(trees) + width = len(trees[0]) + + # edges are always visible + if not 0 < tree_y < height - 1 or not 0 < tree_x < width - 1: + return True + + # check up, right, down, right + directions = [(-1, 0), (0, 1), (1, 0), (0, -1)] + for dy, dx in directions: + nxty = tree_y + dy + nxtx = tree_x + dx + # continue to check in the direction til border + is_biggest = True + while 0 <= nxty < height and 0 <= nxtx < width: + # check size, stop searching if bigger tree found + if trees[tree_y][tree_x] <= trees[nxty][nxtx]: + is_biggest = False + break + + nxtx += dx + nxty += dy + + if is_biggest: + return True + + return False + + +def main(): + trees = readinput() + + visible = 0 + for y in range(len(trees)): + for x in range(len(trees[0])): + if is_visible(trees, y, x): + visible += 1 + + print("Visible trees: %d" % visible) + + +if __name__ == "__main__": + main()