如何用最有创造力的方式输出42
原文:酷壳 – CoolShell · 陈皓 · 2014-03-06 · 42,949 人阅读

酷壳似乎好长时间没有像《编程真难啊》或是《老手是这样教新手编程的》或是像《如何写出无法维护的代码》这样“严肃正经”的文章了,所以,赶在大家还没有向我扔臭鸡蛋前奉献一篇。这篇文章来自CodeGolf.StackExchange上的《Most creative way to display 42》—— 请以最有创造力的方式输出42。于是出现了下面的这些答案(注:精彩的总是留在最后面)
人生和宇宙终级问题的答案:42
这里,需要介绍一下为什么要输出42。这时因为42是我们人生,世界乃至整个宇宙的终级答案。这要从《银河系漫游指南》(英文名:The Hitchhiker’s Guide to the Galaxy)说起。这本书是著名英国科幻小说作家Douglas Adams所著5本银河系漫游指南系列科幻喜剧系列小说中的第一本,改编自他本人为英国广播公司第四电台(BBC Radio 4)所写的广播剧剧本。该书1979年10月12日首次由麦克米伦出版公司(Pan Books)出版,次周成为英国图书销量榜冠军,前3个月内销售超过25万本。截至2005年,这本小说已被翻译成超过30种语言在全世界发行,并且被改编为电视剧、电影、舞台剧等多种艺术形式的作品。
这本小说中小说中充满尖锐的讽刺和隐喻,被西方科幻爱好者奉为“科幻圣经”。其中有两个关键词,一个是Don’t Panic,一个是42影响力很大,而其中关于42的故事简介是这样的:
百万年前,老鼠其实是一种超智慧生物,它们建造了一部超级电脑深思Deep Thought,它们问超级电脑,生命、宇宙以及任何事情的终极答案(Answer to Life, the Universe, and Everything)什么,经过了750万年的计算,深思告诉老鼠的后人答案是42,深思解释它只能计算出答案是什么,但答案的原因必须由另一部更高智能的电脑才能解释,而该部电脑就是地球。经过了800万年,就在结果要出来的五分钟前,地球却因为挡在预定兴建的星际间高速公路的路线,被Vogons给毁灭,电脑没有给出最后的结果。
故事里面还说了这个42是6 乘于 9得来。当然,6乘9应该是54,但是因为地球上的电脑被搞坏了,导致主人翁答错了。至于后来有人说6 x 9 = 42是基于13进制,原作者说,完全没有这回事,他就是瞎搞的。
网上有很多人在猜测42的含义,比如douban的这篇文章,但是原作者出来说这他就是随机想了一个,完全没有任何意义。
对于42来说,数字42和短语,“生命,宇宙以及一切的答案”(Answer to Life, the Universe, and Everything) 已达到在互联网上邪教的地位。在各种技术宅,极客,科学圈有着非同凡响的地位。
- 您若在Google输入the answer to life, the universe, and everything,Google会直接回答42——而且还是用Google计算器算出来的。
- 若在Wolfram Alpha中输入Answer to the Ultimate Question of Life, the Universe, and Everything,Wolfram Alpha也会回答42
- 若在iPhone/iPad的Siri中问[What’s the meaning of life?],Siri也会回答42
- 在OpenOffice.org软件,如果您在任何单元格输入spreadsheet=ANTWORT(“Das Leben, das Universum und der ganze Rest”) (注:德语的ANSWER(“life, the universe and everything”)),结果也会是42。
另外,在美剧《Lost》里那个经典的数字序列: 4, 8, 15, 16, 23,42。经Lost的导演确认,最后那个42也是源自《银河系漫游指南》
好了,言归正传,下面让我们来看一下如何输出42的。
Ruby
puts (6 * 9).to_s(13)[/h4]
解释:6 x 9 = 42的表达式(基于13进制)
Javascript
[javascript]String.prototype.answer = function() {
alert(this.charCodeAt(+!"The End of the Universe"));
};
‘*’.answer();[/javascript]
解释:+!”The End of the Universe”的值是0,’*’的ASCII码是42
[javascript]console.log("Douglas Adams".length + "born on".length +
[1,1,0,3,1,9,5,2].reduce(
function(previousValue, currentValue, index, array){
return previousValue + currentValue;
}
)
);
/* [1,1,0,3,1,9,5,2] => March 11, 1952 */[/javascript]
解释:Douglas Adams 是一位英国广播剧作家、和音乐家,尤其以《银河系漫游指南》系列作品出名。这部作品以广播剧起家,后来发展成包括五本书的“三部曲”,拍成电视连续剧。亚当斯逝世后还拍成电影。 除《银河系漫游指南》系列外亚当斯还参加了科幻电视连续剧《神秘博士》的拍摄工作,他写了其中的一些剧本。也的生日是 1952 年 3 月 11 日。
[javascript]alert((!![]+ -[])*(!![]+ -[])+""+(!![]+ -~[]))[/javascript]
解释:[]是个空,![]就是true,~[]是-1, 于是,表达式就这样出来了。变态!
[javascript]var ________ = 0.023809523809523808, ____ = 1, ___ = 0, __ = 0, _ = 1;
__ – ___
/_ |0 // \
// 0 // \
//_ |0 //
// |0 //
//___ |_ //
/|0 //
|0 //______[/javascript]
解释:这个其实是代码混乱的技巧之一,用下划线当变量。你可以参考《如何加密/混乱C源代码》和《6个变态的C语言Hello World程序》
Shell
echo "what is the universe"|tr "a-z " 0-7-0-729|sed 's/9.//g;s/-/+/'|bc
解释:其中,bc是一个计算器。tr是一个字符转换的命令,比如:echo "good" | tr "good" "test"输出 tsst。也就是说,g-t, o-e, o-s, d-t的映射,o被映了两次,所以,第二次会覆盖第一次。对于上面的tr "a-z " 0-7-0-7-729的意思是:abcdefg分别对应01234567,h对应-,ijklmno对应01234567,p对于2,剩下的包括空格都是9。如果你对tr和sed和bc不熟悉的话,可以man一下,关于sed你可以看一下我的《sed简明教程》
解释:2#100的意思就是说,#左边的数说明是“2进制”,右边的数是二进制数“100”,如16#ff就是16进制的ff,也就是十进制的255
echo "obase=13;6*9"|bc|figlet
上面的命令输出:
解释:为了使用figlet命令,你还要去安装一个figlet(http://www.figlet.org/)这是一个让你画ASCII图的命令。
Python
Windows下,给你画个图:
输出:
lambda表达式
>>> p = lambda x: x%2!=0 and True<>> sum(p(i) for i in range(0,6))
解释:对python的lambda表达式或函数式编程不是很清楚的同学可以看一下《函数式编程》
Java
上面这段看上去平淡无奇,但其亮点是那三个string,这段代码输出:
别忘了Java也可以混乱代码:
C/C++
解释:\b是backspace,fprintf的返回值是写成功数据的长度。
输出:

解释:6 x 9 = 42 ???,如果你知道宏只是做简单的字符串替换的话,你就知道sixnine被替换成了1+58+1这个表达式了。呵呵。
解释:参看原文的这个答案里的How-To一节。
Brainfuck
代码混乱自然少不了brainfuck语言:(更多的奇葩的编程语言请参考《那些BT雷人的编程语言》)
不过,下面这个BrainFuck更无聊,所以顶在了最佳答案上:
执行上面的代码,你会得到下面的输出:
再执行上面的代码,会输出:
如果6*9=42就完美了,就差一步啊……
(全文完)
(转载本站文章请注明作者和出处 酷 壳 - CoolShell ,请勿用于任何商业用途)
转载请注明作者和出处:酷壳 – CoolShell。本文仅供学习,请勿用于商业用途。
