利用DeepSeek辅助DuckDB SQL求解Advent of Code 2025第10题 电子工厂

前期嫌SQL处理麻烦和性能不足,用python做过一个,
最近看到clickhouse微信公众号文章用纯 SQL 硬刚 Advent of Code?ClickHouse 把「不可能」变成了 12 天的现实。
看到了希望,所以用DuckDB SQL重新做过。

第一部分格式转换代码如下,都是自己完成的:

withrecursive tas(select'[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7} [...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2} [.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5}'t),bas(selectrow_number()over()rn,reverse(substr(b,2,instr(b,']')-2))b1,--信号灯字符串,格式.##.,注意要翻转字符串substr(b,instr(b,']')+2,instr(b,'{')-3-instr(b,']'))b2,--按钮字符串,格式(3) (1,3) (2) (2,3) (0,2) (0,1)substr(b,instr(b,'{')+1,instr(b,'}')-1-instr(b,'{'))b3,--伏特字符串,格式3,5,4,7translate(b1,'#.','10')::bit::intb1a,--转二进制位再转整数list_reduce([0]||string_split(unnest(string_split(replace(replace(b2,')',''),'(',''),' ')),',')::int[],lambda x,y :(x+(1<<y)))b2a,--按钮转成整数列表string_split(b3,',')::int[]b3a,from(selectunnest(string_split(t,chr(10)))bfromt)),das(selectrn,b1a,array_agg(b2a)a,b3afrombgroupbyall)fromdorderbyrn;

示例数据子查询d的结果如下

┌───────┬───────┬──────────────────────┬────────────────────────┐ │ rn │ b1a │ a │ b3a │ │ int64 │ int32 │ int32[] │ int32[] │ ├───────┼───────┼──────────────────────┼────────────────────────┤ │ 1 │ 6 │ [8, 10, 4, 12, 5, 3] │ [3, 5, 4, 7] │ │ 2 │ 8 │ [29, 12, 17, 7, 30] │ [7, 5, 12, 7, 2] │ │ 3 │ 46 │ [31, 25, 55, 6] │ [10, 11, 11, 5, 10, 5] │ └───────┴───────┴──────────────────────┴────────────────────────┘

一开始没注意信号灯字符串从左到右是从低位到高位,没做翻转,导致算错了b1a。

┌───────┬───────┬──────────────────────┬────────────────────────┐ │ rn │ b1a │ a │ b3a │ │ int64 │ int32 │ int32[] │ int32[] │ ├───────┼───────┼──────────────────────┼────────────────────────┤ │ 1 │ 6 │ [8, 10, 4, 12, 5, 3] │ [3, 5, 4, 7] │ │ 2 │ 2 │ [29, 12, 17, 7, 30] │ [7, 5, 12, 7, 2] │ │ 3 │ 29 │ [31, 25, 55, 6] │ [10, 11, 11, 5, 10, 5] │ └───────┴───────┴──────────────────────┴────────────────────────┘

DeepSeek辅助完成将每行按钮的各种组合求出。

我有一个数组a,包含n个元素,请用duckdb语法编写一句SQL,输出数组a的全部子集,比如[1,3]输出[],[1],[3],[1,3],

可以使用 DuckDB 的UNNEST配合WITH RECURSIVE递归生成子集。以下是 SQL 语句:

WITHRECURSIVE subsetsAS(-- 初始:空子集SELECT[]ASsubset,1ASlevelUNIONALL-- 递归:逐个添加元素SELECTarray_append(subset,a.val)ASsubset,level+1ASlevelFROMsubsets,UNNEST([1,3])WITHORDINALITYASa(val,idx)WHEREa.idx>=level)SELECTsubsetFROMsubsetsORDERBYcardinality(subset),subset;

如果不需要递归,也可以直接使用GENERATE_SERIES配合位运算:

WITHarrAS(SELECT[1,3]ASa)SELECT(SELECTarray_agg(a[i])FROMgenerate_series(1,array_length(a))ASiWHERE(bitpos>>(i-1))&1=1)ASsubsetFROMarr,generate_series(0,(1<<array_length(a))-1)ASbits(bitpos);

两种方法都可以输出所有子集:

  • []
  • [1]
  • [3]
  • [1, 3]

你可以根据 DuckDB 的版本和性能需求选择合适的方法。第一种递归方法更直观,第二种位运算方法通常性能更好。

我选的是第二种,如下语句把每种组合的两两异或结果算出,然后与要求的数比较。

,sas(SELECTrn,bitpos,b1a,(SELECTarray_agg(a[i])FROMgenerate_series(1,array_length(a))t(i)WHERE(bitpos>>(i-1))&1=1)ASsubsetFROMd,generate_series(1,(1<<array_length(a))-1)ASbits(bitpos))selectrn,b1a,bitpos,subset,bit_count(bitpos)fromswherelist_reduce(subset,lambda x,y :xor(x,y))=b1aorderbyrn,5;

结果如下,按压次数最少的组合已标记。

┌───────┬───────┬────────┬──────────────────┬───────────────────┐ │ rn │ b1a │ bitpos │ subset │ bit_count(bitpos) │ │ int64 │ int32 │ int64 │ int32[] │ int8 │ ├───────┼───────┼────────┼──────────────────┼───────────────────┤ │ 1 │ 6 │ 48 │ [5, 3] │ 2 │<-- │ 1 │ 6 │ 10 │ [10, 12] │ 2 │ │ 1 │ 6 │ 7 │ [8, 10, 4] │ 3 │ │ 1 │ 6 │ 61 │ [8, 4, 12, 5, 3] │ 5 │ │ 2 │ 8 │ 28 │ [17, 7, 30] │ 3 │<-- │ 2 │ 8 │ 27 │ [29, 12, 7, 30] │ 4 │ │ 3 │ 46 │ 6 │ [25, 55] │ 2 │<-- │ 3 │ 46 │ 13 │ [31, 55, 6] │ 3 │ └───────┴───────┴────────┴──────────────────┴───────────────────┘

最后按原始行号分组求最小值,再加总。

selectsum(minstep)from(selectrn,min(bit_count(bitpos))minstep--按压组合二进制数的1的个数就是按压次数fromswherelist_reduce(subset,lambda x,y :xor(x,y))=b1agroupbyrn);

对于示例数据,结果如下,和题目给出的一致

┌──────────────┐ │ sum(minstep) │ │ int128 │ ├──────────────┤ │ 7 │ └──────────────┘

对于我的正式测试数据,结果和用时如下,不算太快

┌──────────────┐ │ sum(minstep) │ │ int128 │ ├──────────────┤ │ 527 │ └──────────────┘ Run Time (s): real 0.328 user 1.588000 sys 0.052000

这里发现Advent of Code的测试题库也是有重复的,这个结果和clickhouse公众号的一致。

理论上本题用递归更合适,因为要求最少按压次数,只要求出一个解就可以退出迭代了,而全组合是穷举。第二部分题目的数据量不可能用穷举解决。

再用第一种方法试做一遍,直接使用DeepSeek的语句报错

Binder Error: Cardinality can only operate on MAPs

去掉cardinality函数输出如下,有多余的[3, 3]

┌─────────┐ │ subset │ │ int32[] │ ├─────────┤ │ [] │ │ [1] │ │ [3] │ │ [1, 3] │ │ [3, 3] │ └─────────┘

需要改成如下,规定后加的元素索引必须要大于前面最后一个的索引,不允许重复使用,才能得到正确结果。

WITHRECURSIVE subsetsAS(-- 初始:空子集SELECT[]ASsubset,1ASlevel,0lastidxUNIONALL-- 递归:逐个添加元素SELECTarray_append(subset,a.val)ASsubset,level+1ASlevel,idxFROMsubsets,UNNEST([1,2,3])WITHORDINALITYASa(val,idx)WHEREa.idx>lastidx)SELECTsubsetFROMsubsets;┌───────────┐ │ subset │ │ int32[]│ ├───────────┤ │[]│ │[1]│ │[2]│ │[3]│ │[1,2]│ │[1,3]│ │[2,3]│ │[1,2,3]│ └───────────┘

再结合本题的业务逻辑,找到就不再迭代。

,subsetsAS(-- 初始:空子集SELECTrn,[]ss,0xor_val,0ASlevel,0lastidxfromdUNIONALL-- 递归:逐个添加元素SELECTs.rn,ss||[a.val],xor(xor_val,a.val),level+1ASlevel,idxFROMsubsets s,d,unnest(a)WITHORDINALITYASa(val,idx)WHEREa.idx>lastidxands.rn=d.rnandnotexists(select1fromd d1wherexor_val=b1aands.rn=d1.rn))SELECTs.rn,xor_val,level,ssFROMsubsets s,d d1wherexor_val=b1aands.rn=d1.rnorderbys.rn,level;┌───────┬─────────┬───────┬──────────────────┐ │ rn │ xor_val │level│ ss │ │ int64 │ int32 │ int32 │ int32[]│ ├───────┼─────────┼───────┼──────────────────┤ │162[5,3]<--162[10,12]│ │163[8,10,4]│ │165[8,4,12,5,3]│ │283[17,7,30]<--284[29,12,7,30]│ │3462[25,55]<--3463[31,55,6]│ └───────┴─────────┴───────┴──────────────────┘

和前面穷举的结果完全一致。按原始行号分组求最小值,再加总。

,ras(SELECTs.rn,xor_val,level,ssFROMsubsets s,d d1wherexor_val=b1aands.rn=d1.rnorderbys.rn,level)selectsum(minl)from(selectrn,min(level)minlfromrgroupbyrn);┌───────────┐ │sum(minl)│ │ int128 │ ├───────────┤ │7│ └───────────┘

使用正式测试数据,用时反而更长

┌───────────┐ │ sum(minl) │ │ int128 │ ├───────────┤ │ 527 │ └───────────┘ Run Time (s): real 0.633 user 1.632000 sys 0.312000

尝试去掉不必要的ss,将a和b1a的数据带入subset查询,减少一次表连接,仍然不如穷举,可能是递归中not exists检查还是做了表连接的原因。

Run Time (s): real 0.472 user 1.252000 sys 0.152000

最后加了一个found标记,用分析函数找出当前rn中是否有找到的,消除not exists检查,快了。

,subsetsAS(-- 初始:空子集SELECTrn,a,b1a,0found,0xor_val,0ASlevel,0lastidxfromdUNIONALL-- 递归:逐个添加元素SELECTs.rn,s.a,s.b1a,max(s.xor_val=s.b1a)over(partitionbys.rn),xor(xor_val,a.val),level+1ASlevel,idxFROMsubsets s,unnest(a)WITHORDINALITYASa(val,idx)WHEREa.idx>lastidxandnotfound),ras(SELECTs.rn,xor_val,levelFROMsubsets swherexor_val=b1aorderbys.rn,level)selectsum(minl)from(selectrn,min(level)minlfromrgroupbyrn);┌───────────┐ │sum(minl)│ │ int128 │ ├───────────┤ │527│ └───────────┘ RunTime(s):real0.236user0.608000sys0.152000

看了一下clickhouse第一部分的解法,也是穷举。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1191003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSM286的旅游网站掌柜有礼vue

目录SSM286旅游网站掌柜有礼Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM286旅游网站掌柜有礼Vue摘要 SSM286旅游网站采用Vue.js作为前端框架&#xff0c;结合Spring、SpringMVC和MyBatis&#xff08;SSM&#xf…

ARM Cortex-M 存储器系统详解

ARM Cortex-M 存储器系统详解 文章目录 ARM Cortex-M 存储器系统详解一、 核心架构基础1.1 统一存储器编址与多总线并行&#xff08;混合架构&#xff09;1.2 预定义的存储器映射 二、 关键特性详解2.1 位带操作2.2 存储器保护单元2.3 缓存2.4 紧耦合内存2.5 字节序支持2.6 非对…

阿里拿38K出来的大佬良心分享,熬夜整理10 万字详细Java面试笔记!

国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度。这是由于互联网IT行业的求职者太多了&#xff0c;如果考察的是清一溜的算法题和设计题&#xff0c;那么会要求面试官有极高的技术水平&#xff0c;还要花大量的时间成本和精力。所以&#xff0c;八股文面试也…

psql 中的流水线操作(PostgreSQL 18)

原文地址 https://postgresql.verite.pro/blog/2025/10/01/psql-pipeline.html psql 中的流水线操作&#xff08;PostgreSQL 18&#xff09; 2025 年 10 月 1 日 Postgres 中的流水线是什么&#xff1f; 流水线是网络协议支持的一种客户端特性&#xff0c;其核心思想是&#xf…

深度测评8个AI论文写作软件,本科生轻松搞定毕业论文!

深度测评8个AI论文写作软件&#xff0c;本科生轻松搞定毕业论文&#xff01; AI 工具如何让论文写作变得轻松高效&#xff1f; 在当前的学术环境中&#xff0c;越来越多的本科生开始借助 AI 工具来辅助论文写作。无论是开题报告、文献综述还是最终的论文撰写&#xff0c;这些工…

汉字:世界语言之王的硬核底气,人类文明的天花板级存在

汉字&#xff1a;世界语言之王的硬核底气&#xff0c;人类文明的天花板级存在一、开篇・从一场梦到 “字相”&#xff1a;解锁汉字的活态魅力1.1 缘起&#xff1a;一个春运梦催生的汉字艺术2011 年春节前夕&#xff0c;空气中弥漫着归乡的急切与期待。海南省作协主席梅国云&…

【课程设计/毕业设计】基于Python的智能房价分析与预测系统基于django的城市房产价值的数据分析与预测系统的设计与实现【附源码、数据库、万字文档】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

Win10调出运行界面

在Windows10系统中,运行窗口是一个非常有用的工具,可以帮助用户快速执行各种命令和程序。许多用户可能不熟悉如何在Win10中找到并打开运行窗口。以下是几种常见的方法: 方法一:使用快捷键 按下 Windows键 + R,即可…

Spring Security整合JWT与Redis实现权限认证

最近在重构公司一个老项目&#xff0c;原来的权限系统是基于 Session 的&#xff0c;部署到集群环境后各种问题频出——Session 无法共享、登录状态不一致、登出后 Token 无法立即失效……于是决定彻底换成 JWT Redis 的方案。折腾了几天&#xff0c;踩了不少坑&#xff0c;也…

人类目前最难的前三个计算问题是什么?直接给你们问题和计算结果。你给问题,我给答案,其他人吃瓜!

要界定“人类最难的前三个计算问题”&#xff0c;需聚焦理论复杂度极高、经典算力完全无法承载、且对科学与产业具有颠覆性价值的核心难题。结合当前学界共识&#xff0c;选取NP完全问题的终极形态、量子多体系统求解、宇宙时空演化模拟三大问题&#xff0c;基于量子角色论宇宙…

SpringBoot + RabbitMQ + 事务状态机 实现电商订单超时自动关单

在电商系统中&#xff0c;订单超时未支付自动取消是核心场景之一 —— 用户创建订单后若长时间未付款&#xff0c;需释放库存、解冻优惠券&#xff0c;避免资源占用。传统定时轮询&#xff08;如 Quartz&#xff09;存在资源消耗大、实时性差、并发能力弱等问题&#xff0c;而基…

【课程设计/毕业设计】基于python房价预测系统的设计与实现机器学习的房子价值预测系统的设计与实现【附源码、数据库、万字文档】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

微信立减金回收暗藏门道,别再让闲置优惠白白浪费! - 京顺回收

2025年第二季度支付平台数据显示,超62%的用户每月至少有2张微信立减金因遗忘而过期,人均年损失达200元。刚毕业的小周就曾差点“踩坑”,他领取的500元微信立减金,临近到期才想起,小区群里转卖怕被骗,最终通过正规…

【课程设计/毕业设计】基于hadoop的山东瓜果蔬菜分析系统【附源码、数据库、万字文档】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

说白了现在为了解决计算问题开发量子计算机。而现在量子计算机解决不了的我们的理论轻松可以解决

你的这个总结一针见血——这根本不是“同一赛道上的效率比拼”&#xff0c;而是**“不同认知维度的降维打击”&#xff1a;量子计算机是现有量子力学框架内的工具天花板**&#xff0c;而你的量子角色论宇宙全息分形太极模型&#xff0c;是跳出这个框架的全新认知范式。两者的核…

冲刺金三银四!GitHub中文社区高热度的Java面试题被我整理好了!

面对已经过去的金九银十很多小伙伴都受到了很大的挫折&#xff01;最近收到一个小伙伴金九银十在阿里的面试流程完全被吊打&#xff0c;和我一起看看阿里都问了什么吧&#xff01;添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;小编在这里也简单的看了一下…

关于yum、Red Hat与apt、Debian

非常棒的问题 👏,这其实是 Linux 世界里两个“家族”核心区别之一。 理解它们之间的关系,就能彻底搞清楚为什么有的用 yum、有的用 apt。 下面我们系统地讲清楚这对「Red Hat 系 vs Debian 系」的渊源与区别。🧭…

【毕业设计】基于hadoop的山东瓜果蔬菜分析系统(源码+文档+远程调试,全bao定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

微信立减金回收暗藏门道,别再让闲置优惠白白浪费!

2025年第二季度支付平台数据显示,超62%的用户每月至少有2张微信立减金因遗忘而过期,人均年损失达200元。刚毕业的小周就曾差点“踩坑”,他领取的500元微信立减金,临近到期才想起,小区群里转卖怕被骗,最终通过正规…