title: 81.谜题的答案和活动的心得体会 outline: deep

我于2014年8月3日周六的上午在微博、twitter、CoolShell上发布了一个和程序员有关的解谜题的活动——【活动】解谜题送礼物。我使用了二级域名fun.coolshell.cn做为这次活动的页面。

截止这篇文章发布的时候,fun.coolshell.cn的访问量UV大约有4万左右,通关人数大约有200人,但因为在活动的第二天网上就出了一些答题攻略,通过分析,实际靠自己能力通过的人数在130人左右。通过率大约不到4‰的样子。

在这里我把整个谜题和做这个活动的东西写一下,算是给自己的一个总结。

谜题的答案和花絮

fun.coolshell.cn上一共有十道谜题,要设计这些东西还真是费尽脑汁,这让我对那些设计谜题式游戏的人相当敬佩

**第0关:**很多人可能一头雾水,完全不知道这是什么,其实只要Google一下,你会知道这是一个叫BrainFuck的语言。在Coolshell.cn上我也介绍了过——《BT雷人的程序语言》《BT雷人的程序语言(大全)》,要通过这关,你需要把那段程序编译一下。要编译这段程序其实很简单,Google一个在线的编译器就可以了。(关于其它更多的古怪的编程语言请参看这里:http://esolangs.org/wiki/Language_list

**第1关:**这一关也是很简单的,你需要在网页上找到两个数,一个是X,一个是Y,然后求得X和Y的乘积。对于X,你可以观察一下那个数列游戏,对于Y,你可以Google一下就知道了(我在Coolshell的《如何用最有创造力的方式输出42》说过这个事)。

**第2关:**上面显示了一个不一样的键盘,我给了这个键盘的Wikipedia的链接。这个键盘叫Dvorak键,不同于我们的Qwert键。通过这个两个键盘的布局映射,你可以把下面那段读不懂的文字解出来(其实,你还是可以Google,有在线的转换)。把下面那段文字转成Qwert键的,你就会发现这是一段代码,这段代码非常著名,是1987年国际C语言混乱大赛一等奖的一段代码(你可Google “IOCCC 87 unix”)。(关于IOCCC你可以参看Coolshell之前的《6个变态的HelloWorld》、《如何混乱代码》、《如何写出无法维护的代码》这几篇文章)

**第3关:**扫描二维码以后,你会得到一个码表转换,你可以使用Shell的tr命令来转一下下面的话。转完后你就可以读懂了,读懂了你还需要使用rot13来转一下“shell”(Google一下,你会发现也有在线的转换器,另外还有其它的rot)

第4关:这是众多同学被卡在的地方。很多同学吐槽这题太坑了,别忘了这是游戏啊。我问了几个早先通关的同学,他们都说还好了,只要静一下心来多观察一下,你就会找出规律的。这个回文的模式是,一个大写字符和一个数字(顺序不限)把一个小字母套起来。于是,写成正则表达式是:

([A-Z])([0-9])[a-z]\2\1|([0-9])([A-Z])[a-z]\4\3

用shell命令可以很快地找到9个匹配,然后,像“cat”一样,取中间的小写字母组成一个单词。写成Shell命令是:

grep -o "\([A-Z]\)\([0-9]\)[a-z]\2\1\|\([0-9]\)\([A-Z]\)[a-z]\4\3" cat.txt | sed -E "s/(.)(.)(.)\2\1/\3/g" | awk '{printf("%s",$1)}' && echo ""

这题主要考的是你的观察能力和正则表达式。

第5关:如果你点了一下图片后,你就知道,这个连接http://fun.coolshell.cn/n/2014返回了一个数字,如果你把这个数字放到那个URL中,不断地替换其中的数字,你会得到一个新的数字。于是你就会得到最终的答案。

这道题本来我是想让大家写程序的,我原来设置了一共512个序列,但是考虑到服务受不了,所以,我把它降到了128个,这样保证你的程序可以在几秒钟内得到结果,而不会对我的服务器造成压力。但是我还是看到好几个同学人肉地copy+paste+回车刷了100多下,得到了最终答案。

**第6关:**通过中序和后序遍历还原一棵二叉树,然后再找到其最深的路径,然后得到一个字符串后,把这个字符串做为一个passcode代入那个openssl的命令行中。你就可以解密密文得到下一关的答案。

这个题,我本想设计得更隐晦一些,用一个“心脏流血”的图片来暗示openssl,然后用别的东西暗示AES-128-CBC,后来想想算了,主要还是考大家在大学里的二叉树的最基本的算法。并介绍一下openssl的shell命令行加解密的方法。

在网上的一些攻略中我看到了大家没有用程序,而是手动地花了一棵树出来。(其实,这设计这道的时候,我本来想设计成随机树,也就每个人看到的答案都不一样,我随机建树并且找最深路径的程序都写好了,但是我最终还是没有这样做,因为这无疑增加我对这个网页游戏的代码复杂度,而我又没有太多的时间,而谜题的各种形式已经够让我花精力的了,你虽然看到了10道题,但是其实我设计了一共有16道题,我反复斟酌,即不想为难大家,又不想太简单和无聊,所以最终release了这十道题)

**第7关:**N皇后问题,这个问题也是大学里的题。9皇后一共有352个解,你需要把这352个解代到那个sha1的公式中(需要上一关用于解密的passcode),这样你就会得到一个解。然后这就是通关口令。

第6关和第7关的算法题你要是不会写的话,Google一下,反正我们是“大自然的搬运工”,不是吗?呵呵。

第7关这题啊,我看到一个同学用穷举的1-9的排序组合的方式来向服务发请求,从123456789开始,我都看SB了,因为这关的通答案是9开头,我勒了个去!你得对我的服务器发多少次请求啊,才能得到一个200的回复啊。TNND。服了。不过这个同学我最终还是给通过了,没有判定成作弊。

**第8关:**Excel的列号编程,这一关写成代码其实并不难的。但我看到网上给的好些答案,大家都是用手算。也OK,这题本身就没有什么难度,但是因为这个26进制是从1开始的,写出来的代码并不非常容易,一些边界条件很容易就break掉了。这题完全考的是编码。把COOLSHELL除以SHELL的数转成字符串。然后就进入最后一关了。

然后,我又见到有个同学用了穷举的方式,TNND,其实每道题都有人在用穷举的方式,我勒个去。他从AAA开始穷举,不一会就穷举出正确答案了。尼玛!

**第9关:**一个猪圈和一个共济会的logo,你Google一下,你就知道答案了。这题纯粹就是介绍知识的。不知道大家有没有去wikipedia上了解了一下这个猪圈密码和共济会是怎么一回事吗?这样的密文叫图片密文,还有很多类似的图片密文的。你知道吗?有相应的字库哦。也有在线的生成器哦。(因为我最近在学各种安全的基础知识,所以了解到了这个东西)

**通关:**于是你就通关了。你会发现你得到了一个helloworld,这个字符串,在我一放出来这个谜题的时候,就有很多人在尝试helloworld就是那段brainfuck的代码的输出。我汗啊。还好我做了一个比较复杂的防作弊检查……

总体来说,这些关卡都不难,但是你最少也得用2-3个小时。Top100页面时统计的平均时间是10个半小时。

再说一个花絮,自从,8月3日上线后,8月4日在网上就有了相关的解答攻略,还是在V2EX上,于是出现了好些只花了几分钟就做完了的人。不过好在事先我就预料到了这个事,事先预备好了“反作弊分析”的脚本,细节不想说太多,反正就是说,我会记录你答案的整个过程和行为,以此来确保TOP100中的人基本都是用自己能力答的,当然,可能会有漏判,但至少也是写过代码的。

活动心得

因为是第一次做活动,所以有很多感想,下面写下一些做这个活动的心得,供大家参考:

1)要做好一个这样的解题游戏并不简单

2)关于怎么做一个活动的感想。

最后吐个槽,我真的觉得那些“纯靠运气的活动”相当的SB,我看到好些公司的运营部门招了多少个所谓的高学历和高能力的人,结果干出来的运营活动的水平,其实,也就是个有小学文化水平的人就可以做的了。那些“转就送式的”、“抽奖式的”的活动,是个人都会干,根本不需要高学历的人。

其它

1)本次活动中,有一个隐藏关卡,还没有人找出来。要能达到隐藏关卡,需要完成所有的题目。

2)活动的通关页是HelloWorld,这意味着——这仅仅是个开始

最后感谢大家为这个活动付出的时间!