18

Quine (自己複製プログラムとも呼ばれます) という用語に出会いました。それについてもっと知りたかっただけです。クワインはどのように書くのですか? どこでも使われているのでしょうか? それともただの楽しみのためのエクササイズなのでしょうか?

私は Python から始めましたが、Python で何か書いてみようと思うかもしれません。助言がありますか?

4

10 に答える 10

19

最低限、クインは出力として独自のソースを生成するプログラムです。これらは、不完全性に関するゲーデルの証明を構築する上で必要なステップです。

これが実用化されるかどうかについては、私はコメントしません。

于 2009-07-10T20:51:15.157 に答える
11

quine は、独自のソース コードのコピーを唯一の出力として生成するコンピューター プログラムです。

私はまだ実用的な用途を見たことがありませんが、どこかにあると確信しています。


Python の例 (ここにあります)

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

Cの例(ここにあります

#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. */
}
于 2009-07-10T20:41:31.697 に答える
9

他の人が説明したように、クワインは自分自身の正確なコピーを複製するプログラムです。

アプリケーションに関しては、DNAがそれ自体を解釈し、それ自体を複製するロジックをエンコードしていると考える場合、答えは非常に簡単です。クワインの概念がなければ、ここには存在せず、人工的な(自己複製)を作成することはできません。 ) 生活。

于 2009-11-19T17:08:58.790 に答える
6

これは私のお気に入りの C の例です

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

そこから学んだことは次の 2 つです。

  1. 空白は必須ではありませんが、読みやすくなります
  2. prinftf 関数は本当に強力です
于 2009-10-01T19:57:07.743 に答える
4

クインを 1 つか 2 つ書くことで私の考えが広がり、より優れたプログラマーになったと言うデータを示すことはできません。でも、少なくとも最初の数回は、やっていて楽しいですとにかく、あなたはそれを書く方法について尋ねました。よく書かれた参考文献をいくつか紹介します。

Craig Kaplan は、実際にクインを生産する方法を説明したきちんとした論文を持っています。

  • 自己文書化コードの検索
    • このレポートでは、自己文書化プログラム (実行すると、それ自体が出力として生成されるプログラム) を作成する際の問題を調べます。この問題は、自己参照 (自己文書化プログラムが示さなければならない特性) の観点から検討されます。レポートは、正しく動作しない初期のプログラムから、ソリューションに近づく洗練されたプログラムを次々と経て、自己文書化プログラムの動作に進みます。次に、少し戻って、いくつかのプログラムがごまかしているように見えても、自己文書化プログラムの定義に適合しているように見えることを示し、その定義の改善を提案します。各ステップで、レポートは、指定されたプログラムがコンピューター プログラミングと自己参照の間の微妙な関係をどのように示しているかを説明します。

また、David Madore の「Quines (自己複製プログラム)」も興味深い読み物です。

最後に、実装を見たい場合は、さまざまな言語のクワインやその他の関連事項を見つけることができるクワインのページをチェックしてください。

于 2009-07-11T00:27:44.147 に答える
1

これは Python のものです (これは醜いです。試しに書いただけです)。当時はこれがクインと呼ばれていたことさえ知りませんでした。

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+'###)'""")

ああ、あなたの他の質問に答えるために: Quines はまったく役に立たない.

于 2009-07-10T20:42:09.013 に答える
1

私は 1979 年に最初の Quine を Fortran で書きました。先日、PHP の Quines についてランダムに考えて、OP と同じ Q を投稿したい気がしましたが、良い子なので、最初に Q&A D/B を確認しました。とにかく、後世のためにここに私のPHP(cli)クワインがあります。より短いバリアントに興味があります。:-)

<?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);
于 2012-06-20T21:45:10.347 に答える
0

これは C++ の興味深いクワインです: http://npcomplete.weebly.com/1/post/2010/02/self-reproducing-c-program-quine.html

クインは楽しみのためです。私の知る限り、それらは実用的ではありません。

于 2010-03-13T00:10:09.167 に答える