with recursive

grid (line, row) as (
    select
        unnest(line),
        generate_subscripts(line, 1) as row
    from (
        select string_split(trim(content, e'\n'), e'\n') as line
        from read_text('data/07.in')
    )
),

dims as (
    select
        max(row) as height,
        max(length(line)) as width
    from grid
),

initial as (
    select col from range(1, (select width from dims)) r (col), grid
    where row = 1 and line[col] <> '.'
),

trace (depth, col, num) as (
    select
        1,
        col,
        cast(1 as int128)
    from initial

    union

    select
        depth,
        col,
        sum(num)
    from
        (
            select
                depth + 1 as depth,
                unnest(
                    case
                        when line[col] = '^'
                            then [col - 1, col + 1]
                        else [col]
                    end
                ) as col,
                num
            from
                trace, grid
            where
                depth + 1 = row
        )
    group by depth, col
),

part1 (solution) as (
    select count(*) from trace, grid
    where line[col] = '^' and depth + 1 = row
),

part2 (solution) as (
    select sum(num) from trace
    where depth = (select height from dims)
)

select
    part1.solution as p1,
    part2.solution as p2
from part1, part2;
