知乎Hackers三道题
在最近的知乎招聘页面上有个视频,我不小心点开看了,突然看了一会,突然发现其中有代码闪现,我猜这一定是知乎的彩蛋了,看完全部视频,出现了三段代码,以及一个链接 http://zhi.hu/hackers (链接已失效)。
打开链接,有要输入三个答案才有效,这应该对应着视频中的三段代码。
第一段
1def python():
2 t = string.maketrans('dicEuvyaOe', 'adhSonsuTy')
3 print 'OcuaydviEavve'.translate(t)
第二段
1do (a=0x4c75666679, b=0x10) ->
2 a.toString(b).match(/../g)
3 .reduce(((s, n) -> s + String.formCharCode parseInt n, b), '')
4 .link('http://zhi.hu/hackers')
第三段
现在来解答这三道题。
第一道:
这肯定是个Python的问题了,打开Python,输入其中代码,然后运行这个定义了的函数:
1Traceback (most recent call last):
2 File "<stdin>", line 1, in <module>
3 File "<stdin>", line 2, in python
4NameError: global name 'string' is not defined
出现了错误,解决方法很简单,import就可以了:
1import string
再次运行,出现了 ThousandSunny
字符串,这应该是第一题的答案了。
第二题:
第二题中出现了 toString
match
,这不都是js的方法吗,所以第二题应该是js的,打开Chrome开发者控制台,开始试验。
首先的问题是,这段并不是可直接执行的代码,需要人脑进行转换。->
有点像CoffeeScript中定义函数的关键字,所以这应该是一个函数,传入了a和b。而下面的三行应该是传入后的计算过程,依次进行三行方法。所以初始版本应该是这样的:
运行一下,传入a和b,得到了下列数组。
1["4c", "75", "66", "66", "79"]
下面的reduce方法应该就是与这个数组有关了。reduce方法接收一个函数作为累加器,所以reduce中的内容应该是一个函数,s,n为参数,返回 s + String.formCharCode parseInt n, b)
这个东西。formCharCode
的功能是将Unicode返回为字符串,可接受多个功能相同参数,parseInt
将字符串返回为整数,可接受两个功能不同的参数。这时有个问题,到底n,b是谁的参数呢,我猜这俩应该都是parseInt
的,因为它的参数功能不同==,事实证明我是对的。最后那行link就可以忽略了,因为它不具有数据处理功能,只是把一个字符串变为链接的形式,所以代码应该是下面这样:
1function zhi(a,b){
2 return a.toString(b).match(/../g)
3 .reduce(function(s, n){
4 return s + String.fromCharCode(parseInt(n, b))
5 },'');
6}
结果是"Luffy"
这个字符串,这应该是第二题的答案了。
第三题:
第三题应该涉及两个地方:join
与sort
。最后的答案应该是字符串,所以应该是先sort后join。
这道题看一下应该就有答案了,明显的单词OnePiece
么==。不过还是写下代码验证想法:
果然==。
输入三个单词,进入了新的界面,说明这三个解都对啦。
终极解法: 我在查看页面的代码以确定有无其他彩蛋时发现了这个:
1var e = atob("VGhvdXNhbmRTdW5ueXxMdWZmeXxPbmVQaWVjZQ==").split("|");
atob
可将经过base64编码的字符串解码,而且页面在验证三个答案的正确性时并没有请求发送,所以验证应该是在本地的,不出意外的话这就是三道题的答案,运行一下:
1console.log(atob("VGhvdXNhbmRTdW5ueXxMdWZmeXxPbmVQaWVjZQ==").split("|"));
2=> ["ThousandSunny", "Luffy", "OnePiece"]
==果不其然。
知乎的这三道题还是挺有意思的,唯一有点技术含量的就是第二题了,对于函数,方法的考察,发现能力,作为测验的话我想还是把验证放在服务器上比较好,不然看下源码就直到答案了。