|
|
@@ -1,110 +0,0 @@ |
|
|
|
MAP = [] |
|
|
|
DEBUG = False |
|
|
|
|
|
|
|
class Tree: |
|
|
|
def __init__(self, x_pos, y_pos, height): |
|
|
|
self.x = x_pos |
|
|
|
self.y = y_pos |
|
|
|
self.height = height |
|
|
|
self.view_up = 0 |
|
|
|
self.view_down = 0 |
|
|
|
self.view_left = 0 |
|
|
|
self.view_right = 0 |
|
|
|
|
|
|
|
def check_left(self): |
|
|
|
if DEBUG: |
|
|
|
print("### Checking left ###") |
|
|
|
trees = MAP[self.y][:self.x] |
|
|
|
tallest = 0 |
|
|
|
distance = 0 |
|
|
|
tallest_distance = 0 |
|
|
|
for tree in trees[::-1]: |
|
|
|
distance += 1 |
|
|
|
if DEBUG: |
|
|
|
print(f"{self.height=}, {tree=}, {distance=}, {tallest=}, {tallest_distance=}") |
|
|
|
if tree >= self.height: |
|
|
|
tallest_distance = distance |
|
|
|
break |
|
|
|
if tree > tallest: |
|
|
|
tallest = tree |
|
|
|
tallest_distance = distance |
|
|
|
self.view_left = tallest_distance |
|
|
|
|
|
|
|
def check_right(self): |
|
|
|
if DEBUG: |
|
|
|
print("### Checking right ###") |
|
|
|
trees = MAP[self.y][self.x+1:] |
|
|
|
tallest, distance, tallest_distance = 0, 0, 0 |
|
|
|
for tree in trees: |
|
|
|
distance += 1 |
|
|
|
if DEBUG: |
|
|
|
print(f"{self.height=}, {tree=}, {distance=}, {tallest=}, {tallest_distance=}") |
|
|
|
if tree >= self.height: |
|
|
|
tallest_distance = distance |
|
|
|
break |
|
|
|
if tree > tallest: |
|
|
|
tallest = tree |
|
|
|
tallest_distance = distance |
|
|
|
self.view_right = tallest_distance |
|
|
|
|
|
|
|
def check_up(self): |
|
|
|
if DEBUG: |
|
|
|
print("### Checking up ###") |
|
|
|
trees = [row[self.x] for row in MAP[:self.y]] |
|
|
|
tallest, distance, tallest_distance = 0, 0, 0 |
|
|
|
for tree in trees[::-1]: |
|
|
|
distance += 1 |
|
|
|
if DEBUG: |
|
|
|
print(f"{self.height=}, {tree=}, {distance=}, {tallest=}, {tallest_distance=}") |
|
|
|
if tree >= self.height: |
|
|
|
tallest_distance = distance |
|
|
|
break |
|
|
|
if tree > tallest: |
|
|
|
tallest = tree |
|
|
|
tallest_distance = distance |
|
|
|
self.view_up = tallest_distance |
|
|
|
|
|
|
|
def check_down(self): |
|
|
|
if DEBUG: |
|
|
|
print("### Checking down ###") |
|
|
|
trees = [row[self.x] for row in MAP[self.y+1:]] |
|
|
|
tallest, distance, tallest_distance = 0, 0, 0 |
|
|
|
for tree in trees: |
|
|
|
distance += 1 |
|
|
|
if DEBUG: |
|
|
|
print(f"{self.height=}, {tree=}, {distance=}, {tallest=}, {tallest_distance=}") |
|
|
|
if tree >= self.height: |
|
|
|
tallest_distance = distance |
|
|
|
break |
|
|
|
if tree > tallest: |
|
|
|
tallest = tree |
|
|
|
tallest_distance = distance |
|
|
|
self.view_down = tallest_distance |
|
|
|
|
|
|
|
@property |
|
|
|
def scenic_score(self): |
|
|
|
self.check_down() |
|
|
|
self.check_up() |
|
|
|
self.check_left() |
|
|
|
self.check_right() |
|
|
|
return self.view_down + self.view_up + self.view_left + self.view_right |
|
|
|
|
|
|
|
def main(): |
|
|
|
global MAP, DEBUG |
|
|
|
with open("day08.input", "r") as file: |
|
|
|
lines = [line.strip() for line in file.readlines()] |
|
|
|
MAP = [[int(char) for char in line] for line in lines] |
|
|
|
|
|
|
|
trees = [] |
|
|
|
for y, line in enumerate(MAP): |
|
|
|
for x, tree in enumerate(line): |
|
|
|
trees.append(Tree(x, y, tree)) |
|
|
|
|
|
|
|
max_score = max(trees, key=lambda t: t.scenic_score) |
|
|
|
# max_score = Tree(67, 38, MAP[38][67]) |
|
|
|
# DEBUG = True |
|
|
|
print(max_score.scenic_score) |
|
|
|
print(max_score.__dict__) |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
main() |