96 lines
2.3 KiB
Python
96 lines
2.3 KiB
Python
|
#!/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())
|