代码之家  ›  专栏  ›  技术社区  ›  ragnarius

程序能输出自身的副本吗

  •  19
  • ragnarius  · 技术社区  · 15 年前

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

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

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

    11 回复  |  直到 12 年前
        1
  •  19
  •   Richard Hulse    5 年前

    对一个可以复制自己的程序被称为“quine”。

    大多数奎因的基本理念是:

    1. s 并在替换引用(或 这个 一个特殊子串的出现次数 在里面 按价值 s 它本身

    2. . 但是你 从字符串 ,而代之以

    这是总的想法。剩下的就是字符串格式的细节,真的。

        2
  •  38
  •   Cat Plus Plus    15 年前

    quine ,还有一个网站 that collects them .

        3
  •  6
  •   Gordon Haim Evgi    11 年前

    这就是所谓的 Quine :

    quine是一种计算机程序,它不接受任何输入,只产生自己的源代码副本作为其唯一输出。在可计算性理论和计算机科学文献中,这些程序的标准术语是自复制程序、自复制程序和自复制程序。

    当执行环境被视为函数时,quine是执行环境的固定点。奎因在任何图灵完全编程语言中都是可能的,这是克莱恩递归定理的直接结果。为了好玩,程序员有时试图用任何给定的编程语言开发尽可能短的quine。

    资料来源:维基百科

        4
  •  4
  •   Martin B    15 年前

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

    超越特定的存在 quines ,可计算性理论的一个重要结果是 函数,存在一个“知道自己的程序文本”的程序,也就是说,如果需要,它可以自己打印。这个定理叫做 Kleene's second recursion theorem .

        6
  •  1
  •   Buggieboy    15 年前

    如果你写奎因,要小心,不要让复制品无限期地复制自己,最终占领世界。

        7
  •  1
  •   Community CDub    7 年前

    language invented by Jon Skeet

    h
    

    Hello, world!
    

    哦,当它有一个精确和正确的数学定义时,你觉得它有些奇怪吗?这是你的问题。”我不会接受……”哈!数学是可以接受的,她是我的情妇,所以我把这个答案贴出来。

        8
  •  1
  •   Mike Dunlavey    15 年前

    我假定您允许使用解释语言(在某种程度上,所有语言都会被解释。)有人编写解释器,如果您正在编写解释器,您可以向其中添加任何您喜欢的内置函数,例如(lispy)函数 (foo) 除了打印,什么都不做” (富) ".

    也可以添加更复杂的宏类型函数 (printMeAndMyArgs ...) .

    所以关键在于如何定义问题。

        9
  •  0
  •   kiran    15 年前

    http://bornagainprogrammer.net/2009/11/07/hello-world-from-the-tm-self/

    我建议你拿着那本书,试着用你最喜欢的语言自己实现这个程序。那本书里还有很多有趣的定理。

    -基兰

        10
  •  0
  •   Amit    12 年前
    // save it as file.cpp
    
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
        system("cat file.cpp"); 
        return 0;
    }
    
        11
  •  -1
  •   Pang Ajmal PraveeN    7 年前

    我用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);
              }
      
          }
      }