feat: add day5 6 7
This commit is contained in:
78
solutions/06.sql
Normal file
78
solutions/06.sql
Normal file
@@ -0,0 +1,78 @@
|
||||
create or replace table day06_data as
|
||||
select row_number() over () as line, column0
|
||||
from read_csv('inputs/06/input.txt', header=false, delim='\n');
|
||||
create or replace table day06_test as
|
||||
select row_number() over () as line, column0
|
||||
from read_csv('inputs/06/test.txt', header=false, delim='\n');
|
||||
|
||||
|
||||
create or replace table day06_input as
|
||||
with raw as (
|
||||
select line as y,
|
||||
array_filter(split(column0, ' '), lambda x: x != '') as s
|
||||
from day06_data
|
||||
), splitted as (
|
||||
select x, y, elem
|
||||
from raw,
|
||||
unnest(s) with ordinality as u(elem, x)
|
||||
), rotated as (
|
||||
select array_agg(elem order by y) as rot
|
||||
from splitted
|
||||
group by x
|
||||
)
|
||||
select rot[-1] as op, list_apply(rot[:-2], lambda x: x::int) as num
|
||||
from rotated;
|
||||
|
||||
select sum(
|
||||
case when op = '+' then list_sum(num)
|
||||
when op = '*' then list_product(num)
|
||||
else 0
|
||||
end
|
||||
)::long as part1
|
||||
from day06_input;
|
||||
|
||||
create or replace table day06_input2 as
|
||||
with rotated as (
|
||||
select
|
||||
x,
|
||||
array_agg(elem order by line) rot
|
||||
from day06_data,
|
||||
unnest(split(column0, '')) with ordinality as u(elem, x)
|
||||
group by x
|
||||
order by x
|
||||
), cleaned as (
|
||||
select
|
||||
x,
|
||||
any_value(rot[-1]) as op,
|
||||
reverse(string_agg(n, '')) as num
|
||||
from rotated, unnest(array_filter(rot[:-2], lambda x: x != ' ')) as u(n)
|
||||
group by x
|
||||
), with_breaks as (
|
||||
select
|
||||
x, op, num::int as num,
|
||||
case when lag(x) over (order by x) = x - 1 then 0 else 1 end as is_break
|
||||
from cleaned
|
||||
), with_groups as (
|
||||
select
|
||||
x, op, num,
|
||||
sum(is_break) over (order by x rows unbounded preceding) as group_id
|
||||
from with_breaks
|
||||
), grouped as (
|
||||
select
|
||||
group_id,
|
||||
max(op) as op,
|
||||
array_agg(num) as nums
|
||||
from with_groups
|
||||
group by group_id
|
||||
)
|
||||
select *
|
||||
from grouped;
|
||||
|
||||
select sum(
|
||||
case when op = '+' then list_sum(nums)
|
||||
when op = '*' then list_product(nums)
|
||||
else 0
|
||||
end
|
||||
)::long as part2
|
||||
from day06_input2;
|
||||
|
||||
Reference in New Issue
Block a user