feat: days 1 2 3 done with duckdb
This commit is contained in:
49
solutions/02.sql
Normal file
49
solutions/02.sql
Normal file
@@ -0,0 +1,49 @@
|
||||
create or replace table day02_data as
|
||||
with input1 as (
|
||||
select unnest(split(column0, ',')) as ranges
|
||||
from read_csv('inputs/02/input.txt', header=false, delim='\n'))
|
||||
select
|
||||
split(ranges, '-')[1]::long as range_start,
|
||||
split(ranges, '-')[2]::long as range_end
|
||||
from input1;
|
||||
|
||||
create or replace table day02_test as
|
||||
with input1 as (
|
||||
select unnest(split(column0, ',')) as ranges
|
||||
from read_csv('inputs/02/test.txt', header=false, delim='\n'))
|
||||
select
|
||||
split(ranges, '-')[1]::long as range_start,
|
||||
split(ranges, '-')[2]::long as range_end
|
||||
from input1;
|
||||
|
||||
create or replace table day02_product_list as
|
||||
select unnest(generate_series(range_start, range_end))::string as product_id
|
||||
from day02_data;
|
||||
|
||||
select sum(product_id::long) as part1
|
||||
from day02_product_list
|
||||
where LENGTH(product_id) % 2 == 0
|
||||
and product_id[:(LENGTH(product_id)/2)] == product_id[(LENGTH(product_id)/2)+1:];
|
||||
|
||||
with split_lengths as (
|
||||
select product_id,
|
||||
length(product_id) as len,
|
||||
(
|
||||
select array_agg(l)
|
||||
from generate_series(1, length(product_id)-1) as t(l)
|
||||
where length(product_id) % l == 0
|
||||
) as lengths
|
||||
from day02_product_list
|
||||
),
|
||||
with_chunks as (
|
||||
select product_id, chunk_size,
|
||||
(
|
||||
select array_agg(substring(product_id, (j-1)*chunk_size+1, chunk_size))
|
||||
from generate_series(1, ceil(length(product_id)/chunk_size)::int) as u(j)
|
||||
) as chunks
|
||||
FROM split_lengths, unnest(lengths) as t(chunk_size)
|
||||
)
|
||||
select sum(distinct product_id::long) as part2
|
||||
from with_chunks
|
||||
where length(array_distinct(chunks)) = 1
|
||||
;
|
||||
Reference in New Issue
Block a user