|
|
@@ -0,0 +1,33 @@ |
|
|
|
from itertools import count, takewhile |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def heights(t, dt): |
|
|
|
return takewhile(lambda h: h is not None, (grid.get(t + dt * i) for i in count(1))) |
|
|
|
|
|
|
|
|
|
|
|
def is_visible(t): |
|
|
|
return any(grid[t] > max(heights(t, dt), default=-1) for dt in udlr) |
|
|
|
|
|
|
|
|
|
|
|
def score(t): |
|
|
|
score = 1 |
|
|
|
for dt in udlr: |
|
|
|
count = 0 |
|
|
|
for h in heights(t, dt): |
|
|
|
count += 1 |
|
|
|
if h >= grid[t]: |
|
|
|
break |
|
|
|
score *= count |
|
|
|
return score |
|
|
|
|
|
|
|
|
|
|
|
udlr = [-1j, 1j, -1, 1] |
|
|
|
text = open(0).read() |
|
|
|
grid = {complex(x, y): int(v) for y, line in enumerate(text.splitlines(), 1) for x, v in enumerate(line, 1)} |
|
|
|
|
|
|
|
ans1 = sum(is_visible(t) for t in grid) |
|
|
|
print(ans1) |
|
|
|
|
|
|
|
ans2 = max(score(t) for t in grid) |
|
|
|
print(ans2) |