自打印算法

在微博上看到一个题目《让一个程序输出程序本体》,发现很早就有对这个算法的研究,叫做自打印算法,自打印算法就是指在程序运行中,不读取任何额外的信息,仅使用程序代码中携带的功能和信息,将程序代码本身打印输出,读取程序源文件应该能实现。。。

后来发现一个标准的C语言版的自打印程序: (代码来自水木清华)

main(){char s[]="main(){char s[]=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);}

这段程序巧妙的利用了printf的格式化解析,真够厉害的。。

当年在《程序员》的自打印程序比赛中,力拔头筹的施凡提供了若干种语言版本,其中的Python版本当之无愧的称为那次比赛的最佳作品:

print (lambda s:s.replace(chr(042),chr(047))%s)(‘print (lambda s:s.replace(chr(042), chr(047))%%s)("%s")’)

这段代码紧凑精巧,充分体现了自打印算法的精妙之处。对lambda的运用也恰到好处。传说Python的作者Guido van Rossum准备取消lambda,如果他有机会读到施凡先生的这段代码,不知是否会改变主意。。

附上世界上最短的自打印程序的作者是smr,该程序荣获1994 Obfuscated C Code contest的Worst Abuse of the Rules奖项。

代码是:

没错,它就是个空程序—。—,但是在当时一些编译器上能够生成一个可执行程序,或直接在Unix系统下make的时候给它加上权限,运行的时候就是“啥都不打印”,正好起到了打印本身程序的作用,而且还是个回文程序。。

这是裁判的评论: http://www.ioccc.org/1994/smr.hint

自打印算法很有趣味性,它体现了高超的微观技巧,它在数学高度上演示了如何构造一个可以自复制、自我表达的系统。事实上,自打印程序中的描述文本,正对应了细胞生物的染色体,自打印算法,可以看作是细胞生命的一个数学抽象。

无觅相关文章插件,快速提升流量

,

有 2 条《自打印算法》的回复

  1. 边坡防护网 | #2

    这个倒真的饿不知道啊

发表评论