diff --git a/src/day8.py b/src/day8.py new file mode 100644 index 0000000..cdaa7a7 --- /dev/null +++ b/src/day8.py @@ -0,0 +1,83 @@ +from typing import Optional + +from cpl_core.console import Console +from cpl_core.utils import String +from cpl_query.enumerable import Enumerable +from cpl_query.extension import List +from cpl_core.pipes import * + +from aoc.aoc import get_input + +# global vars +day = 8 +aoc_input = get_input(2022, day) +aoc_input1 = """30373 +25512 +65332 +33549 +35390""" + + +def parse(lines: str) -> List[List[int]]: + grid = List(List) + for line in lines.splitlines(): + trees = List(int) + for tree in line: + trees.add(int(tree)) + + grid.add(trees) + + return grid + + +def main(grid: List[List[int]]) -> tuple[int, int]: + # consideration for refactoring part1: select bools then select many count + visible = List(int) + scenic_scores = List(int) + for i, trees in enumerate(grid): + if i == 0 or i == grid.count() - 1: + visible.extend(trees) + continue + + for n, t in enumerate(trees): + if n == 0 or n == trees.count() - 1: + visible.add(t) + continue + + up = all([t > grid[x][n] for x in range(i - 1, -1, -1)]) + down = all([t > grid[x][n] for x in range(i + 1, len(grid))]) + left = all([t > x for x in trees[:n]]) + right = all([t > x for x in trees[n + 1:]]) + + for l in range(n + 1, grid.first().count()): + if trees[l] >= t: + break + + for r in range(n - 1, -1, -1): + if trees[r] >= t: + break + + for d in range(i + 1, grid.count()): + if grid[d][n] >= t: + break + + for u in range(i - 1, -1, -1): + if grid[u][n] >= t: + break + + # im not proud of this shit + score = (l - n) * (n - r) * (d - i) * (i - u) + scenic_scores.add(score) + + if up or down or left or right: + visible.add(t) + + return visible.count(), scenic_scores.max() + + +if __name__ == '__main__': + Console.write_line(f'Advent of code day {day}') + tree_map = parse(aoc_input) + p1 = main(tree_map) + Console.write_line(p1) + Console.write_line()