# Transpose a list of lists in Python using itertools
from itertools import zip_longest

def transpose(l):
    return zip_longest(*l, fillvalue=None)

grid = [[int(c) for c in s.strip()] for s in open("8.input")]

visible = set()

def get_vis(line):
    visible = []

    visible.append(0)
    visible.append(len(line) - 1)

    for i in range(1, len(line) - 1):
        if line[i] > max(line[0:i]) or line[i] > max(line[i+1:]):
            visible.append(i)

    return visible

for y, line in enumerate(grid):
    for x in get_vis(line):
        visible.add((x, y))

for x, line in enumerate(transpose(grid)):
    for y in get_vis(line):
        visible.add((x, y))

print("Part 1:", len(visible))

def get_score(base, segment):
    if len(segment) == 0:
        return 0

    score = 1

    for s in segment:
        if s >= base:
            break
        score += 1
    else:
        score -= 1

    return score

scores = {}

transposed = list(transpose(grid))

def all_scores(grid, transposed, x, y):
    base = grid[x][y]
    return get_score(base, grid[x][y+1:]) *\
           get_score(base, list(reversed(grid[x][:y]))) *\
           get_score(base, list(transposed[y][x+1:])) *\
           get_score(base, list(reversed(transposed[y][:x])))

for x in range(0, len(grid)):
    for y in range(0, len(grid)):
        scores[(x, y)] = all_scores(grid, transposed, x, y)

print("Part 2:", max(scores.values()))