我认为这可能是一个经典问题,但我不知道答案。程序可以输出自身的副本吗?如果可以,是否有一个短程序可以做到这一点?
我不接受“空程序”作为答案,并且我不接受可以访问自己的源代码的程序。相反,我在想这样的事情:
int main(int argc, char** argv){ printf("int main(argc, char** argv){ printf...
但我不知道如何继续...
是的。可以复制自身的程序称为“quine”。
大多数奎因的基本思想是:
您编写的代码接受字符串文字
s
并打印它,同时用 s
本身的值替换 s
中特殊子字符串 foo的出现(或
the出现)。
您获取了到目前为止程序的整个源代码,并将其用作
s
的定义。但您从字符串中排除了s
的定义,而是用foo替换它。这就是总体思路。剩下的就是字符串格式化细节,真的。
这被称为奎因:
quine 是一种计算机程序,它不接受任何输入,并生成自己的源代码的副本作为其唯一的输出。可计算性理论和计算机科学文献中这些程序的标准术语是自复制程序、自复制程序和自复制程序。
当执行环境被视为一个函数时,quine 是执行环境的一个不动点。作为克莱恩递归定理的直接结果,奎因在任何图灵完备的编程语言中都是可能的。为了娱乐,程序员有时会尝试用任何给定的编程语言开发尽可能短的 quine。
来源:维基百科
是的。这是我大约 20 年前编写的一个 C 程序,它可以实现这一点。
如果你写一个奎因,请注意副本不会无限地写出自己的副本并最终接管世界。
在 Jon Skeet 发明的语言中,以下运算符打印“Hello, world! ”.
h
我可以对这种语言进行修改,以便以下程序打印“Hello, world! ”:
Hello, world!
这就是打印自身的程序。
哦,虽然它有精确正确的数学定义,但你觉得有些奇怪吗?那是你的问题。 “我不接受……”哈!数学确实接受,而且她是我侍奉的情妇,所以我发布这个答案。
(foo)
,除了打印“
(foo)
”。或者你可以添加更复杂的宏类型函数
(printMeAndMyArgs ...)
。所以关键在于如何定义问题。
// save it as file.cpp
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
system("cat file.cpp");
return 0;
}
file = open("temp1.py", "r")
try:
temp_python = open("temp1.py", "w")
except FileNotFoundError:
temp_python = open("temp1.py", "w")
for i in file:
temp_python.writelines(i)
// note this is python code
// name the file as temp1.py
我用java编写了一个简单的代码,它可以自行打印。 您可以使用 C/C++ 的文字来使用相同的程序。您可以在该程序中添加任何您想要的内容,它会完全打印出来。
条件
import java.io.FileInputStream;
import java.net.URL;
public class PrintYourself {
public static void main(String[] args) {
// TODO Auto-generated method stub
URL location = PrintYourself.class.getProtectionDomain().getCodeSource().getLocation();
String path=location.getFile();
path=path.replace("/bin", "/src");
System.out.println(path);
try{
FileInputStream st=new FileInputStream(path+"PrintYourself.java");
int i=0;
while((i=st.read())!=-1){
System.out.print((char)i);
}
st.close();
}
catch(Exception e){
System.out.println(e);
}
}
}