在微博上看到一个题目《让一个程序输出程序本体》,发现很早就有对这个算法的研究,叫做自打印算法,自打印算法就是指在程序运行中,不读取任何额外的信息,仅使用程序代码中携带的功能和信息,将程序代码本身打印输出,读取程序源文件应该能实现。。。
后来发现一个标准的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
自打印算法很有趣味性,它体现了高超的微观技巧,它在数学高度上演示了如何构造一个可以自复制、自我表达的系统。事实上,自打印程序中的描述文本,正对应了细胞生物的染色体,自打印算法,可以看作是细胞生命的一个数学抽象。
蛮有趣的。
这个倒真的饿不知道啊