如何用最有创造力的方式输出42
酷壳似乎好长时间没有像《编程真难啊》或是《老手是这样教新手编程的》或是像《如何写出无法维护的代码》这样“严肃正经”的文章了,所以,赶在大家还没有向我扔臭鸡蛋前奉献一篇。这篇文章来自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 无删改 仅以此纪念陈皓(左耳朵耗子)
1+8Pro 用户 当时买小了 想着主力机是 iPhone 就只买了 128 现在根本不够用刚入手了 ace3pro 的大容量版本 想着 24G 内存 后台还不是随便开 结果和…
2022 年中旬,我开始以开源的方式写一本关于“架构设计”的书,现已出版上市。 写作期间,我多次在 v2 宣传,v2 的网友给了很多的意见和鼓励。上市之际,一是感谢 v2 朋友…
之前一直用 wildcard 的虚拟信用卡订阅 AI 服务,但是暑假的时候跑路了,后来就一直用免费的 chatgpt 和可以用支付宝订阅的 cursor ,现在我想试试 cha…
合速度