我于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)要做好一个这样的解题游戏并不简单

  • 关卡设计:最花力气的地方就是设计每个关卡,我不能设计得太过隐晦,也不能设计得太过明显。最好是要符合参与者的能力,但又要高于平均以上水平的能力,最好在90%以上。这样会让大家有挑战感,但是又不会有挫败感。这个度相当难把握。总体而言,本次设计的谜题中还有很多可以改进的地方。但这毕竟是我的第一次,也算是我用其来感受一下应该怎么设计游戏。
  • 游戏黏性:除了设计谜题,还需要针对用户可能会答错的地方来给用户一些提示,原因也是为了不让用户有挫败感,虽然用户没有答对,但是需要用这些页面来鼓励用户You made some progress,这个很重要。这会让用户对游戏更有粘性,并且更愿意有更多的投入。找到这些地方也不是一件容易的事,因为做为游戏的设计者来说,很难从一个不知到答案的角度去思考。所以需要试玩,在fun.coolshell.cn正式release之前,我找了几个人比较聪明的人来试玩了一下,对这个游戏的帮助很大。
  • 游戏管理:这样的一个在线游戏自然会出一些作弊者,为了游戏的公平性,你需要剔除这些作弊者。所以,我设计了一些比较简单的记录用户所有过程的监测的算法。通过cookie和后台的http log来一同分析。这个部分也比较地花时间。我上周六的时候写这些代码写到了凌晨4点,导致脑子不清楚,出了些bug,导致在大家游戏过程中重置cookie等伤害用户体验的事件。所以说啊,不能赶啊,也不能加班啊。

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

  • 这次活动的背景。首先,想做这个活动的起因是这样的。我一个朋友在微博上做活动——“转发微博或@几个人怎么怎么滴就有机获得什么什么的”,我在这里把这种活动简称为“转就送”活动。于是遭到了水军的刷奖品,导致他根本分不清楚哪些是正常人,哪些不是,因为新浪微博上有大量的这要瓣机器人,所以他这次活动最后失败了。我说,你得加点难度啊,要加点智商啊。而且,我看过太多的活动都是这样的,而且很多公司的活动也是这样的,我觉得太low了。于是,我就萌生了自己尝试一下的念头。
  • 我对做活动的理解。我一直觉得网上那些诸如“转就送”或是“抽奖”这样的活动都比较SB,这些人根本就不知道怎么做活动。这样做活动不需要智商,简单粗暴,效果一点也不好,活动做完了,人就走了,人们马上就忘了。我以为做活动的精髓是这样的:
    • 真正的价值。其实,好的活动并不只是物品的价格,而是参与这个过程的感觉和体会。如果你让人觉得这是碰运气的,那么这个活动除了用物品价格来吸引人,也就没别的什么了。如果这个活动的参与过程是让人有成就感的,要有成就感那么就需要有一定难度的挑战,而且这种挑战也是让众人认可和佩服的,那么这个奖品的价格再小,价值也会很大。比如:Olympic Game,World Cup之流的,世界顶尖,四年一次,来之不易。这才是活动的价值。本次的fun.coolshell.cn上的活动,我希望让大家在做题的过程中学到一些东西,另外也希望做出来的人有一种成就感。
    • 让人有回味。那些简单的“转就送”式的活动不会让人产生任何的回味,只会让人产生很大的反感。就像那些“让你转发,不转就死全家”的东西,相当的让人反感。真正的回味是人们对活动参与过程的讨论和交互。在fun.coolshell.cn上线后,我就看到好几个社区在讨论这些谜题,这就是所谓的回味。只有人们对过程的回味,对参与的回味,才会让这个活动真正的成功
    • 暴露活动过程。有挑战的活动,一定要有一个Who’s Who的东西,而且是随时动态更新的可以让大家查询的,这样才会从另一个侧面激发大家的热情。因为fun.coolshell.cn一开始说了只给前十个人送东西,结果在过程中,我发现了就半天时间就差不多满了,那时我在想,如果没有奖品了,剩下的人还会不会玩了?于是我飞快地开发了一个TOP100的排行榜,让大家可以看得到这个过程,虽然前十以后就没有奖品了,但是,能上这TOP100也不错。于是乎,在没有奖品情况下,依然在激发着大家的解题热情。有竞争总是一件有意思的事情,因为成就感总是来自竞争。(注:为什么top100中会有“xxxxxx”的用户,因为一开始我用的是用户提交的name,但是后来有人告诉我,这个名字可能是真名,所以,我就改成了weibo或twitter的ID,而xxxxx则是没有留下微博或twitter的)

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

其它

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

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

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