很早就听说过Quine,然而从来没动手写过一个。最近因为写完了论文,又搞定了签证,堕落到“蛋疼”,所以来玩一下。
简单的来说,quine就是写一个程序,然后这个程序的输出就是程序的源代码自身(self-replicating programs, self-reproducing programs)。
思路:
[code a] print str = "[code a] print str = @@ [code b]" [code b]
其中code a是任意的程序a,code b类似; print是打印函数;str 是一个字符串,字符串里@@表示"字符串本身"。code a, b不会调用print函数;print函数用来打印字符串str:首先打印code a,然后打印print语句自身,然后打印字符串,然后打印code b。
蛋疼的coding开始了,语言用的c++,程序如下:
程序中PrintData用来打印这个字符串,因为C++的转义符很麻烦,所以这里有额外的处理。main函数里面首先定义字符串str,然后是一个for语句用来打印这个整个源程序,当遇到@@的时候调用PrintData函数来打印字符串str本身。
因为涉及c的字符转义,所以非常的“蛋疼”,上网搜了一下,更有达人,把字符串的每个字符写成ASCII码!
当然,这个世界上天才很多,下面是有史以来最简单的用c表示的quine程序:
程序很简单,首先省去stdio.h的include,然后省去main的返回值。main函数里,首先定义字符串s,注意这里有%c%s%c作为待定参数,因为s=后面有引号。%s的位置用来接受字符串本身,非常聪明!!例外,它也不涉及转义,因为用ASCII码34表示引号。
神一般的quine in c!
不过,还有更神的quine!
第一个:世界地图
这个ruby程序不但会打印自身,而且中间的这个世界地图,会向右旋转!不信你把他保存为rb文件,然后运行50次看看。
第二个:多语言自身复制循环 (转载自:http://d.hatena.ne.jp/ku-ma-me/20090916/p1)
这个程序运行以下的命令,又变成自身的了!这些命令首先是ruby转python,再转perl,再转lua,再转ocaml,再转ghc,再转c,再转java,再转beef,再转whitespace,再转unlamba……
其中各解释器/编译器的版本是:
- ruby 1.8.7-p72
- Python 2.5.2
- perl v5.10.0
- Lua 5.0.3
- OCaml 3.10.2
- ghc-6.8.2
- gcc 4.3.2
- java "1.5.0_17"
- beef 0.0.6-2
- whitespace 0.3-2
- unlambda 2.0.0-5
欢迎“蛋疼者”测试验证。