#!/usr/bin/env python3 from typing import TextIO # left # right # up # down trees = [] def part1(heights: TextIO) -> int: visible = 0 for row in heights: trees.append([int(num) for num in row.strip()]) for row in range(len(trees)): for tree in range(len(trees[row])): if tree in ( 0, len(trees[row]) - 1, ) or row in (0, len(trees) - 1): visible += 1 elif ( all(x < trees[row][tree] for x in trees[row][:tree]) or all(x < trees[row][tree] for x in trees[row][tree + 1 :]) or all(trees[row][tree] > trees[x][tree] for x in range(row)) or all( trees[row][tree] > trees[x][tree] for x in range(row + 1, len(trees)) ) ): visible += 1 return visible def part2() -> int: scores = [] for row in range(len(trees)): for c in range(len(trees[row])): left = 0 right = 0 up = 0 down = 0 # ?? if c in ( 0, len(trees[row]) - 1, ) or row in (0, len(trees) - 1): continue # score will be 0 anyways, disregard # left score for x in reversed(trees[row][:c]): if trees[row][c] > x: left += 1 else: left += 1 break # right score for x in trees[row][c + 1 :]: if trees[row][c] > x: right += 1 else: right += 1 break # up for x in reversed(range(row)): if trees[row][c] > trees[x][c]: up += 1 else: up += 1 break # down for x in range(row + 1, len(trees)): if trees[row][c] > trees[x][c]: down += 1 else: down += 1 break scores.append(left * right * up * down) return max(scores) if __name__ == "__main__": print(part1(open("day08.txt"))) print(part2())