我认为这可能是一个经典问题,但我不知道答案。程序可以输出自身的副本吗?如果可以,是否有一个短程序可以做到这一点?

我不接受“空程序”作为答案,并且我不接受可以访问自己的源代码的程序。相反,我在想这样的事情:

int main(int argc, char** argv){ printf("int main(argc, char** argv){ printf...

但我不知道如何继续...

有帮助吗?

解决方案

是的。一方案,可以使的副本本身就是所谓的"因".

基本的想法的最quines是:

  1. 你写的代码需要一字符串 s 和印刷品,同时更换次出现(或 发生)的特殊字符串 foos 由的价值 s 本身。

  2. 你把整的源代码的节目到目前为止,使用它作为的定义 s.但是你 排除的定义 s 从字符串, ,而不是取代它 foo.

这是一般性的想法。其余的是串格式的详细信息,真的。

其他提示

它被称为一个 奎因, ,并且有一个网站 收集它们的.

此被称为奎因

  

一个喹是一种计算机程序,其不采取任何输入,并产生它自己的源代码的副本作为其唯一的输出。在可计算性理论和计算机科学文献这些程序中的标准条款是自我复制程序,自我复制程序,和自我复制的程序。

     

一个quine指的执行环境的一个固定点,当执行环境被视为一个函数。基内斯在任何图灵完备的编程语言是可能的,如克林的递归定理的一个直接后果。用于娱乐,程序员有时尝试开发最短的喹在任何给定的编程语言。

来源:维基百科

这的确是一个经典的问题!

除了特定基内斯的存在,在可计算性理论的一个重要结果是对于的任何的你可能要计算的功能,存在一个程序,“知道自己的方案文本”,即如果需要,可以打印本身。该定理被称为克林的第二递归定理

是。下面是做它,我20年前写了一个C程序。

http://womencht.reocities.com/Athens/8994/repeat.html

如果你写了奎因,要小心的是,副本不写也无限自我复制,并最终接管世界。

我假设你允许解释型语言。 (在一定程度上,所有的语言解释。)有人写解释,如果你正在写它,你可以给它添加任何你喜欢的内置功能,如(lispy)函数(foo)什么也不做,除了打印“ (foo)”。

或者可以添加一个更复杂的宏型功能(printMeAndMyArgs ...)

因此,关键是如何定义的问题。

// save it as file.cpp

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    system("cat file.cpp"); 
    return 0;
}

它是可能的,但有某些限制。

我已经写了一个简单的代码在java其印刷品本身。你可以使用文字C/C++使用相同的程序。你可以添加任何你想要的内部程序,它将打印本身完全。

条件

  1. Java文件不应该是内部的任何包裹

  2. 文件夹结构不应包含任何文件夹与空间在它的名字

  3. 汇编的目标应该是默认或同一文件夹中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);
            }
    
        }
    }
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top