以前的TOJ上有一道著名的题目:要求写一个输出自己本身代码的程序,前提是程序不能看自己的代码。
这个问题有很久的历史了,被称为Quine程序,很多人都有一些经典的作品。
其实编写这个程序与使用的语言有很大的关系。比如Lisp语言任何一个原子就是本身。在一般的情况下,编写这个程序是需要克服一些思想上的循环的。

先给一个Pascal语言的例子

const a='const a=';b=';begin write(a,#39,a,#39#59#98#61#39,b,#39,b)end.';
begin write(a,#39,a,#39#59#98#61#39,b,#39,b)end.

大概理解一下,就是通过构造常量,并用其余方法来避开对'符号的循环引用。

接下来是传说中的最短的c语言代码 (64char)

main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}

不知看了以下代码,你会做何感想:

program margrop(output);

const
quote=char(39);
semicolon=char(59);
prefix=char(97)+char(91);
suffix=char(93)+char(5 8) +char(61);

function reverse(s:String) : String;
var
r: String;
i: Integer;

begin
r := Copy(s, 0, 0);
for i := 1 to length(s) do
r := s[i] + r;
reverse := r
end;

var
a:array[0..40] of string;

procedure display(i:integer;reversed:boolean);
begin
if reversed then
writeln(semicolon,quote,reverse(a[i]),quote,reverse(suffix),i mod 10,i div 10,reverse(prefix))
else
writeln(prefix,i div 10,i mod 10,suffix,quote,a[i],quote,semicolon)
end;

var
i: Integer;
begin
a[00]:='program margrop(output);';
a[01]:='';
a[02]:='const';
a[03]:=' quote=char(39);';
a[04]:=' semicolon=char(59);';
a[05]:=' prefix=char(97)+char(91);';
a[06]:=' suffix=char(93)+char(5 8) +char(61);';
a[07]:='';
a[08]:='function reverse(s:String) : String;';
a[09]:='var';
a[10]:=' r: String;';
a[11]:=' i: Integer;';
a[12]:='';
a[13]:='begin';
a[14]:=' r := Copy(s, 0, 0);';
a[15]:=' for i := 1 to length(s) do';
a[16]:=' r := s[i] + r;';
a[17]:=' reverse := r';
a[18]:='end;';
a[19]:='';
a[20]:='var';
a[21]:=' a:array[0..40] of string;';
a[22]:='';
a[23]:='procedure display(i:integer;reversed:boolean);';
a[24]:='begin';
a[25]:=' if reversed then';
a[26]:=' writeln(semicolon,quote,reverse(a[i]),quote,reverse(suffix),i mod 10,i div 10,reverse(prefix))';
a[27]:=' else';
a[28]:=' writeln(prefix,i div 10,i mod 10,suffix,quote,a[i],quote,semicolon)';
a[29]:='end;';
a[30]:='';
a[31]:='var';
a[32]:=' i: Integer;';
a[33]:='begin';
a[34]:=' for i := 0 to 33 do writeln(a[i]);';
a[35]:=' for i := 0 to 40 do display(i,false);';
a[36]:=' for i := 34 to 40 do writeln(a[i]);';
a[37]:=' for i := 40 downto 34 do writeln(reverse(a[i]));';
a[38]:=' for i := 40 downto 0 do display(i,true);';
a[39]:=' for i := 33 downto 0 do writeln(reverse(a[i]));';
a[40]:='end.';
for i := 0 to 33 do writeln(a[i]);
for i := 0 to 40 do display(i,false);
for i := 34 to 40 do writeln(a[i]);
for i := 40 downto 34 do writeln(reverse(a[i]));
for i := 40 downto 0 do display(i,true);
for i := 33 downto 0 do writeln(reverse(a[i]));
end.

大家应该比较容易看出来:这个程序的输出,正好是自己代码的逆。
可以看看他的程序头:margorp,我本来想查查这个单词,结果突然发现把它倒过来就成了:program。
你不如自己写写试试,体验一下神奇的quine程序。
这个页面介绍了一些关于quine的内容,并且收集了大量的quine程序,不妨一看 :)