谜题的答案和活动的心得体会

谜题的答案和活动的心得体会

我于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,这意味着——这仅仅是个开始

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

(全文完)

 

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (57 人打了分,平均分: 4.25 )
Loading...

谜题的答案和活动的心得体会》的相关评论

  1. 第一道题就跪了。。。原来是种编程语言,解题思路朝着正则啊,编码啊走了,弄了半天毫无头绪。。。

  2. 猪圈密码那个图片名的提示太明显了…我还没来得及搜freemason是不是共济会(我记不清logo想要确认一下),就已经靠pigpen找到正确答案了…

  3. 原来4-cat是找这个规律……我一直以为是解密,找到XYZ对应的字母。。。太坑了……

  4. 没通关,卡在第六关了,二叉树很快就写好了,64位win7下的openssl搞了半天才搞定,最后处理的方式还是没选对。是时候抽空去学linux了。
    尽管没通关,还是支持一下活动。

  5. cat那关提示设计的有问题。
    给人感觉就是要5个字隔开,而不是所有的5个字,一来是提示里面5个字一个换行,二来随机字串一行恰好80个字可以被5整除。
    最后我是写了一堆的filters,然后枚举哪些filters生效,然后考虑filter出来的串是否过长,最后丢到字典里面去看有没有这个单词。
    做完这关我就放弃治疗了,有人给我看了下一关,第一眼还以为是在图片文件的3万多字节的地方藏了什么,然后读啊读啊。。没有。然后观察一下那个地址。。摔,难道又tm要枚举?就不玩了。

    ps:我用手机做的.

  6. 我觉得可以搞一个“中国好代码”,每个月(期)给一个算法题目,用语言实现,评选出最优雅、最短、最高效、最*的同学们。

  7. 最后一段关于活动难度的吐槽,我个人感觉这是因为活动受众的原因导致活动难度的设定存在小学生水平和高阶水平的差异,毕竟你这个活动送的奖励基本都是it从业者或者至少是对linux感兴趣的人才会感兴趣。倘若是扫地大妈看到了你这个活动的难度后,估计她宁愿去参与那种只需要运气就行的活动了

  8. 但是我认为这种所谓的解谜跟推理小说一样sb, 作为一个程序员博客, 我认为应该像Project Euler一样题设清楚才有意思

    1. 谢谢你的关注,我觉得你也可以做一个,让我学习学习。

      另外,老实说,这些题的难度真的不大,提示得都很明显。

      另,我觉得推理小说并不SB,所以想问问你,你一般看什么小说?

  9. @JimmyZ 我很好奇,既然你觉得没意思,觉得sb,为什么你还是锲而不舍地花时间把所有题目都做完,然后还要继续浪费你的宝贵时间到这里来一遍又一遍的吐槽呢?

  10. 用python抓取第五关的variables,不知道这样写对不对

    import urllib2

    content = “2014”

    while (content != “”):
    content = urllib2.urlopen(‘http://fun.coolshell.cn/n/’ + content).read()
    print content

  11. @CC 博主觉得转发没意思太sb就可以批评, 我就不行, 是这样吗? 我可从来没有说过什么浪费我的宝贵时间, 别自行把我树成靶子然后打得很High

  12. @JimmyZ 当然可以批评,但是你看见过博主去参加了哪个转发的活动,然后在活动帖子下面来回说这活动太没意思太sb应该怎样怎样吗?所以我很好奇你这样的行为方式.

  13. 建议博主再搞一次, 没有奖品, 看看哪些人还会再来。 再来的且做得比较好的也许是可以与你一起贡献的人, 国内貌似还没有类似Project Euler的技术挑战社区站

  14. @sl

    import requests
    u = 'http://fun.coolshell.cn/n/%d'
    n = 2014
    while 1:
    	try:
    		m = int(requests.get(u%n).text)
    		n = m
    	except:
    		print n, m
    		break
  15. 那个图片一定是最近才替换的,也就是说这个隐藏关是才加的。。。
    我之前下的那个png没有任何信息,点了刷新才能刷出有head的png,之前浏览器cache的那张是没有任何信息的。

    1. Good finding!!隐藏关卡其实最一开始就有了,只是我用错了图片,这个问题我在周日的傍晚才发现。

  16. Cat那一关,XYZ/358太规律了点啊,结果放宽中间字符的条件到数字字符去找更多的回文去了…… 关键是居然真有:M1L1M/2N9N2/O3i3O …… 于是凌乱了……

  17. 陈皓 :
    Good finding!!隐藏关卡其实最一开始就有了,只是我用错了图片,这个问题我在周日的傍晚才发现。

    →_→! ,这样的话这个“至今没有人找出来”是不是没有多少份量。
    不过博主的那个dmr ASCII艺术字超级好看,收藏了!

  18. 做火箭那一题的时候,我是用服务器curl请求的,然后再用把答案输入到笔记本上面,不知道会不会被认为是作弊,,,

  19. @JimmyZ 当然…难道你在路上看到sh*t时不会躲开,反而会冲上去闻一闻然后再指着它大骂三声”你太臭了”么?

  20. @t.k.
    吐血。我打开图片看了半天,还去查PNG格式资料来分析。原来正确答案是ctrl+F5再下载- –
    感谢你这个评论-~

  21. 回文猫的示例给的还是有点不太好,让我找规律找过头了。。。
    3+5=8
    XYZ。。。
    我说怎么老是NOT FOUND

  22. 好坑,我第一题卡了N长时间,算出来是81648.html,结果不对,转成十六进制也好,八进制二进制也好,都不对。最后刷新了N次后,莫名其妙的就好了

  23. 虽然没有参加,但是根据文章,人生第一次在linux上通过gcc编译了代码。。。得出了第2关的结果,awesome!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注