Z

知乎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')

第三段

1"".join(["ece", "Pi", "One"]).sorted {
2  (a, b) -> Bool in
3  return a < b
4}

现在来解答这三道题。

第一道

这肯定是个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。而下面的三行应该是传入后的计算过程,依次进行三行方法。所以初始版本应该是这样的:

1function zhi(a,b){
2  return a.toString(b).match(/../g);
3}

运行一下,传入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"这个字符串,这应该是第二题的答案了。

第三题:

第三题应该涉及两个地方:joinsort。最后的答案应该是字符串,所以应该是先sort后join。

这道题看一下应该就有答案了,明显的单词OnePiece么==。不过还是写下代码验证想法:

1["ece", "Pi", "One"].sort().join("");
2=> "OnePiece"

果然==。

输入三个单词,进入了新的界面,说明这三个解都对啦。

终极解法: 我在查看页面的代码以确定有无其他彩蛋时发现了这个:

1var e = atob("VGhvdXNhbmRTdW5ueXxMdWZmeXxPbmVQaWVjZQ==").split("|");

atob可将经过base64编码的字符串解码,而且页面在验证三个答案的正确性时并没有请求发送,所以验证应该是在本地的,不出意外的话这就是三道题的答案,运行一下:

1console.log(atob("VGhvdXNhbmRTdW5ueXxMdWZmeXxPbmVQaWVjZQ==").split("|"));
2=> ["ThousandSunny", "Luffy", "OnePiece"]

==果不其然。

知乎的这三道题还是挺有意思的,唯一有点技术含量的就是第二题了,对于函数,方法的考察,发现能力,作为测验的话我想还是把验证放在服务器上比较好,不然看下源码就直到答案了。