使用DuckDB 正则函数求解Advent of Code 2024第3题

编程达人挑战赛·第4期 10w+人浏览 365人参与

原题地址 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值