Quine——输出自身的程序

能够输出自身的代码被称为Quine,以哲学家Willard van Orman Quine(1908-2000)而命名。
Quine在图灵完备的语言中都是可行的。在可计算性理论(computability theory)中,图灵等价指的是:对于两个计算机A和B,如果A可以模拟B,B可以模拟A,就称他们是图灵等价的。根据『丘奇-图灵』理论,图灵机是表达能力最强大的计算系统,对现实世界中的任何计算机,都可以用图灵机来模拟它。
套用上面的定义,如果一个编程语言可以完全模拟图灵机,那么它就是图灵完备的。大部分编程语言都是图灵完备的,因为他们需要解决各种问题的通用能力,而这正是图灵机所具备的。不过也存在一些语言不是图灵完备的,他们通常是被设计用来解决某些特殊的问题,比如SQL以及正则表达式。


Shell

1
z=\' a='z=\\$z a=$z$a$z\; eval echo \$a'; eval echo $a

PHP

1
echo file_get_content(__FILE__);

JavaScript

1
!function $(){console.log('!'+$+'()')}()

1
var s = 'var%20s%20%3D%20%27__%27%3B%20console.log%28unescape%28s%29.replace%28%27__%27%2C%20s%29%29'; console.log(unescape(s).replace('__', s))

Python

1
r='r=%r;print r%%r';print r%r

1
2
3
x='y="x="+`x`+"\\n"\nprint y+x'
y="x="+`x`+"\n"
print y+x

Perl

1
$_=q{print"\$_=q{$_};eval"};eval

Pascal

1
CONST T=';BEGIN WRITE(#67#79#78#83#84#32#84#61#39,T,#39,T)END.';BEGIN WRITE(#67#79#78#83#84#32#84#61#39,T,#39,T)END.

C

1
char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}

1
main(){char s[]="main(){char s[]=%c%s%c;printf(s,34,s,34);return 0;}";printf(s,34,s,34);return 0;}
1
2
3
4
5
6
7
8
9
10
#include
char buff[80];
int main() {
FILE *fp;
fp = fopen(__FILE__, "r");
while(!feof(fp)) {
printf("%s",fgets(buff,79,fp));
}
fclose(fp);
}

Brainfuck

1
>+>+++>>+>++>+>+++>>+>++>>>+>+>+>++>+>>>>+++>+>>++>+>+++>>++>++>>+>>+>++>++>+>>>>+++>+>>>>++>++>>>>+>>++>+>+++>>>++>>++++++>>+>>++>+>>>>+++>>+++++>>+>+++>>>++>>++>>+>>++>+>+++>>>++>>+++++++++++++>>+>>++>+>+++>+>+++>>>++>>++++>>+>>++>+>>>>+++>>+++++>>>>++>>>>+>+>++>>+++>+>>>>+++>+>>>>+++>+>>>>+++>>++>++>+>+++>+>++>++>>>>>>++>+>+++>>>>>+++>>>++>+>+++>+>+>++>>>>>>++>>>+>>>++>+>>>>+++>+>>>+>>++>+>++++++++++++++++++>>>>+>+>>>+>>++>+>+++>>>++>>++++++++>>+>>++>+>>>>+++>>++++++>>>+>++>>+++>+>+>++>+>+++>>>>>+++>>>+>+>>++>+>+++>>>++>>++++++++>>+>>++>+>>>>+++>>++++>>+>+++>>>>>>++>+>+++>>+>++>>>>+>+>++>+>>>>+++>>+++>>>+[[->>+<<]<+]+++++[->+++++++++<]>.[+]>>[<<+++++++[->+++++++++<]>-.------------------->-[-<.<+>>]<[+]<+>>>]<<<[-[-[-[>>+<++++++[->+++++<]]>++++++++++++++<]>+++<]++++++[->+++++++<]>+<<<-[->>>++<<<]>[->>.<<]<<]

Lisp(mit-scheme)

1
((lambda (x) (list x (list (quote quote) x))) (quote (lambda (x) (list x (list (quote quote) x)))))


参考文章:
最小的图灵完备语言——BrainFuck
能不能写出一个代码,使代码的运行结果是输出这段代码本身? - 知乎

拓展阅读:
The Quine Page
是否无法写一段代码将这段代码自己打印出来? - 知乎
编程领域都有哪些牛逼闪闪的『禁术』? - 知乎

更多神奇的Quine代码:
quine-relay
quine-central

🍭支持一根棒棒糖!
0%