输出源代码本身的源代码

最后更新于:2023年2月24日 下午

我们可以把计算机看成一个函数,将一份代码映成一段输出,那么输出为代码本事就是数学中不动点。

任意语言都有很多相应版本的这种程序,原理都是类似的,目前有 cpp 和 python 的版本

代码原理和步骤

  1. 先把头写好,定义好数组,记作头部
  2. 开始对数组赋值一直赋值到头部,然后空几行
  3. 把头用数组打印出来,再讲数组全部打印出来,再将后面的部分打印出来
  4. 再去空的几行,做数组赋值,赋值的时候后面的每一行

注意代码中特殊字符需要转义,不然就很尬了,而且代码不能用 tab 缩进

文件打印就太没水平了,这里就不给出了

cpp 版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<string>
using namespace std;
string a[10];
int main(){
a[0]="#include<iostream>";
a[1]="#include<string>";
a[2]="using namespace std;";
a[3]="string a[10];";
a[4]="int main(){";
a[5]="for(int i=0;i<5;++i) cout<<a[i]<<endl;";
a[6]="for(int i=0;i<10;++i) cout<<char(97)<<char(91)<<i<<char(93)<<char(61)<<char(34)<<a[i]<<char(34)<<char(59)<<endl;";
a[7]="for(int i=5;i<10;++i) cout<<a[i]<<endl;";
a[8]="return 0;";
a[9]="}";
for(int i=0;i<5;++i) cout<<a[i]<<endl;
for(int i=0;i<10;++i) cout<<char(97)<<char(91)<<i<<char(93)<<char(61)<<char(34)<<a[i]<<char(34)<<char(59)<<endl;
for(int i=5;i<10;++i) cout<<a[i]<<endl;
return 0;
}

python 版本

1
2
3
import sys
with open(sys.argv[0]) as f:
print(f.read(), end ='')

但是利用传入参数读文件属实耍赖,所以在写一个不用读文件的版本:

1
2
3
4
5
6
7
8
9
10
11
12
a = list(range(6))
a[0] = 'a = list(range(6))'
a[1] = 'print(a[0])'
a[2] = 'for i in range(6):'
a[3] = ' print("a["+str(i)+"] = "+chr(39)+a[i]+chr(39))'
a[4] = 'for i in range(1,5): print(a[i])'
a[5] = 'print(a[5], end = "")'
print(a[0])
for i in range(6):
print("a["+str(i)+"] = "+chr(39)+a[i]+chr(39))
for i in range(1,5): print(a[i])
print(a[5], end = "")

最后一行是因为 Python 默认以 print 回车结尾 我无法用 tab 缩进,只能用空格缩进,这是唯一不完美的地方