利用Duckdb求解Advent of Code 2022第6题 识别数据包起始标记

【投稿赢 iPhone 17】「我的第一个开源项目」故事征集:用代码换C位出道! 10w+人浏览 1.6k人参与

原题地址 https://adventofcode.com/2022/day/6

第 6 天:调谐故障

准备工作终于完成了;你和精灵们徒步离开营地,开始向星星果树林进发。

当你们穿过茂密的灌木丛时,一个精灵递给你一个手持设备。他说这个设备有很多高级功能,但目前最需要设置好的是通信系统。

然而,因为他听说你在处理基于信号的系统方面经验丰富,他说服了其他精灵,把他们那个出了故障的设备交给你没问题——你肯定能轻松修好它。

仿佛喜剧 timing 般巧合,设备冒出了几颗彩色的火花。

为了能与精灵们通信,设备需要锁定他们的信号。信号是一系列看似随机的字符,设备一次接收一个。

为了修复通信系统,你需要给设备添加一个子程序,用于在数据流中检测数据包起始标记。在精灵们使用的协议中,数据包的起始由一个四个完全不同字符的序列表示。

设备将向你的子程序发送一个数据流缓冲区(你的谜题输入);你的子程序需要识别出第一个最近接收的四个字符全部不同的位置。具体来说,它需要报告从缓冲区开始到第一个这样的四字符标记结束为止的字符数量。

例如,假设你接收到以下数据流缓冲区:

mjqjpqmgbljsphdztnvjfqwrcgsmlb

在接收到前三个字符 (mjq) 后,接收到的字符数量还不足以找到标记。标记第一次可能出现在第四个字符被接收之后,此时最近的四个字符是 mjqj。因为 j 重复了,所以这不是一个标记。

标记第一次出现是在第七个字符到达之后。一旦到达,最后接收的四个字符是 jpqm,它们全都不同。在这种情况下,你的子程序应该报告值 7,因为在处理了 7 个字符后,第一个数据包起始标记完成。

这里还有几个例子:

  • bvwbjplbgvbhsrlpgdmjqwftvncz: 在第 5 个字符后出现第一个标记
  • nppdvjthqldpwncqszvftbrmjlhg: 在第 6 个字符后出现第一个标记
  • nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg: 在第 10 个字符后出现第一个标记
  • zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw: 在第 11 个字符后出现第一个标记

在检测到第一个数据包起始标记之前,需要处理多少个字符?

解题思路:
这道题不难,连续的n个字符中间不含重复,就是把它们去重以后,长度保持不变,第二部分题目太敷衍,只是把字符串长度由4改成14,而且题目正式输入只有一个字符串,连分组都免了。

第一部分解答SQL如下,把最后一行换成注释掉的部分,就是第二部分解答

with t as(select 'mjqjpqmgbljsphdztnvjfqwrcgsmlb
bvwbjplbgvbhsrlpgdmjqwftvncz
nppdvjthqldpwncqszvftbrmjlhg
nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg
zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw' t), 
b as(select row_number()over()rn,b from(select unnest(string_split(t,chr(10)))b from t))
select b.*, 3+(select min(i) from (select i , len(list_distinct(string_to_array(substr(b, i, 4),'')))lenb from range(1,100)t(i) group by i)where lenb=4 )from b;
--select  13+(select min(i) from (select i , len(list_distinct(string_to_array(substr(b, i, 14),'')))lenb from range(1,length(b))t(i) group by i)where lenb=14 )from b;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值