程序可以输出自身的副本吗
-
18-09-2019 - |
题
我认为这可能是一个经典问题,但我不知道答案。程序可以输出自身的副本吗?如果可以,是否有一个短程序可以做到这一点?
我不接受“空程序”作为答案,并且我不接受可以访问自己的源代码的程序。相反,我在想这样的事情:
int main(int argc, char** argv){ printf("int main(argc, char** argv){ printf...
但我不知道如何继续...
解决方案
是的。一方案,可以使的副本本身就是所谓的"因".
基本的想法的最quines是:
你写的代码需要一字符串
s
和印刷品,同时更换次出现(或 的 发生)的特殊字符串 foo 在s
由的价值s
本身。你把整的源代码的节目到目前为止,使用它作为的定义
s
.但是你 排除的定义s
从字符串, ,而不是取代它 foo.
这是一般性的想法。其余的是串格式的详细信息,真的。
其他提示
此被称为奎因:
一个喹是一种计算机程序,其不采取任何输入,并产生它自己的源代码的副本作为其唯一的输出。在可计算性理论和计算机科学文献这些程序中的标准条款是自我复制程序,自我复制程序,和自我复制的程序。
一个quine指的执行环境的一个固定点,当执行环境被视为一个函数。基内斯在任何图灵完备的编程语言是可能的,如克林的递归定理的一个直接后果。用于娱乐,程序员有时尝试开发最短的喹在任何给定的编程语言。
来源:维基百科
是。下面是做它,我20年前写了一个C程序。
如果你写了奎因,要小心的是,副本不写也无限自我复制,并最终接管世界。
在由乔恩斯基特发明了语言下面的操作打印 “你好,世界!\ n”。
h
我可以让这个语言的修改,使下面的程序打印“Hello,世界\ n!”
Hello, world!
所以这是一个打印本身该程序。
呵呵,你觉得有什么奇怪的是,虽然它具有精确和正确的数学定义是什么?那是你的问题。 “我不会接受。”哈哈!数学不接受,她是我所服务的情妇,所以我发布这个答案。
我假设你允许解释型语言。 (在一定程度上,所有的语言解释。)有人写解释,如果你正在写它,你可以给它添加任何你喜欢的内置功能,如(lispy)函数(foo)
什么也不做,除了打印“ (foo)
”。
或者可以添加一个更复杂的宏型功能(printMeAndMyArgs ...)
。
因此,关键是如何定义的问题。
迈克尔·西蓬瑟的“介绍计算理论”解释了章如何构建一个奎因之一。我最近写基于这种想法Java程序,并张贴在:的 http://bornagainprogrammer.net/2009/11/07/hello-world-from-the-tm-self/
我建议你这本书的保持和尝试推行自己的计划在您喜欢的语言。还有很多其他有趣的定理在这本书。
-kiran
// save it as file.cpp
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
system("cat file.cpp");
return 0;
}
它是可能的,但有某些限制。
我已经写了一个简单的代码在java其印刷品本身。你可以使用文字C/C++使用相同的程序。你可以添加任何你想要的内部程序,它将打印本身完全。
条件
Java文件不应该是内部的任何包裹
文件夹结构不应包含任何文件夹与空间在它的名字
汇编的目标应该是默认或同一文件夹中java文件所
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); } } }