注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Puriney's Notes

Puriney=purine+Y, my Wonderland

 
 
 

日志

 
 

【BIO】我也不产生代码 -- Coolshell 谜题一游  

2014-08-10 21:15:23|  分类: QWERT |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我也只是 Stackoverflow 的搬运工。

Coolshell 这次闯关送书活动已经无需多言了。我闯完最后的最后,百感交集。我想引用作者自己所说:

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

零:做个吃货、当个傻逼
题目涉及“正则表达式、网络请求,算法和数据结构,以及一些基础的加密解密知识”,基本上已经远远脱离生物范畴了。2009/2010第一次去深水沟北山皮鞋厂,开始接触 Ubuntu 后,渐渐偏离纯粹的分子生物学。一方面订阅了不少自认为有意思的 RSS 走着兴趣燃烧流派,可另一面踏上陌生的路,能力不足、旁人的冷眼吐槽,自己也迟疑过。

壹:憋扯犊子 Show me the CODES 

0-Fuck(http://fun.coolshell.cn/first.html)
【多巴胺】我不产生代码 - Puriney - Purineys Notes
网页全选(control+A 或者 command+A)往往能冒出被反白的惊喜,这不仅偶尔被用来隐藏我自己博客里的自顾自说,也是一般闯关游戏里常出的第一招。不过可惜貌似不是。一串莫名其妙的字符?也许按照一定矩阵排列,会出类似图片转换为 ascii(http://www.text-image.com/convert/pic2ascii.cgi)比如下左就是我的证件照。可惜,568个字符只能排出71*8的组合就是下右这个狗样。
【多巴胺】我不产生代码 - Puriney - Purineys Notes【多巴胺】我不产生代码 - Puriney - Purineys Notes
  
 比较友善的是,作者在评论里给了第一关的提示。原来是一门叫做 Brainfuck 的诡异编程语言,才猛然联想起当年看过的 Perl 语言文言文版,Perl 很多命令以汉字方式来表达。比如“印道”就是“print"的意思~ 我不需要懂 BF 语言,直接谷歌搜索 Brainfuck online interpreter,如:http://esoteric.sange.fi/brainfuck/impl/interp/i.html,启程!
【多巴胺】我不产生代码 - Puriney - Purineys Notes
 
1-Welcome
问道:What is the meaning of life, the universe and everything? 生命、宇宙以及任何事情的终极答案?

我没有拿广告费,但我很喜欢淘宝上一家叫做极客力量的衣服,如需购买请移步这里。图片来自该店淘宝。
【多巴胺】我不产生代码 - Puriney - Purineys Notes
 

2-keyboard
【多巴胺】我不产生代码 - Puriney - Purineys Notes

macb() ? lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+

又一串不知所云。我的手指在键盘上顺着字符游走,期待着是不是可以划出一条什么轨迹,写个隐藏的单词之类的。无奈未果。看见有 /.........../.........的形式,有可能是 tr///做替换?按照第一题的定式思维或许又是个我不认识的语言,搜了搜" keyboard programming language",不搜不知道,世界上有一门语言叫做:APL(A Programming Language),就用着属于自己的一套键盘:
【多巴胺】我不产生代码 - Puriney - Purineys Notes
但基本与 QWERT 键盘无差异。再看看原题,图片其实附上了维基百科链接,嗯,意图有点儿明显了,Dvorak键盘与 QWERT 键盘的映射。一个个敲,敲出 main( ) { 之后我确定了这是正道。简单查了查,Dvorak 键盘是最快输入保持者。甚至可以自由定义,支持左右手习惯。有朝一日确实可以学着玩玩儿。
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
拉去 Xcode 按着 C 和 C++编译,报错,未果。尝试把出错的一段代码谷歌搜索,冒出CSDN论坛上的帖子。原来是这是“最怪 C 语言程序”。想起HackerNewsDaily 上的一个帖子:求知时搜索报错比搜索信息本身更容易给你答案。
【多巴胺】我不产生代码 - Puriney - Purineys Notes


3-QR
【多巴胺】我不产生代码 - Puriney - Purineys Notes
 
一个二维码,让我想起了最初在 wowubuntu 上学到的命令行生成二维码。如今 riku 的 wowubuntu 网站都貌似下线了,我在这里找到了该文的拷贝。当然啦这题我们首先需要的是 "QR online decoder",比如http://www.onlinebarcodereader.com/。二维码里的信息是:

【多巴胺】我不产生代码 - Puriney - Purineys Notes
嗯,这次明显是 tr///这种替换了。

Wxgcg txgcg ui p ixgff, txgcg ui p epm. I gyhgwt mrl lig txg ixgff wrsspnd tr irfkg txui hcrvfgs, nre, hfgpig tcm liunz txg crt13 ra "ixgff" tr gntgc ngyt fgkgf.

替换破解之后的明文是:

Where there is a shell, there is a way. I expect you use the shell command to solve this problem, now, please try using the rot13 of "shell" to enter next level. 

 明文已出,rot13 of "shell" 什么意思?继续谷歌吧。嗯,我是 stackoverflow 的搬运工,原来 rot13只是一种简单的变换方式。模仿搬运来的代码(这里),Bash Python 一波流带你走:

$ echo "shell" | python -c 'import sys; print sys.stdin.read().encode("rot13")'


 4-furyy
【多巴胺】我不产生代码 - Puriney - Purineys Notes

开始进入 Hard 模式了。英语大家都看得懂但是真正的意义何在?考虑到那些日本 XXX 大学计算机系招生海报里穿和服的姑娘们,我心里暗想我的功底可能还是太天真了,闯关恐怕就只能走到这儿了,况且晚上和三教授一博士的德国天团的组会PPT 还没做呢。。。

【多巴胺】我不产生代码 - Puriney - Purineys Notes
第一,小猫如此可爱,source 你却何在?因为老婆的专业我接触过图像处理的一些 MATLAB 代码。以我的认知水平,总该不会要读入图片的 RGB 吧?而结合 cat 的文字部分,颜色除了(239,243,255)的表示形式还可以以类似#EFF3FF的形式表示,6字符长度去掉井号后长度就与文字部分5个字符相同。那这张图可就相当于一本超大的书,就是题干里所谓的 source。当然还有一种 source 就是 html 源代码。毕竟自己套用 bootstrap 做网页时有时候的确会藏一些话。curl -s 一看,代码里一大段奇怪的字符。谷歌浏览器用 inspect element 肉眼一看文尾,错不了啦。 

第二,文本有了看看题干。应该是按着 cat 提供的模式去正则匹配筛选就好。但喵星人高冷的世界,哪里是你铲屎星人能懂的,正则匹配原则的确不好找 G 点:

  • 若第一个字符是大写字母,那第二个字符一定要是数字。而 Z8Y8Z 以及 C121C被丢弃 Z8t8Z 被保留则告诉我此刻第三位必须是小写字母。
  • 若第一个字符是数字,依据56b65被丢弃而5YaY5被保留,第二位只要是非数字即可、第三位则任意。
试过之后并不是什么有意义的信息。索性放低原则,不要这么严谨:第二条原则里,第二位改成必须大写、第三位必须小写。

第三,正则匹配原则确定后,“乱码”文本虽然以多行形式呈现,但多行也可以连成一行来读。果不然,多行输入会得到variablzes,而合并一行后(好在并不需要什么字母重排序得到有意义的单词什么的)带你去下一关。

5-variables
【多巴胺】我不产生代码 - Puriney - Purineys Notes
永不止步安踏特步的节奏。我傻傻地把光标移动到地址栏里,继续单击一下 Enter,万一这个网站会识别我的操作呢?未果。看看图片,上面的二进制数字?图片既然链接,那就点开吧:
【多巴胺】我不产生代码 - Puriney - Purineys Notes
傻眼了,偌大的网页 body 里就一个数字?确认了源代码也确认了是否反白,几个意思。结论是仅凭一个数字,我即使吃炫迈口香糖也得停下来。再看了看原 po里说的“正则表达式、网络请求,算法和数据结构,以及一些基础的加密解密知识”,我试试把数字输进地址栏吧。考虑到今年是2014年,而有一个 n。我把 n 换成了32722. 未果。那就索性把2014换掉吧,万一这都是因为作者懒而安排的xxx/n/字辈 子网页呢?。嗯,又出了一个新数字。看了作者事后的心得体会帖,嗯,向那些手动输入的同学致敬。
【多巴胺】我不产生代码 - Puriney - Purineys Notes

这关相比回文猫那关舒服多了。

6-tree
【多巴胺】我不产生代码 - Puriney - Purineys Notes

二叉树和 openssl 两条线索。

会算法会数据结构的才能 tree 牛逼。我这次的确傻眼,数据结构我从来没接触。真要扯到树形的,我最多也就听过组会小哥提到过 Graphic Model,可那是概率模型里的故事。 

openssl 这个好说,听说过“心脏”漏洞。题中提到openssl 的几个参数完全可以参考这里。因为 openssl 默认输入与输出都是标准输入输出(STDIN和STDOUT),所以虽然我从没用过 openssl 加密解密,但它和大多数程序一样,想必可以套进 bash pipeline 里。

题目说滴很清楚,欲知加密内容请先找到树最深路径,只能老老实实看看维基百科。懂了什么是二叉树、也懂了 LDR 遍历方式的 in-order、LRD 遍历方式的 post-order。openssl 的密码应该就是树的内容了。参考了些科普(这里这里),也就能清楚知道如何迭代地来建树:

in-order: 4 2 5 (1) 6 7 3 8 
post-order: 4 5 2 6 7 8 3 (1) 

比如第一轮迭代,给定一段 in-order 和 post-order,可以找到三个信息:a) 这一层根节点;b) 这一层的左右分支节点;c) 下属左右分支的所有节点。
  1. post-order 里的 1 就是最顶层的根节点(D)。信息 a 确定。
  2. 看 in-order 里找 1。而 in-order 是 LDR顺序。 所以花开两瓣4、2、5就是左分支的 in-order 遍历,而6、7、3、8则是右分支的。信息 c 确定。
  3. 回看LRD 的 post-order,根据已知左右分支节点个数可以截取4、5、2是左分支的 post-order 遍历、6、7、8、3则是右分支的。立刻就能知道 2 是左分支的节点、3 是右分支的节点,意即 1 是老大,2是左护法、3是右护法。信息 b 确定。
  4. 分别对待左右分支,迭代周而复始下去。
搜到的贴里虽然有现成的java 代码可惜我这个大自然的搬运工压根不会用 java,只好手撕鬼子,啊不对手建二叉树。

但实际上既然要找最深路径,因此没必要完整地恢复树。为了省事儿,每次在选择分支时,直接选择分支节点数多的那一路去攻破。好在作者并没有故意设计一个节点只分出一条树枝,不然我这种偷懒可能不会奏效。

7-nqueens

【BIO】我不产生代码 - Puriney - Purineys Notes
 
冲到这里我喘了一口大粗气。8皇后问题和 SHA1. 经过“二叉树心脏滴血”后,我估摸着这回两个象限的故事又被作者巧妙地拼凑在了一起。好在作者的初衷并不是难为大家,我也可以有机会还原拼图。

八皇后的 code 是57138642,不难发现是棋盘从右往左每一个皇后所在的行数。我回顾了一下 coursera 里一门课叫做 optimization,那个墨尔本大学的搞笑老头提过八皇后,简略了提到了破解八皇后问题的经典方法:固定每一列,在满足皇后下棋的限制条件下,逐列地去搜去减小 search space 最终得到答案。而作者这里正是这种经典的方法。

话分两头。隐约是2年前 CSDN等多个程序员聚集地被拖库,各路大神的密码被暴,更有统计高频密码的雷贴,1234567890啊 love123什么的不在话下了,竟然还有一个女性的名字也在榜单中,貌似好像是个程序猿世界里的大众情人。从那时起“一个密码走天下”的危险进入大家视野。最深刻的当属Matrix67大神。他的博客被不少粉丝友情登陆管理台后竟然写了日志提醒大神自己“你密码被暴了”,我收到这么多同样的日志一度以为 Matrix67大神的 RSS抽筋了。搜索 SHA1以及确认了题目中那是40位的密码之后我也基本确定了这题目与 SHA1加密有关。在最后想到解决办法恍然大悟之前我有不少愚蠢的解法,比如根据 SHA1的密码去反追回明码。回顾了些科普贴,比如阿豆拉的 MD,又比如那年张洋大神还叫噬菌体 T2、那年CodingLabs还在博客园,他科普了一下 SHA1作为哈希,与加密的不同,最提醒我的正是:从SHA1密码回算明码几乎不可能。

让我感到疑惑的是题目中“The $passwd is same as previous puzzle”。我一度认为$passwd 是九皇后的Explicit_solutions。毕竟做搬运工习惯了,而维基百科同时列了8、9、10皇后的Explicit Solutions,就套用试试。搬运工没有自己的设计蓝图就是蠢,我竟然都蠢到没有去注意维基百科的8皇后答案和题目里的举例根本不同。

不考虑旋转棋盘,8皇后有92个解,9皇后有352个解。所以作者想要我做的应该是一个一个去试,直到 SHA1加密后与提供的密码相同。毕竟一个经典的优化问题,肯定已有代码去解决皇后问题。我选了 R 语言来做,参考了Rosettercode另外这是强烈推荐参考代码的地方能学到很多)改动了一点儿。而 SHA1加密,这肯定也有成熟的封装。我用的 R 包叫做“digest”。看了看手册后友情提一句,调用 digest 去加密时注意输入内容因而要这么写:

digest(x, algo = "sha1", serialize = FALSE)


8-Excel

【BIO】我不产生代码 - Puriney - Purineys Notes
说到底还是自己功底不深厚。这题很简单,逢26进1的26进制。

第一眼也是26进制。只是回想二进制的世界里,0,1,01,10,11是这么升序的,可没有00. 而这里 A-Z 之后就是 AA。所以我排除了进制。

第二眼是高中数学的排列组合。比如 BAAB,是两个问题之和。第一个是数字是26为 a1、26为 q、n 为3的等比数列之和;第二个则是排列组合 2*1*1*2. 一加就是 BAAB 的位置。核心就是把这个看做一个排列组合问题。

【BIO】我不产生代码 - Puriney - Purineys Notes
 
但可惜这样做,代码都写好了,就让我看这个?错误的结果就是错误的。最后按照高中数学老师教的观察、列举、演化、推导,豪言壮志挥写下这个公示之后,得到 COOLSHEEL 以及 SHELL 的各自对应数字算得85165.49。

带一个点号可就是另一个地址了。失败之后四舍五入85165。作者友情提示“我要的是字符”。好吧,character、numeric什么的,的确是要分清楚,我愧对码农世界。我没有去具体写代码去逆向解。只是二分法地不断套用 求COOLSHELL那套代码手动试出了答案,自惭形秽地下一关。


9-DUYO
【BIO】我不产生代码 - Puriney - Purineys Notes
图片分别是 Pigpen 和 Freemasan。谷歌 Pigpen 时就直接自动联想的 Pigpen cipher。这是一种字符转换为图形的一种加密方式。
【BIO】我不产生代码 - Puriney - Purineys Notes
H 就是第一个井字形的中下部分,即题目中密码的第一个字符,有点儿类似 n;同理密码的第二类似 O,即 E。以此类推,新世界你好。


【BIO】我不产生代码 - Puriney - Purineys Notes
  
貳:每一件事情最后结果都是好的
如果不是,那意味着你还离终点远着呢。

很多关我都尝试了反白,但一直不中。下意识我继续坚持了这次尝试,而正是这次尝试,带我去了隐藏关卡。最简单,也最意外。
【BIO】我不产生代码 - Puriney - Purineys Notes

原来是图片里藏东西的招数。那些年我很喜欢看些关于 linux 的各种东西。不记得是 奶牛 ubuntu 还是 freeTstar 介绍过这种招数。隐约记得有的评论,大意是妈妈再也不用担心我藏岛国动作片了。

顺带提一句,制作这么一个隐藏着压缩包的图片文件并不难:

cat your_image.jpg your_package.rar > new_jpg

作者用心良苦,教你发现隐藏的关卡里隐藏文件的方法,带你去隐藏着的密室。

叁:What I Cannot Create, I Don't Understand

【BIO】我不产生代码 - Puriney - Purineys Notes
【BIO】我不产生代码 - Puriney - Purineys Notes

想起来当年乔帮主死的时候一批果粉哭天抢地点蜡烛,而这个大神拿船票离开地球之后却几乎无人问津。人都是感性动物,就好像讲幻灯片时听众更喜欢沾满屏幕的大图而不是密密麻麻的文字,R 语言出了 Shiny 包做各种绚烂的数据可视化、knitr 代码流自动生成分析报告甚至 PPT,饱饱地让 R 语言和 Rstudio 公司火到爆炸。底层的故事、暗黑的魔法调制,似乎只能在基友间传唱。更加体会有一种尴尬是,女人看到的不是你艰辛的过程,而是你的原地踏步;在乎的不是过程中的所经所历,却是最后的结果。

负能量到此,我突然想起费曼的一句话,这也在合成生物学领域里一直传唱:我造不了等于我不懂。今天生物已经红牌、又被强制带入大数据时代后,我只想对生物信息学说:暖风熏得游人醉,小心喜当Jon Snow!

【BIO】我不产生代码 - Puriney - Purineys Notes


MOOC 是越来越火热、machine-learning 也是烂大街的话题;R和 Biconductor 提供了非常好的程序封装让生物信息分析如鱼得水。若把计算机科学比作仙剑,不是游戏变容易了起点变低了,而是你手上拿着清晰的地图,每一个路标都写的很清楚,甚至清楚到让神经学硕士顺利转型当码农(当然那个小哥也是蛮拼的刷了那么多 coursera 的课)。如今前所未有的师傅领着你进门,空无古人的一大波修行也在靠近。

现在生物之路如此不好走,一个在 Yale 博士毕业09年华科本科毕业的妹子14年做 AP 开始招人经营自己的实验室,在人人上发帖 (已删) 劝退生物的学生,能转则转。一面 CS 门槛越来越低、一面生物越来越没出路,来而不往非礼也。

R 和 Perl 成了生物信息学的标配,尤其是生物转 CS 的筒子。加了两个生物信息的 QQ 群,当微博 RSS 都刷完了我有时候会看看群里说了啥。一个群变成了大忽悠大白话儿专卖市面上有且仅有的那本Bioconductor中文书,另一个群则是文献求助聚集地。期间时不时蹦出一些哭笑不得的问题,比如 RGB 怎么转换成16进制,又比如 RNA-seq 分析怎么入门(可参考这里)、怎么学 R 语言 (可参考肖凯的书库);也有不少问题是围绕 cufflink/cuffdiff那一套做差异表达的,而正是这一套发 nature method的分析流程已经被老师吐槽:这玩意根本不准也有问题,使用起来老奶奶都会。

这种不问后台、不问背后的数学,直接上来套用的习惯,让我想到另一个梗:“我有一个绝妙的创意和一个靠谱的团队,就差一个写代码的了”。 直接贴上知乎的神回复吧:
【BIO】我不产生代码 - Puriney - Purineys Notes

这一年我越发欣赏 Y叔(尤其是道出求博路) 还有寇强。Y 叔前些日子因为唇战 Chip-seq 分析的一个 Bioconductor 包,给我的感觉是对方智商太低了缺乏常识,于是Y叔甩了个 biconductor 包打对方脸上。寇强好像是印第安纳某大农村在读博士,我今年申博士时本打算也去那里无奈 deadline 过了。R里面用 for 循环一般情况下都是找死的节奏,也难怪会和 Perl 成为搭配。有一个暗黑神器Rcpp = R + cpp。去年寇小哥微博上低调放出 Rcpp 翻译的 git repo,我 fork 了,时间上和能力上都力不从心。负能量说,最大的痛苦是,眼界跟上了本事却没跟上。如今这本书好像要出版了,很期待。而且小哥好像打算打算去折腾 Shogun,嗯,Gunnar R?tsch他们的团队是不错的。

末:“孩子你看多学一门外语多重要”

【BIO】我不产生代码 - Puriney - Purineys Notes
一次上表观遗传学的课,吴旻老师的一句话(大意)
我希望你们通过上这门课,以后在科研求索活动中,去解释某种实验现象时能够去想到表观遗传学。这门课或许会帮助你多一种解读方式。

--- 
谢谢那些更为优秀、乐于分享、善于施教的人
  评论这张
 
阅读(1641)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017