123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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()
|