如何用最有创造力的方式输出42
酷壳似乎好长时间没有像《编程真难啊》或是《老手是这样教新手编程的》或是像《如何写出无法维护的代码》这样“严肃正经”的文章了,所以,赶在大家还没有向我扔臭鸡蛋前奉献一篇。这篇文章来自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简明教程》
#!/bin/bash #Vertical Version echo $((2#100)) echo $((2#10)) #Horizontal Version echo $((2#000100))$((2#00010))
解释: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下,给你画个图:
import win32api, win32con, win32gui from time import time, sleep import os w = { 1:[(358, 263), (358, 262), (358, 261), (359, 261), (359, 262), (359, 264), (359, 266), (359, 270), (359, 282), (358, 289), (357, 308), (356, 319), (355, 341), (355, 351), (355, 360), (355, 378), (355, 388), (354, 397), (354, 406), (354, 422), (354, 428), (354, 436), (354, 438), (354, 439), (354, 440), (355, 440), (356, 439), (357, 439), (358, 438), (360, 438), (362, 437), (369, 437), (372, 437), (381, 437), (386, 437), (391, 437), (397, 436), (411, 436), (419, 435), (434, 435), (442, 435), (449, 434), (456, 434), (468, 434), (473, 435), (480, 436), (483, 436), (485, 436), (487, 437), (488, 437), (488, 438), (488, 439), (487, 440), (486, 440), (485, 440), (484, 440), (483, 439), (483, 437), (481, 431), (481, 427), (481, 420), (481, 413), (483, 396), (485, 387), (488, 367), (491, 356), (493, 345), (500, 321), (503, 310), (507, 299), (514, 280), (517, 272), (520, 266), (523, 260), (524, 258), (524, 259), (524, 261), (524, 265), (524, 269), (523, 275), (522, 289), (521, 297), (518, 315), (516, 324), (515, 334), (513, 345), (509, 368), (507, 382), (502, 411), (500, 426), (498, 440), (495, 453), (491, 478), (489, 491), (485, 517), (483, 530), (481, 542), (479, 552), (476, 570), (475, 577), (474, 588), (473, 592), (473, 595), (473, 597), (473, 600), (473, 601), (473, 602), (473, 601), (474, 599), (475, 597), (476, 594), (478, 587)], 2:[(632, 305), (634, 306), (636, 309), (639, 314), (641, 319), (645, 330), (647, 337), (649, 353), (649, 362), (649, 372), (649, 384), (645, 409), (639, 436), (636, 448), (632, 459), (627, 470), (623, 479), (613, 497), (608, 503), (599, 512), (595, 514), (591, 514), (587, 513), (581, 504), (578, 498), (576, 483), (575, 476), (575, 469), (579, 454), (582, 447), (591, 436), (595, 432), (600, 430), (605, 429), (617, 432), (624, 437), (639, 448), (646, 455), (654, 461), (662, 469), (679, 484), (686, 491), (702, 504), (710, 509), (718, 512), (727, 514), (744, 515), (752, 515), (767, 512), (774, 510), (779, 508), (783, 505), (788, 499), (789, 495), (789, 486)] } def d( x1, y1, x2, y2 ): win32api.SetCursorPos((x1, y1)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) win32api.SetCursorPos((x2, y2)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) sleep(0.01) def p( l1 ): l2 = [""] l2.extend(l1) l1.append("") l3 = zip(l2, l1) l3.pop(0) l3.pop(-1) for n in l3: d(n[0][0], n[0][1], n[1][0], n[1][2]) os.startfile("C:\Windows\system32\mspaint.exe") sleep(0.5) win32gui.ShowWindow(win32gui.GetForegroundWindow(), win32con.SW_MAXIMIZE) sleep(0.5) for n in w: p(w[n])
输出:
lambda表达式
>>> p = lambda x: x%2!=0 and True<>> sum(p(i) for i in range(0,6))
解释:对python的lambda表达式或函数式编程不是很清楚的同学可以看一下《函数式编程》
Java
import java.lang.*; class answer_to_everything { void static main() { String s = "Hitchhiker's Guide to the Galaxy"; String s2 = "Don'tPanic"; String s3 = "The Restaurant at the End of the Universe."; int arthur_dent = s.length(); int ford_prefect = s2.length(); int zooey_deschanel = s3.length(); int vogon_poetry = arthur_dent + ford_prefect; System.out.println(" " + vogon_poetry + " " + zooey_deschanel + " " + zooey_deschanel); //in case you're confused, I'm using Zooey to print the big '2', and Vogons to print the big '4'. System.out.println(" " + vogon_poetry + vogon_poetry + " " + zooey_deschanel + " " + zooey_deschanel); System.out.println(" " + vogon_poetry + " " + vogon_poetry + " " + zooey_deschanel + " " + zooey_deschanel); System.out.println(" " + vogon_poetry + " " + vogon_poetry + " " + zooey_deschanel); System.out.println(" " + vogon_poetry + " " + vogon_poetry + " " + zooey_deschanel); System.out.println(vogon_poetry + " " + vogon_poetry + " " + vogon_poetry + " DA " + vogon_poetry + " " + zooey_deschanel); System.out.println(" " + vogon_poetry + " " + zooey_deschanel); System.out.println(" " + vogon_poetry + " " + zooey_deschanel + " " + zooey_deschanel + " " + zooey_deschanel + " " + zooey_deschanel); } }
上面这段看上去平淡无奇,但其亮点是那三个string,这段代码输出:
42 42 42 4242 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 DA 42 42 42 42 42 42 42 42 42
别忘了Java也可以混乱代码:
public class FourtyTwo{ public static void main(String[]args) { new javax .swing. JFrame () {{ setSize (42 /( 42/42 +42/42) *42/ ( 42/42 +42/42) ,42/(42/ 42+42/42)* 42/(42/42+42/42)); }public void paint( java.awt .Graphics g){g.drawPolygon( new int[]{42,42,42 + 42+ 42,42+ 42+42 ,42+42 +42 + 42,42+ 42+42 +42,42 + 42+ 42,42+42+42,42+42, 42+42 },new int[]{42,42+ 42+42 +42,42+42+42+42,42 +42+42+42+42+42, 42+42+ 42+42+42+42,42,42, 42+42+42 ,42 + 42+42 ,42}, (42/ 42+42 /42)* (42/ 42 + 42/42 + 42/ 42 + 42 / 42+42 /42)) ;g.drawPolygon ( new int[] {42+42+42+42+42, 42+42 +42 + 42+42 , 42+ 42+42 + 42+ 42+42 + 42, 42+42 +42 + 42+42 +42 + 42,42+42+42+42+42, 42+42 + 42+ 42+42,42+ 42+42+ 42+42 +42 + 42+42,42+42+42+42+42+42+42+42,42+42+42+42+42+42, 42+42+42+42+42+42,42+42+42+42+42+42+42+42,42+42+ 42+42+42+42+42+42},new int[]{42,42 +42,42+42,42+ 42+42,42+42+42,42+42+42+42+42+42,42+42+42+42+42+ 42,42+42+42+42+42,42+42+42+42+42,42+42+42+42,42+ 42+42+42,42},(42/42+42/42+42/42)*((42/42+42/42)* (42/42+42/ 42)));};}.setVisible(42*42*42!=42);}}
C/C++
#include int main() { printf("%d", fprintf( fopen("/dev/null","w"), "so-popularity-contest\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b") ); }
解释:\b是backspace,fprintf的返回值是写成功数据的长度。
#include<iostream> using namespace std; int main() { cout<<(char)32<<(char)32<<(char)32; cout<<(char)66<<(char)73<<(char)82; cout<<(char)84<<(char)72<<(char)32; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)68<<(char)69; cout<<(char)65<<(char)84<<(char)72; cout<<(char)32<<(char)32<<'\n'; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)32<<(char)95; cout<<(char)95<<(char)95<<(char)32; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)95<<(char)95; cout<<(char)95<<(char)95<<(char)95; cout<<(char)95<<(char)32<<'\n'; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)47<<(char)32; cout<<(char)32<<(char)32<<(char)124; cout<<(char)32<<(char)32<<(char)32; cout<<(char)124<<(char)32<<(char)32; cout<<(char)95<<(char)95<<(char)32; cout<<(char)32<<(char)124<<'\n'; cout<<(char)32<<(char)32<<(char)32; cout<<(char)47<<(char)32<<(char)47; cout<<(char)124<<(char)32<<(char)124; cout<<(char)32<<(char)32<<(char)32; cout<<(char)124<<(char)95<<(char)124; cout<<(char)32<<(char)32<<(char)124; cout<<(char)32<<(char)124<<'\n'; cout<<(char)32<<(char)32<<(char)47; cout<<(char)32<<(char)47<<(char)32; cout<<(char)124<<(char)49<<(char)124; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)32<<(char)47; cout<<(char)50<<(char)124<<'\n'; cout<<(char)32<<(char)47<<(char)32; cout<<(char)47<<(char)32<<(char)32; cout<<(char)124<<(char)57<<(char)124; cout<<(char)32<<(char)32<<(char)32; cout<<(char)84<<(char)79<<(char)32; cout<<(char)32<<(char)47<<(char)48; cout<<(char)47<<(char)32<<'\n'; cout<<(char)47<<(char)32<<(char)47; cout<<(char)95<<(char)95<<(char)95; cout<<(char)124<<(char)53<<(char)124; cout<<(char)95<<(char)95<<(char)32; cout<<(char)32<<(char)32<<(char)32; cout<<(char)47<<(char)48<<(char)47; cout<<(char)32<<(char)32<<'\n'; cout<<(char)124<<(char)95<<(char)95; cout<<(char)95<<(char)95<<(char)95; cout<<(char)124<<(char)50<<(char)124; cout<<(char)95<<(char)95<<(char)124; cout<<(char)32<<(char)32<<(char)47; cout<<(char)49<<(char)47<<(char)32; cout<<(char)32<<(char)32<<'\n'; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)32<<(char)32; cout<<(char)124<<(char)32<<(char)124; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)47<<(char)32; cout<<(char)47<<(char)32<<(char)32; cout<<(char)32<<(char)32<<'\n'; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)32<<(char)32; cout<<(char)124<<(char)32<<(char)124; cout<<(char)32<<(char)32<<(char)32; cout<<(char)47<<(char)32<<(char)47; cout<<(char)95<<(char)95<<(char)95; cout<<(char)95<<(char)32<<'\n'; cout<<(char)32<<(char)32<<(char)32; cout<<(char)32<<(char)32<<(char)32; cout<<(char)124<<(char)95<<(char)124; cout<<(char)32<<(char)32<<(char)124; cout<<(char)95<<(char)95<<(char)95; cout<<(char)95<<(char)95<<(char)95; cout<<(char)95<<(char)124<<'\n'; return 0; }
输出:
#include <stdio.h> #define six 1+5 #define nine 8+1 int main() { printf("what do you get when you multiply six by nine?\n"); printf("%i x %i = %i\n", six, nine, six*nine); }
解释:6 x 9 = 42 ???,如果你知道宏只是做简单的字符串替换的话,你就知道six*nine被替换成了1+5*8+1这个表达式了。呵呵。
main(c ,z,_){c==01? main(c+ 1,0,c^c):c==2 ?z=_["#" "#$#%&#%#x'%%" "()&(%%x" "$%$(" "(&(""*%x" "'%%(" "(&(" "+%x" "'#%(" "(&(" "%#x" ],z ?z =='x'?main(4,_ ,c*5):main(c +1,z,0),main(c ,z,_+1):00:c ==3?(_+-2)==3? main(_-1,_, 32):( main( c+1,c ,((2+ c)*(z -35)+ _)["" "six" "*ni" "ne= { } " " ;" " _ ( " ") [" " 3 ]do {;"]== 32?32 :043),main(c,z ,_+1) ):putchar(_);}
解释:参看原文的这个答案里的How-To一节。
Brainfuck
代码混乱自然少不了brainfuck语言:(更多的奇葩的编程语言请参考《那些BT雷人的编程语言》)
+++++ +++[>+>++> +++>++ ++>+++++>+++++ +>+++++ ++>+ ++++ +++ >+++ ++++ ++>+ +++ ++++ ++>+ +++ ++++ +++> +++ ++++ ++++ +>+ ++++ ++++ +++ +>++ ++++ ++++++++>+++++++++ ++++ ++>+++++++++++++++ +<<< <<<< <<<< <<<< <-]> >>>> >>----.++++<<<<< <<>> >>>>++.--<<<<<<.
不过,下面这个BrainFuck更无聊,所以顶在了最佳答案上:
+++++[>++[>+>+ ++>++++>++++>++++>++++++ >++++++>+++++++ ++>+++++++++<<<<<<<<<-]>> >+>+>+> >>>+[<]< -]>> >++>-->>+>>++>+ >--<<<< <<<..... .> ....<...... ...>... <<.>.... >.>>>>>.<. <<<<.. ..<.... >..>>>>>.< .<<<<. >>>.<<. >>>>>.<.< <<<<< <.>...> >>>.>>>. <<<.< <<<..>> .>>>>>.< <.<<< <<...>> >>>.<<< <..<. ...>... <<.>..>. >>.<.<<...>>...<<...>>...< <....>>.. .<<<.>.>>..>.<<.......<.... .....>... <<.>... .....>... <...... .>>>.<<.. <<.>... .....>...<......>.>>.<.<<< .>...... ..>>...<<....>>.....>.<..>.
执行上面的代码,你会得到下面的输出:
++++ +++ +[>++++ ++[>+<-][ <]< -]> >++ +++ +.- --- --- --- --.+++++++ +++ +++ .++ +++ +.- --- -----.--.
再执行上面的代码,会输出:
6*7=42
如果6*9=42就完美了,就差一步啊……