自打印算法
自打印问题描述:
自打印是指在程序中不读取任何额外的信息,仅使用程序代码中携带的功能和信息,将程序代码本身打印输出。
在阅读下面的部分之前, 我强烈的建议你自己先想一下这个问题,然后试着去实现一下。
自打印算法原理:
一个完整的自打印程序通常至少包括两部分:“描述部分”和“执行部分”。在“描述部分”,用字符串变量来存储“执行部分”的代码。而“执行部分”的代码则打印这个字符串变量。
实现:
C语言版本:
用C语言实现的一个自打印程序如下:[可以看出,该程序通过使用printf函数的特性来实现自打印]
#include <stdio.h> char *format = "#include <stdio.h>%c%cchar *format = %c%s%c;%cvoid main(void)%c{%c%cprintf(format, 10, 34, format, 34, 10, 10, 10, 9, 10, 10);%c}%c"; void main(void) { printf(format, 10, 10, 34, format, 34, 10, 10, 10, 9, 10, 10); }
注意:format字符串中一定不能包含转义字符(像'\n', '\t'等),需要将他们转变为其对应的ASCII的形式。本程序用到的转义字符对应的ASCII如下:
'\n' -- 10 '\"' -- 34 '\t' -- 9
此时,我们可以运行该程序,来验证其有效性:
lxw 20:42:14:~/lxw0109/c++$ ./a.out #include <stdio.h> char *format = "#include <stdio.h>%c%cchar *format = %c%s%c;%cvoid main(void)%c{%c%cprintf(format, 10, 34, format, 34, 10, 10, 10, 9, 10, 10);%c}%c"; void main(void) { printf(format, 10, 34, format, 34, 10, 10, 10, 9, 10, 10); } lxw 20:42:18:~/lxw0109/c++$ cat ownself.c #include <stdio.h> char *format = "#include <stdio.h>%c%cchar *format = %c%s%c;%cvoid main(void)%c{%c%cprintf(format, 10, 34, format, 34, 10, 10, 10, 9, 10, 10);%c}%c"; void main(void) { printf(format, 10, 10, 34, format, 34, 10, 10, 10, 9, 10, 10); } lxw 20:42:22:~/lxw0109/c++$
shell版本:
“----自打印算法很有趣味性,它体现了高超的微观技巧;自打印算法颠覆了‘神创造生命’的神权至上理论。----”
至于最简短的自打印代码(空程序)以及Python实现的一个非常棒的自打印程序,我这里就不介绍了,你可以看这里。
参考文章:
百度百科“自打印算法”:http://baike.baidu.com/link?url=zaWoEXiOkp6F0u9hFwbKyp_a4zc6vJhItm0BGSn2IUKGag8KK5SheCu3iirioVM8