Quine (自己複製プログラムとも呼ばれます) という用語に出会いました。それについてもっと知りたかっただけです。クワインはどのように書くのですか? どこでも使われているのでしょうか? それともただの楽しみのためのエクササイズなのでしょうか?
私は Python から始めましたが、Python で何か書いてみようと思うかもしれません。助言がありますか?
最低限、クインは出力として独自のソースを生成するプログラムです。これらは、不完全性に関するゲーデルの証明を構築する上で必要なステップです。
これが実用化されるかどうかについては、私はコメントしません。
quine は、独自のソース コードのコピーを唯一の出力として生成するコンピューター プログラムです。
私はまだ実用的な用途を見たことがありませんが、どこかにあると確信しています。
print (lambda s:s+`s`+')')("print (lambda s:s+`s`+')')(")
#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. */
}
他の人が説明したように、クワインは自分自身の正確なコピーを複製するプログラムです。
アプリケーションに関しては、DNAがそれ自体を解釈し、それ自体を複製するロジックをエンコードしていると考える場合、答えは非常に簡単です。クワインの概念がなければ、ここには存在せず、人工的な(自己複製)を作成することはできません。 ) 生活。
これは私のお気に入りの C の例です
char*p="char*p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}
そこから学んだことは次の 2 つです。
クインを 1 つか 2 つ書くことで私の考えが広がり、より優れたプログラマーになったと言うデータを示すことはできません。でも、少なくとも最初の数回は、やっていて楽しいです。とにかく、あなたはそれを書く方法について尋ねました。よく書かれた参考文献をいくつか紹介します。
Craig Kaplan は、実際にクインを生産する方法を説明したきちんとした論文を持っています。
また、David Madore の「Quines (自己複製プログラム)」も興味深い読み物です。
最後に、実装を見たい場合は、さまざまな言語のクワインやその他の関連事項を見つけることができるクワインのページをチェックしてください。
これは 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 はまったく役に立たない.
私は 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);
これは C++ の興味深いクワインです: http://npcomplete.weebly.com/1/post/2010/02/self-reproducing-c-program-quine.html
クインは楽しみのためです。私の知る限り、それらは実用的ではありません。