换言之,假设把编译-运行-输出作为一个算子F,代码作为自变量s的话,Self Print 就是要寻找s,使得 F(s)=s
下面的程序要实现的是另外一种形式的Self Print,F(F(F(F(s))))=s
#include <cstdio>
int main()
{
int Type=0;
char *s1="#include <cstdio>/nint main()/n{/n/tint Type=1;/n/tchar *s1=%c%s%c;/n/tchar *s2=%c%s%c;/n/tchar *s3=%c%s%c;/n/tchar *s4=%c%s%c;/n/tchar *s[]={s1,s2,s3,s4};/n/tprintf(s[Type],34,s1,34,34,s2,34,34,s3,34,34,s4,34);/n}";
char *s2="#include <cstdio>/nint main()/n{/n/tint Type=2;/n/tchar *s1=%c%s%c;/n/tchar *s2=%c%s%c;/n/tchar *s3=%c%s%c;/n/tchar *s4=%c%s%c;/n/tchar *s[]={s1,s2,s3,s4};/n/tprintf(s[Type],34,s1,34,34,s2,34,34,s3,34,34,s4,34);/n}";
char *s3="#include <cstdio>/nint main()/n{/n/tint Type=3;/n/tchar *s1=%c%s%c;/n/tchar *s2=%c%s%c;/n/tchar *s3=%c%s%c;/n/tchar *s4=%c%s%c;/n/tchar *s[]={s1,s2,s3,s4};/n/tprintf(s[Type],34,s1,34,34,s2,34,34,s3,34,34,s4,34);/n}";
char *s4="#include <cstdio>/nint main()/n{/n/tint Type=4;/n/tchar *s1=%c%s%c;/n/tchar *s2=%c%s%c;/n/tchar *s3=%c%s%c;/n/tchar *s4=%c%s%c;/n/tchar *s[]={s1,s2,s3,s4};/n/tprintf(s[Type],34,s1,34,34,s2,34,34,s3,34,34,s4,34);/n}";
char *s[]={s1,s2,s3,s4};
printf(s[Type],34,s1,34,34,s2,34,34,s3,34,34,s4,34);
}
发挥你的想象,看看你能实现出多少更pp,更有趣的Self Print程序呢?