酷壳似乎好长时间没有像《编程真难啊》或是《老手是这样教新手编程的》或是像《如何写出无法维护的代码》这样“严肃正经”的文章了,所以,赶在大家还没有向我扔臭鸡蛋前奉献一篇。这篇文章来自CodeGolf.StackExchange上的《Most creative way to display 42》—— 请以最有创造力的方式输出42。于是出现了下面的这些答案(注:精彩的总是留在最后面)

目录

人生和宇宙终级问题的答案:42RubyJavascriptShellPythonJavaC/C++Brainfuck

人生和宇宙终级问题的答案: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(n0, n0, n1, n1)

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(424242!=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

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雷人的编程语言》)

+++++ +++[>+>++>
+++>++ ++>+++++>+++++
+>+++++ ++>+ ++++
+++ >+++ ++++ ++>+
+++ ++++ ++>+
+++ ++++ +++>
+++ ++++ ++++
+>+ ++++ ++++
+++ +>++ ++++
++++++++>+++++++++ ++++
++>+++++++++++++++ + >++>-->>+>>++>+

--..<
.>>.>>.
.<
............>..

执行上面的代码,你会得到下面的输出:

++++ +++
+[>++++ ++[>+++ +++
+.- --- --- ---
--.+++++++ +++
+++ .++
+++ +.-
--- -----.--.

再执行上面的代码,会输出:

6*7=42

如果6*9=42就完美了,就差一步啊……

(全文完)

转载于酷壳CoolShell 无删改 仅以此纪念陈皓(左耳朵耗子)