自打印算法

自打印问题描述:

  自打印是指在程序中不读取任何额外的信息,仅使用程序代码中携带的功能和信息,将程序代码本身打印输出。

 

在阅读下面的部分之前, 我强烈的建议你自己先想一下这个问题,然后试着去实现一下。

 

自打印算法原理:

  一个完整的自打印程序通常至少包括两部分:“描述部分”和“执行部分”。在“描述部分”,用字符串变量来存储“执行部分”的代码。而“执行部分”的代码则打印这个字符串变量。

实现:

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

“自打印算法”:http://vicdory.com/self-replicating-algorithm.html

posted @ 2014-02-26 22:23  XiaoweiLiu  阅读(1127)  评论(0编辑  收藏  举报