利用Duckdb求解Advent of Code 2022第2题 石头布剪刀

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

第 2 天:石头剪刀布

精灵们开始在海滩上搭建营地。为了决定谁的帐篷最靠近零食储藏处,一场巨大的石头剪刀布锦标赛已经开始。

石头剪刀布是两名玩家之间的游戏。每场比赛包含多个回合;在每一回合中,玩家同时使用手势选择石头、布或剪刀中的一种。然后,选出该回合的获胜者:石头击败剪刀,剪刀击败布,布击败石头。如果两个玩家选择相同的手势,则该回合以平局结束。

为了感谢你昨天的帮助,一个精灵给了你一份加密的策略指南(你的谜题输入),他们说这肯定会帮助你获胜。“第一列是你的对手将要出的手势:A 代表石头,B 代表布,C 代表剪刀。第二列——” 突然,这个精灵被叫走去帮忙搭某人的帐篷了。

你推测,第二列一定是你应该做出的回应:X 代表石头,Y 代表布,Z 代表剪刀。每次都赢会显得可疑,所以这些回应一定是经过精心选择的。

整个锦标赛的获胜者是得分最高的玩家。你的总得分是你每一回合得分的总和。单个回合的得分是你所选手势的得分(石头 1 分,布 2 分,剪刀 3 分)加上该回合结果的得分(如果你输了得 0 分,平局得 3 分,赢了得 6 分)。

由于你无法确定这个精灵是想帮你还是骗你,你应该计算一下如果你遵循这份策略指南会得到多少分。

例如,假设你得到了以下策略指南:

A Y
B X
C Z

这份策略指南预测并推荐了以下内容:

  • 在第一回合,你的对手会选择石头 (A),你应该选择布 (Y)。这以你获胜结束,得分为 8(2 分因为你选择了布 + 6 分因为你赢了)。
  • 在第二回合,你的对手会选择布 (B),你应该选择石头 (X)。这以你失败结束,得分为 1(1 + 0)。
  • 第三回合是平局,双方都选择剪刀,你得分为 3 + 3 = 6。

在这个例子中,如果你遵循策略指南,你会得到总分 15 (8 + 1 + 6)。

如果一切都完全按照你的策略指南进行,你的总分会是多少?

我的解答SQL

with recursive t as(select 'A Y
B X
C Z' t), 
b as(select row_number()over()rn,b from(select unnest(string_split(t,chr(10)))b from t))
select sum(score) from(select substr(b, 1, 1) u,substr(b, 3, 1) i, 3-3*(
	case ascii(u)-ascii('A')-(ascii(i)-ascii('X') )
	when 0 then 0 
	when 1 then 1
	when 2 then -1
	when -1 then -1
	when -2 then 1 
	end) + ascii(i)-ascii('X')+1 score from b)
;

第二部分改为第二列用X、Y、Z表示负、平、胜,让根据这个要求自己出,最简单就是把根据这个求的结果当作第一部分的我方变量,其余逻辑不变。
我的解答SQL,只要把下面代码插入上面代码的i列之前,根据x列算出i列即可。

x, 
case x when 'X' then case u when 'A' then 'Z' when 'B' then 'X' when 'C' then 'Y' end
       when 'Y' then case u when 'A' then 'X' when 'B' then 'Y' when 'C' then 'Z' end
       when 'Z' then case u when 'A' then 'Y' when 'B' then 'Z' when 'C' then 'X' end
end 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值