这次的 CCBC15 我作为出题人共出了五道题,分别是「CCBC MOE」、「西提沃克刮刮乐」、「NOthing is Everything」、「遗失的解密卡」以及「大海捞针」。
这里我会分别介绍一下每道题的出题思路。题目解析的话见于题目链接。
CCBC MOE
- 题目链接:https://puzzle.cipherpuzzles.com/puzzle/4/29 (待归档)
- 题目分区:三区「全球呼叫出题组」
- 通过队伍数:270
这题的灵感源自于我有一天突发奇想,想着能不能将每个字都按照某种规则转换成扑克,这样我们就可以每人拿出一句诗然后组三个人打斗地主了?当然,最后没选择斗地主,而是选择了规则比较明确的德州扑克,从德扑 5+2N 比大小的形式也顺理成章地想出了「让多个两个字的人物互相比比谁更厉害」这种脑洞。
最终版本的题目套了一层萌战的皮,一方面我第一次接触这种投票应援的形式就是在萌战,另外一方面萌战和德扑完全就是八竿子打不着的两个事物,也能很好地隐藏真实的题目内容,以及最重要的,萌战的形式可以做成互动问卷题,一边展示虚假数据,一边搜集真实数据,给 Puzzle Hunt 带来点不一样的东西。
题目最终的呈现我还是很满意的,整个题目除了 ft 中提到的「筹码」「all in」以及 5+2N 的形式在隐约透露着德扑,其他地方看起来都和普通的萌战投票没有区别。每组投票的设计既有老生常谈的白色相簿,也有把闲散队五个人都拉来比比谁更萌更可爱,甚至加入了完全无厘头不可比的传统加密手段,就是想营造一种「这也可以比」的感觉。精雕细琢的投票交互细节也让大家比较难发现「票数不重要,大小关系才是题目的一部分」,毕竟可乐怎么可能打不过百事啊!!!!(锐评:做假票是萌战的一环?
当然,要发现「黑幕」还是有途径的。如果后端响应数据太慢的话,玩家是有一定机会发现每个人的票数是一个 1~n 的全排列。或者,玩家可以尝试给可乐刷票,然后他们就会发现,嗯,可乐永远打不过百事。嗯这真的太怪了,真的没有黑幕吗???
不过由于这一个大区很容易 backsolve,很多队伍到完赛后才知道有控票行为,节目效果属实拉满(目的达成!)
顺便一提,第一个做到这题的队伍(大概率是 4s,实际的确是 4s)会发现票数都在 1~26 范围内,这也是我的一个小设计,试图让最前头的队伍踩进 A1Z26 的坑(我太坏了),虽然但是随着投票数的增加应该很快就发现异样吧 hhhhh
(然后这题就被 4s 跳过了,最后靠 backsolve 拿首杀,预料之中)
以及现有的工具真的是太好用了,我要不在题解里面写「使用康托展开排序字母获得答案」,估计前排很多队伍都不会去想到选项的展示顺序是有意义的。
至于你问我对于这题大多数队伍都用 backsolve 解掉的情况有什么感想,我只能说,这个题目能出成这样我已经很满意了,其他的大家做题开心就好,Puzzle Hunt 就是应该让人感到开心!(然后我就在后面埋了两个雷)
如上图:什么不可能二组 🤣
西提沃克刮刮乐
- 题目链接:https://puzzle.cipherpuzzles.com/puzzle/4/31 (待归档)
- 题目分区:三区「全球呼叫出题组」
- 通过队伍数:315
这题是我对于「线下户外谜题」这个自设命题交的一份答卷。
众所周知,我是 Ingress 老玩家,最近一年还入坑了 Geocaching 这个户外寻宝类的游戏,这次难得来给 CCBC 出题,就想夹点私货。于是,冲着和竞速解题背道而驰的这个点,想着出道题向让大家通过出门散步来解谜。
但线下解谜题有个设计难点在于,你无法提前预知做题者会在哪里做题,很难找到一个五湖四海的做题者出门都可以比较容易能找到的东西。哦,有的,大自然!我们可以结合 OpenStreetMap 这个开源的地图数据库,查询某个坐标周边范围内是否存在江河湖海或者公园森林之类的地方。
我自己同时也是「黑箱题」的爱好者,再加上江河湖海可以用蓝色代表,公园森林可以用绿色代表,那还差个红就可以构成 RGB 了!(顺序不太对,没关系没关系)于是,我又多设计了一层红色像素,用来隐藏蓝绿色的解锁 clue,顺便把红色的解锁条件设置得非常简单且无需黑箱探索,只需要真的听从题目的指引,出门 citywalk 一圈,红色基本上就可以解读了。在这样的机制下,所有的 clue 就都以一种一层套一层的机制藏起来了。clue 的隐藏方式也没弄得很复杂,毕竟这题的主要目的不是在这里,所以就随便转成 ASCII 丢进 color hex 里面了。题目整体的预期做题体验就是出门搜集碎片,然后轻松解谜。
适度解谜益脑,沉迷解谜伤身;合理出门锻炼,享受健康生活!
这题的设计灵感是比赛前两天才想出来的,技术论证和代码实现则是比赛前一天赶出来的,很高兴自己的代码能力还是顶得住的!
补充一句,我后来发现国内的 OpenStreetMap 数据并不完善,水域之类的数据基本都是完整的,但森林和公园之类的数据在部分地方可能还有所欠缺,所以最后一步的 clue 也是冲着「蓝色解完了也能出答案」的目的去设计。在此也欢迎有志人士给开源地图数据库OpenStreetMap 添砖加瓦!我国疆域实在是太大了 Orz
NOthing is Everything
- 题目链接:https://puzzle.cipherpuzzles.com/puzzle/6/51 (待归档)
- 题目分区:五区「我爱猫猫!」
- 通过队伍数:362
这题是我对于「无题面无交互」这个自设命题交的一份答卷。
没有题面,没有其他互动方式(例如提示啊里程碑啊),只有一个标题。原本的题目设计就是 NOthing 里面塞了零宽字符,然后用 is Everything 强调不需要关注其他额外东西了。
然后,题目早期测试的时候被多个人眼爆出了个 NOisE,感觉甚妙,于是保留成里程碑,想着能起到一个引路牌的作用。(虽然我赛后觉得这应该不是里程碑,更像是一个彩蛋,希望明年能有彩蛋机制)
这个题目在内测时的版本会更难些,因为腾讯文档不能右键检查页面元素,导致大家纷纷觉得这题还是太难了容易卡住那些不知道零宽字符的队伍。但!是!CCBC 可以右键检查页面元素!然后你就会发现零宽字母被 HTML 转义了!于是本题难度大幅下降,成为了一道水题!喜!anyway 我觉得形式更重要,也不想让大家卡在「如何阅读零宽字符」而卡题。这波是 HTML 转义立大功。
以及这题的标题长度为 36,差点就是 CCBC15 最长题目标题了,如果没有哈基米的话。
遗失的解密卡
- 题目链接:https://puzzle.cipherpuzzles.com/puzzle/7/68 (待归档)
- 题目分区:六区「孬题杀死了出题明星」
- 通过队伍数:212
这题是我对于「传统密码破译」这个自设命题交的一份答卷。论「当 nutri 成为出题人解题工具的时候题目会发生什么样的变化」。
早期的想法就是给出加密方式,不给密钥,来逆推解密,很符合 CCBC 中的 CB(Code Breaking)。
然后内测的时候被 yyao 一波简单 nutri 带走了(指完全没利用旋转限制直接大力 nutri 就爆出了 television 然后直接破题)这对吗?这不对。于是这题成为了内测后唯一加强难度的题目。
对于这题,我在比赛前以及比赛过程中的想法也是我想很想记录下来的。一开始,这题目我是觉得存在非编程解的可能性的,即不会敲代码的人也可以用其他常用工具解决本题,但我因为懒,所以也没去试。在题目被加强后我还和 yyao 讨论了很久,yyao 觉得预期解是编程解不合理,而我则是侥幸地觉得选手那么厉害总会有人非编程解出来的吧,到时候我只要抄一份就好了?!然而随着完赛队伍的陆续反馈,发现大家的解题方法分为两类:一类是靠编程解题,一类是靠买提示降低难度后解题,并没有看到非编程解题的人,大家也都在讨论这题「只能用程序解」。我有点不信邪,于是自己尝试用 excel+nutri 试着重新从头解一遍。当然,这里是没有利用到任何先验知识的(例如从已知答案逆推编个 nutri 直接出答案)否则这个解法就算不上是从头解一遍。这么做的目的一方面是为了证明这题存在非编程解,另一方面也是为了挑战自己。
最后就是,和自己预期一样,使用 excel 可以很方便地求解出确定某个单词作为前缀后,其他旋转方向上的字母分布,以此来判定这个单词是否合理,甚至可以用 excel 的字符串连接功能,串出一个能充分利用现有信息的 nutri。整个过程基本上就是靠着纯逻辑,从开始做表到完成破译差不多一个小时,如果前面选的词选歪了(例如选了 dream)多了一些逻辑判断,也不会超过两个小时……嘿嘿我好厉害(不是
不过这题的预期解和代码解都有点难,导致没有提示时的可做性差差差差差。想了想,这可能和我的出题风格也有关系。我出难题的步骤大致分为三步:「设置一个难以击破的靶子」「自己尝试击破它」「击破了,好,出成题」,最后就导致题目看上去一副不可做的样子,至少我自己出的 CTF 题目也是这样的……
可惜最后这题的 ft 还是写烂了,导致好多队伍都去别的题目找 6x6 方阵了,偏偏本届比赛 6x6 方阵还真就那么多……还是修改后的 ft 好!
大海捞针
- 题目链接:https://puzzle.cipherpuzzles.com/puzzle/7/69 (待归档)
- 题目分区:六区「孬题杀死了出题明星」
- 通过队伍数:127
早期发散出题灵感的时候就想搞一次这样的行为艺术了,可惜没有场地支持,因为得找一个拍摄地一个操作地,还得自己买个设备录制。本来想借用一下别人的街景实况直播,但找来找去只在 Bilibili 上找到一个北京朝阳大悦城的街景直播。
然而,在比赛前一周,好巧不巧,我在住酒店的时候,发现房间窗户是落地窗且一览无余,视野范围内能看到那么几家酒店,碰巧就把基本条件满足了,于是就有了这题。
这题的成本至少得 1000+,设备花了 800+,酒店花了 250+,后面为了更好的拍摄条件还去前台升级房型了,要不然房间在四楼,窗户被前面的楼挡住,从拍摄地看过去根本拍不到,最后升房换到七楼的房间才好些。出这题的同时自己还在构思西提沃克刮刮乐,不想关房间的灯,所以选择了拉窗帘的方式来控制亮暗,并在 Macbook 设置了 120 个闹钟(为了防止自己铃声 PTSD 还特意混用了不同的铃声)拉窗帘拉了四个小时,从晚上 22 点拉到了第二天的凌晨 2 点。
到了最后几次操作,真的是困到不行,拉完最后一次后直接房卡拔掉下楼前台退房回家睡觉。
前台:您确定是要现在(指凌晨二点)就退房且不需要享用早餐了?
我:是的
还好,录制过程都很顺利,没有 NG 一遍通过!最后就是开了个 Bilibili 小号,上传了个视频,关闭了弹幕和评论区,静静地等待着大家第一眼看到 6:00:00 时的震撼以及不解。
至于可做性?没考虑过怎么优化。不过这题也不是完全不可做,还是有思路可循的。如果从出题的角度出发,出题人能控制的东西其实很有限,例如红绿灯这种东西肯定就控制不了吧!所以,其实可以通过图寻找到拍摄地所在的位置,然后检查拍摄区域内有哪些元素是出题人可以控制的(例如酒店),这可以大大减少搜寻的范围,进而快速找到有问题的地方。
anyway 既然都决定把这题放在最后了,那这题大概率就是被跳过的命吧!
下图是本次拍摄所用到的设备。辛苦了摄影机!就是你拍的东西实在是有点糊……
总结
最后在 after party 上公布的「最讨厌的题」上我总共占了 3/6 道题目,「大海捞针」也成功问鼎「最讨厌的题」!
同时「西提沃克刮刮乐」和「大海捞针」也占据了「最佳创新题」中 2/3 的席位!
只能说,这是创新的代价了 hhhhhhhhh
最后,希望未来的我也能像今年 CCBC15 一样有这么多的出题灵感!