什么是quines?拥有它们的任何特定目的?

时间:2009-07-10 20:39:53

标签: python quine

我遇到了这个词 - 奎因(也称为自我复制节目)。只是想了解更多信息。如何写一个quine并且他们在任何地方使用它们或者它们只是一个有趣的运动?

我从Python开始,我可能会尝试用Python编写一个。有什么建议吗?

10 个答案:

答案 0 :(得分:28)

Quines在实际意义上毫无用处,但它们是一项很好的练习,可以帮助您更多地了解某种语言。

这是python中非常简洁的一个:

a='a=%r;print a%%a';print a%a

答案 1 :(得分:19)

quines至少是生成自己的源作为输出的程序。它们是构建Gödel's proof on incompleteness的必要步骤。

这是否构成实际用途是我不提供评论的内容。

答案 2 :(得分:10)

  

quine是一个计算机程序,它将自己的源代码副本作为唯一的输出。

我还没有看到一个实际用途,但我确定那里有一个。


Python示例(found here

print (lambda s:s+`s`+')')("print (lambda s:s+`s`+')')(")

C示例(found here

#include <stdio.h>

int main(int argc, char** argv)
{
/* This macro B will expand to its argument, followed by a printf
 command that prints the macro invocation as a literal string */
#define B(x) x; printf("  B(" #x ")\n");

/* This macro A will expand to a printf command that prints the
 macro invocation, followed by the macro argument itself. */
#define A(x) printf("  A(" #x ")\n"); x;

/* Now we call B on the text of the program
 up to this point. It will execute the command, and then cause
 itself to be printed. */
  B(printf("#include <stdio.h>\n\nint main(int argc, char** argv)\n{\n/*
    This macro B will expand to its argument, followed by a printf\n
    command that prints the macro invocation as a literal string
    */\n#define B(x) x; printf(\"  B(\" #x \")\\n\");\n\n/* This macro
    A will expand to a printf command that prints the\n
    macro invocation, followed by the macro argument itself. */\n#define A(x)
    printf(\"  A(\" #x \")\\n\"); x;\n\n/* Now we call B on the text
    of the program\n up to this point. It will execute the command,
    and then cause\n itself to be printed. */\n"))
  A(printf("/* Lastly, we call A on a command to print the remainder
    of the program;\n it will cause itself to be printed, and then
    execute the command. */\n}\n"))
/* Lastly, we call A on a command to print the remainder of the program;
 it will cause itself to be printed, and then execute the command. */
}

答案 3 :(得分:8)

正如其他人所解释的那样,quines是可以复制自己的精确副本的程序。

关于应用程序,如果你认为DNA编码逻辑来解释自身并自我复制 - 答案非常简单,没有quines的概念我们不会在这里,我们将永远无法创造人工(生活自我。

答案 4 :(得分:5)

这是我最喜欢的C示例

char*p="char*p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}

我从中学到了两件事:

  1. 不需要空格但有助于提高可读性
  2. prinftf功能非常强大

答案 5 :(得分:3)

我无法提供任何数据,说写一两句话已经扩大了我的思想或使我成为一个更好的程序员。但 很有趣,至少在前几次。无论如何,你问过如何写一个。我可以向您指出一些写得很好的参考文献:

Craig Kaplan有一篇很好的论文,描述了如何实际生产葡萄酒:

  • The Search For Self-Documenting Code
    • 本报告研究了编写自我记录程序的问题:一个程序,在运行时,将自身产生为输出。从自我引用的角度来考察问题,自我记录程序必须展示的属性。该报告从无法正常工作的早期计划开始,通过先后的解决方案的复杂程序,到工作自我记录程序。然后它退后一步,显示一些程序似乎作弊并仍然适合自我记录程序的定义,建议改进该定义。在每一步中,报告都阐述了给定程序如何展示计算机编程与自我引用之间的微妙关系。

您可能还会发现David Madore的"Quines (self-replicating programs)"有趣读物。

最后,如果您想查看实施,请查看Quine Page,其中您可以找到各种语言的quines和其他相关问题。

答案 6 :(得分:2)

Quines用于什么?编程练习和病毒。

病毒需要以某种方式复制 - 一种方法是使它成为一个quine。假设一个假设的反病毒程序会标记任何将其自己的二进制文件读入内存的过程(将其传递给预期的受害者);解决问题的方法就是让它自己输出。

请记住,机器码中的quine不需要编译。

答案 7 :(得分:1)

这是Python中的一个(它很难看;我只是编写它来试试)。甚至不知道当时这被称为quine。

def e(s): print s[:42]+s[42:].replace('#','"'); print 'e("""'+s+'""")'
e("""def e(s): print s[:42]+s[42:].replace('#','"'); print 'e(###'+s+'###)'""")

哦,回答你的另一个问题:奎因完全没用。

答案 8 :(得分:1)

我在1979年写了我的第一个奎因 - 在Fortran。我前几天随便想了一下PHP中的Quines,感觉就像发布了与OP相同的Q但是我是第一个检查Q&amp; A D / B的好男孩。无论如何,这里的后代是我的PHP(cli)quine。我会对任何较短的变种感兴趣。 : - )

<?php $x='<?php $x=0;echo strtr( $x, array(chr(39).$x.chr(39)));';echo strtr( $x, array(chr(39).$x.chr(39)));

109个字节,但最后一个CR被切断。那不算“骗子”:

<?php readfile( __FILE__);

这个QuineProgram wiki引用的更短:

<?php printf($a='<?php printf($a=%c%s%c,39,$a,39);',39,$a,39);

答案 9 :(得分:0)

这是c ++中有趣的问题:http://npcomplete.weebly.com/1/post/2010/02/self-reproducing-c-program-quine.html

Quines非常有趣。据我所知,它们没有实际用途。