打印自身的程序
话说一转眼就一个多月过去了,也不知道自己在干什么,连这个Blog也荒芜了。Drcom写到一半,网络层的东西实在是蛋疼,而我本人对socket和进程多线程方面的白痴,尽管有现成的Python程序在那,对Python却一头雾水,也不知道啥时候能搞定……
不过今天在CU上看到了一个好玩的东西,传说中打印自己的程序。后来查了下才知道原来这个叫Quine ,我无知了……Quine以哲学家 Willard van Orman Quine (1908-2000) 而命名,表示一个可以 生成他自己的完全的源代码的程序。编写出某个语言中最简短的 quine 通常作为 黑客们的消遣。作为真正的 quine ,有一些约定:程序不能接受输入或者是打开文件,因为那 样就可以直接输入源代码或者是把源代码文件直接打开再重新打印出来,就没有 什么意思了;同时,一个完全空白的程序(产生完全空白的输出,即没有输出)也 并不能称作 quine 。quine 的想法最初出现在 Bratley, Paul and Jean Millo. "Computer Recreations; Self-Reproducing Automata", Software — Practice & Experience, Vol. 2 (1972). pp. 397-400 中 Bratley 在看到已知的第一个 这样的程序以后对 quine 产生了兴趣。这个程序于二十世纪六十年代由爱丁堡 大学的 Hamish Dewar 以 Atlas Autocode 语言写成。
这个据说是用 C 语言写成的 quine 中最简短的一个是由 Vlad Taeerov 和 Rashit Fakhreyev 所写成的仅包含 64 个字符的程序:
main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}看过之后才晓得对最常见的printf函数认识也是如此浮浅……
下面是几个C程序:
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
#define q(k)main(){return!puts(#k"\nq("#k")");}q(#define q(k)main(){return!puts(#k"\nq("#k")");})
还有几个shell脚本:
b=\\;bb=$b$b$b$b;q=\';x='echo "b=$bb;bb=\$b\$b\$b\$b;q=$b$q;x=$q$x$q";echo $x'echo "b=$bb;bb=\$b\$b\$b\$b;q=$b$q;x=$q$x$q";echo $x
#! /bin/shq="'" qq='echo \#! /bin/sh;echo q=\"$q\" qq=${q}$qq$q;echo eval \$qq'eval $qq
#!/bin/cat
任何内容
最后一个也挺有意思~~
最新评论