原题地址 https://adventofcode.com/2024/day/3
题目很长,实质就是从文本字符串中提取出所有符合mul(数字1,数字2)的模式,然后把每个匹配的数字1乘以数字2,然后再求和。
with t as (select 'xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))'z )
,t2 as(select regexp_extract_all(z, 'mul\(*(\d+),*(\d+)\)', 1) l ,regexp_extract_all(z, 'mul\(*(\d+),*(\d+)\)', 2) r from t)
select sum(l*r)from (select unnest(l)::int l,unnest(r)::int r from t2);
答案是161,可以把字符串字面量改成from read_text函数读取文件内容。
另一种写法,正则匹配一次性提取两个数字,再用字典键取值。
select sum(ls['1']::int*ls['2']::int) from
(select unnest(regexp_extract_all('xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))', 'mul\(*(\d+),*(\d+)\)', ['1','2']))ls);

252

被折叠的 条评论
为什么被折叠?



