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

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

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

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

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

谜题的答案和花絮

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

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

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

第2关:上面显示了一个不一样的键盘,我给了这个键盘的Wikipedia的链接。这个键盘叫Dvorak键,不同于我们的Qwert键。通过这个两个键盘的布局映射,你可以把下面那段读不懂的文字解出来(其实,你还是可以Google,有在线的转换)。把下面那段文字转成Qwert键的,你就会发现这是一段代码,这段代码非常著名,是1987年国际C语言混乱大赛一等奖的一段代码(你可Google “IOCCC 87 unix”)。(关于IOCCC你可以参看sou-ip之前的《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.sou-ip.com/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掉了。这题完全考的是编码。把sou-ip除以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.sou-ip.com正式release之前,我找了几个人比较聪明的人来试玩了一下,对这个游戏的帮助很大。
  • 游戏管理:这样的一个在线游戏自然会出一些作弊者,为了游戏的公平性,你需要剔除这些作弊者。所以,我设计了一些比较简单的记录用户所有过程的监测的算法。通过cookie和后台的http log来一同分析。这个部分也比较地花时间。我上周六的时候写这些代码写到了凌晨4点,导致脑子不清楚,出了些bug,导致在大家游戏过程中重置cookie等伤害用户体验的事件。所以说啊,不能赶啊,也不能加班啊。

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

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

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

其它

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

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

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

(全文完)

 

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

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

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

  1. @宝酷
    找到了隐藏关卡的url,只是一张图片,没提示下一步了,In Memoriam and only?

    PS:感觉有过爬虫经验的童鞋会比较容易破解这些谜题。

  2. 好坑爹rot13 shell的答案页和404页面长得像,弄得我解出了答案还纳闷为啥不是furyy呢……然后实在想不出应该是啥就放弃了……

  3. 刚完成,太晚了,不过非常有意思,不过水平所限,几个关卡使用了暴力
    第四关,回文,刚开始以为会是很长一段的回文,然后取一半,不仅考虑了’aabaa’也考虑了’aabbaa’,结果刚写完’aabaa’形式的,输出一下结果,看到全是5个字符的,就明白提示的意思了,不过‘第0个字符是数字那么与之对称的第4个字符也必须是数字’这正则不会写啊,就过滤了一些,手动挑出来的。
    第六关,二叉树,画出来的
    第七关,N皇后问题,根据文中给出的sha1哈希,下班之前运行了个暴力,第二天出结果了,而且是9个循环,这个得仔细想想
    第十关,HelloWorld,直接猜的helloworld,哈哈

  4. 生物狗几乎每关都尝试了通往隐藏关的那个方法,那也是我博客里隐藏某些自顾自说时用的招。最简单也最惊喜。很谢谢 sou-ip 的这个“游戏”,略给了生物狗一点儿信心。前些日子买了个 Cherry 青轴,被老婆骂地狗血淋头。下一步打算混 computational biology。期待更多的博文。汪。

  5. 话说 cat 那一关我以为 source 是存在猫图里。把猫图的 RGB 读入,换成#EFF3FF这种,去掉#保持每单词5字符的节奏,再去正则匹配。只不过下意识手贱点开了Chrome 里的 inspect element

  6. 这几天抽空做完了,感觉还是很有意思的。是OJ与CTF的融合,这对于大众程序员来说很赞!耗子叔辛苦了!
    还有不是说在关注安全领域吗?那最近就出一些安全方面的blog来吧~我重点关注哈!!
    开个玩笑,那本书对于那前十名来说应该是人手一本吧~不如3本送前十,7本送后90名吧~LOL

  7. sl :
    用python抓取第五关的variables,不知道这样写对不对
    import urllib2
    content = “2014″
    while (content != “”):
    content = urllib2.urlopen(‘http://fun.sou-ip.com/n/’ + content).read()
    print content

    这是我写的:

    #!/usr/bin/env python2
    import urllib2
    import sys
    
    number = '2014'
    
    while True:
        try:
            obj = urllib2.urlopen("http://fun.sou-ip.com/n/%s" % number)
        except urllib2.HTTPError:
            sys.exit()
    
        number = obj.read()
        print number
    

  8. 大牛,能不能将答案公开在宝酷中,这样我这个菜鸟可以学习学习。不胜感谢~!

  9. 你好,我遇到你在有篇博文中的问题了,可否告知一下Win32_tmpfile的具体实现

  10. 我注意到你写第4关答案时用的sed -E命令,我不知道这个E有什么作用?能解释下吗?谢谢。

  11. Pingback: Leetcode 编程训练
  12. 感谢博主,相当有意思的游戏。感觉前面几题难一点,要努力找线索,特别是第一题,卡了好久,一开始还在努力的找规律,晕;后面的题思路基本都很容易想到,只要埋头码代码就可以输出结果。

发表回复

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