| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #!/usr/bin/env python3
- import sys
- def parse(f):
- first = next(f).rstrip()
- grid = list(map(int, first))
- for line in f:
- grid.extend(map(int, line.rstrip()))
- return grid, len(first)
- def visible(grid, size):
- vis = [False] * len(grid)
- def walk(start, step):
- prev = -1
- for i in range(start, start + step * size, step):
- tree = grid[i]
- if tree > prev:
- vis[i] = True
- prev = tree
- for i in range(size):
- walk(i, size)
- walk(len(grid) - i - 1, -size)
- walk(i * size, 1)
- walk((i + 1) * size - 1, -1)
- return sum(vis)
- def score(grid, size, i):
- def walk(step, stop):
- vis = 0
- for j in range(i + step, stop, step):
- vis += 1
- if grid[j] >= grid[i]:
- break
- j += step
- return vis
- return walk(1, i + size - i % size) \
- * walk(-1, i - i % size - 1) \
- * walk(size, len(grid)) \
- * walk(-size, -1)
- grid, size = parse(sys.stdin)
- print(visible(grid, size))
- print(max(score(grid, size, i) for i in range(len(grid))))
|