I enjoyed this one! Windowing functions worked nicely for this.
WITH
raw_input AS (
SELECT
"""30373
25512
65332
33549
35390""" AS raw_text ),
raw_rows AS (
SELECT
o,
raw_row
FROM (
SELECT
SPLIT(raw_text, '\n') raw_row_array
FROM
raw_input ),
UNNEST(raw_row_array) raw_row WITH OFFSET o
),
split_rows AS (
SELECT SPLIT(raw_row, '') as split_row,
raw_row,
o
FROM raw_rows
), unnested_rows AS (
SELECT
raw_row,
o AS row_num,
col_num,
CAST(col AS INT) AS col
FROM split_rows,
UNNEST(split_row) col WITH offset col_num
), agg_rows as (
SELECT
ARRAY_AGG(col) OVER (PARTITION BY col_num ORDER BY row_num ASC) AS down,
ARRAY_AGG(col) OVER (PARTITION BY col_num ORDER BY row_num DESC) AS up,
ARRAY_AGG(col) OVER (PARTITION BY row_num ORDER BY col_num ASC) AS left_,
ARRAY_AGG(col) OVER (PARTITION BY row_num ORDER BY col_num DESC) AS right_,
col,
col_num,
row_num,
raw_row
FROM unnested_rows
), part_1 AS (
SELECT
COUNT(1)
FROM agg_rows
WHERE
-- if evaluates to null, is an edge tree
IFNULL(
col > (SELECT MAX(down[SAFE_OFFSET(o - 1)]) FROM UNNEST(down) x WITH OFFSET o) -- visible down
OR col > (SELECT MAX(up[SAFE_OFFSET(o - 1)]) FROM UNNEST(up) x WITH OFFSET o) -- visible up,
OR col > (SELECT MAX(left_[SAFE_OFFSET(o - 1)]) FROM UNNEST(left_) x WITH OFFSET o) -- visible left,
OR col > (SELECT MAX(right_[SAFE_OFFSET(o - 1)]) FROM UNNEST(right_) x WITH OFFSET o) -- visible right,
, TRUE)
), max_counts as (
SELECT
MAX(row_num) max_row,
MAX(col_num) max_col
FROM agg_rows
), line_of_sight AS (
SELECT
row_num - IFNULL((SELECT MAX(o) FROM UNNEST(down) x WITH OFFSET o WHERE x >= col AND o <> row_num), 0) AS down_visible,
(SELECT MAX(o) FROM UNNEST(up) x WITH OFFSET o WHERE x >= col AND o <> (max_row - row_num)) as up,
(max_row - row_num) - IFNULL((SELECT MAX(o) FROM UNNEST(up) x WITH OFFSET o WHERE x >= col AND o <> (max_row - row_num)), 0) AS up_visible,
col_num - IFNULL((SELECT MAX(o) FROM UNNEST(left_) x WITH OFFSET o WHERE x >= col AND o <> col_num), 0) AS left_visible,
(max_col - col_num) - IFNULL((SELECT MAX(o) FROM UNNEST(right_) x WITH OFFSET o WHERE x >= col AND o <> (max_col - col_num)), 0) AS right_visible,
*
FROM agg_rows, max_counts
)
-- SELECT * FROM part_1
SELECT MAX(down_visible * up_visible * left_visible * right_visible) AS max_scenic_score
FROM line_of_sight