震惊!竟然有公司在圣诞礼物中放这个!
2018-12-25
虽然没能入职,依然向我要了地址发了圣诞礼物,感谢图森未来
礼物到了我迫不及待的拆开,照了两张照片,没错,就是下面这两张照片
本来我觉得礼物很不错,毕竟都是吃的,很合我的胃口,连勺都配好了,正准备吃里面的圣诞礼物…
万万没想到的是礼物中居然还有一份儿代码,怕看错了又仔细看了下,嗯…emmm,没错,有高亮有缩进,确定是代码无疑了
作为程序员的我异常敏感,需求和考验来了!我放下了手中的勺子,走到了电脑前。
看来目标就是需要进入卡片下方的破译网站,这个网站是个编译器,能把上面圣诞树代码解析出来,网站提示这个代码是用Brainfuck
这门语言写的,这语言名字,,,真给劲,,,把这些字符串都敲进去,应该不会很困难吧,于是老眼昏花的我就开始敲,代码如下:
+>+++++
+++[<++++>-]>
++++++++[<++++++
++>-]>++++++++++[<+++
+++++++>-]<<+++++
+++++++++++++++.>++++
+++++++++++++.<-.>-----------
-.++++.+++.----.-------.<<.>
>++++++++++++++++++.------
--------.++++++++++.-----------.<<.>>++
+++++++++++++++.----------.+++
+++.<<.>>--------------------.<<.>-----.>++++.++
+++++++++++..+++++++.<<.>----------.>-------------
----.++++++++++.---------.++++++++++.+.-------.----------
-.++++++++++++++++++.<<+.
我觉得我代码风格还是挺不错的,缩进的很到位,只不过高亮实在是做不到。
马上就要运行代码了,有点学生时代两个人传暗号小纸条的感受,还有点小期待呢。满怀期待的我把代码放到了编译器上运行,结果如下:
emmm,这结果不太对吧,看这句话的意思应该是:图森祝你圣诞快乐
,机智的我打开了谷歌翻译,果然这句话的英文应该是TuSimple wish you a Merry Christmas!
完了,果然老眼昏花敲错了,敲得时候我就说可别敲错了,这都没法debug。
先去看看语法吧,维基百科讲的还是很清楚的,看完之后我觉得这门语言设计的真不错,果然是wtf。
仔细看了下错误,发现和准确的英文相比其实ASCII码就差了1,比如Dhristmbt
应该是Christmas
,其中错的三个字符都是差了1,空格和!也是差了1,估计是少打了个符号?
万幸,找到了一个在线Brainfuck调试器,能单步调试的代码都不是事儿
经过调试我发现,[]
代表循环结构,其中前面的循环结构都是在给3个连续内存地址赋值初始化,这3个地址按顺序分别用于
- 存储标点符号的ASCII码
- 存储大写字母的ASCII码
- 存储小写字母的ASCII码
如下图所示,#代表断点
<
和>
负责向前和向后移动指针,+
和-
负责给当前值加1和减1,.
负责打印,也就是从初始化之后(上图的#
位置),根据.
字符进行分割,不断移动指针和修改ASCII码,一个字母一个字母的打印出了TuSimple!wish!you!a!Nerry!Dhristmbt"
。
根据上述结论,我发现,,,我根本就没打错,,,代码本来就有三处bug,看来果然是图森的考验,哈哈
修正后的代码如下:
>+++++ //多了一个加号
+++[<++++>-]>
++++++++[<++++++
++>-]>++++++++++[<+++
+++++++>-]<<+++++
+++++++++++++++.>++++
+++++++++++++.<-.>-----------
-.++++.+++.----.-------.<<.>
>++++++++++++++++++.------
--------.++++++++++.-----------.<<.>>++
+++++++++++++++.----------.+++
+++.<<.>>--------------------.<<.>------.>++++.++ //少了一个减号
+++++++++++..+++++++.<<.>----------.>-------------
----.++++++++++.---------.++++++++++.+.-------.----------
--.++++++++++++++++++.<<+. //少了一个减号
没有高亮凑合看吧,结果图如下:
总算结束了,可以继续吃了,祝图森未来一路顺风,祝大家圣诞节快乐,全剧终。