Initial commit: Days 1 - 5
This commit is contained in:
64
day05.sql
Normal file
64
day05.sql
Normal file
@@ -0,0 +1,64 @@
|
||||
with recursive
|
||||
|
||||
raw (line) as (
|
||||
select * from read_csv('data/05.in', header = false)
|
||||
),
|
||||
|
||||
ranges (low, high) as (
|
||||
select
|
||||
cast(spl[1] as int64),
|
||||
cast(spl[2] as int64)
|
||||
from (
|
||||
select split(line, '-') as spl
|
||||
from raw
|
||||
where contains(line, '-')
|
||||
)
|
||||
),
|
||||
|
||||
ingredients (id) as (
|
||||
select cast(line as int64)
|
||||
from raw
|
||||
where line <> '' and not contains(line, '-')
|
||||
),
|
||||
|
||||
part1 (solution) as (
|
||||
select count(*) from ingredients
|
||||
where exists (
|
||||
select
|
||||
low,
|
||||
high
|
||||
from ranges
|
||||
where id between low and high
|
||||
)
|
||||
),
|
||||
|
||||
merged (low, high) as (
|
||||
select * from ranges
|
||||
|
||||
union
|
||||
|
||||
select
|
||||
r1.low,
|
||||
case when r1.high < r2.high then r2.high else r1.high end
|
||||
from merged r1, merged r2
|
||||
where
|
||||
(r1.low < r2.low or (r1.low = r2.low and r1.high < r2.high))
|
||||
and not r1.high < r2.low and not r2.high < r1.low
|
||||
),
|
||||
|
||||
part2 (solution) as (
|
||||
select sum(m1.high - m1.low + 1) from merged m1
|
||||
where not exists (
|
||||
select *
|
||||
from merged m2
|
||||
where
|
||||
(m1.high <> m2.high or m1.low <> m2.low)
|
||||
and m1.high <= m2.high
|
||||
and m1.low >= m2.low
|
||||
)
|
||||
)
|
||||
|
||||
select
|
||||
part1.solution,
|
||||
part2.solution
|
||||
from part1, part2
|
||||
Reference in New Issue
Block a user