25

これは古典的な質問かもしれないと思いますが、私は答えを知りません。プログラムはそれ自体のコピーを出力できますか?もしそうなら、これを行う短いプログラムはありますか?

私は「空のプログラム」を答えとして受け入れません。また、独自のソースコードにアクセスできるプログラムも受け入れません。むしろ、私はこのようなことを考えています:

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

しかし、私は続行する方法がわかりません...

4

11 に答える 11

38

それはクワインと呼ばれ、それらを収集するサイトがあります。

于 2009-09-25T20:47:15.217 に答える
19

はい。自分自身のコピーを作成できるプログラムは「クワイン」と呼ばれます。

ほとんどのクワインの基本的な考え方は次のとおりです。

  1. 文字列リテラルを取得して出力するコードを記述し、特別な部分文字列fooオカレンス(またはオカレンス)をそれ自体の値に置き換えsます。ss

  2. これまでのプログラムのソースコード全体を取得し、それをの定義として使用しsます。ただし、文字列からの定義を除外し 、代わりにfooに置き換えます。s

それが一般的な考え方です。残りは、実際には文字列フォーマットの詳細です。

于 2009-09-25T21:50:32.500 に答える
6

これはクワインと呼ばれます:

クインは、入力を受け取らず、唯一の出力として独自のソースコードのコピーを生成するコンピュータプログラムです。計算可能性理論およびコンピュータサイエンスの文献におけるこれらのプログラムの標準的な用語は、自己複製プログラム、自己複製プログラム、および自己コピープログラムです。

クインは、実行環境を関数と見なした場合の実行環境の固定点です。クワインは、クリーネの再帰定理の直接の結果として、チューリング完全プログラミング言語で可能です。娯楽のために、プログラマーは、与えられたプログラミング言語で可能な限り短いクワインを開発しようとすることがあります。

出典:ウィキペディア

于 2009-09-25T20:46:30.657 に答える
4

これは確かに古典的な質問です!

特定のクインの存在を超えて、計算可能性理論の重要な結果は、計算したい関数に対して「独自のプログラムテキストを知っている」プログラムが存在することです。つまり、必要に応じてそれ自体を印刷できます。この定理は、クリーネの2番目の再帰定理と呼ばれます。

于 2009-09-25T21:14:49.897 に答える
3

はい。これは、私が約 20 年前に書いた C プログラムです。

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

于 2010-11-23T18:18:31.320 に答える
1

Jon Skeetによって発明された言語では、次の演算子は「Hello、world!\n」を出力します。

h

この言語を変更して、次のプログラムが「Hello、world!\n」を出力するようにすることができます。

Hello, world!

これが、それ自体を印刷するプログラムです。

ああ、それは正確で正しい数学的定義を持っていますが、あなたはそれについて何か奇妙なことを感じますか?それはあなたの問題だ。「私は受け入れません...」ハ!数学は受け入れます、そして彼女は私が仕える愛人なので、私はこの答えを投稿します。

于 2009-09-25T21:09:10.913 に答える
1

通訳言語を許可していると思います。(あるレベルでは、すべての言語が解釈されます。)誰かがインタープリターを作成します。インタープリターを作成している場合は、print " "(foo)以外は何もしない(lispy)関数など、任意の組み込み関数を追加できます。 (foo)

または、より複雑なマクロタイプの関数を追加することもできます(printMeAndMyArgs ...)

したがって、秘訣は問題をどのように定義するかにあります。

于 2009-09-25T21:16:15.560 に答える
1

クワインを作成する場合は、コピーが無限に自分自身のコピーを作成して、世界を乗っ取ってしまうことがないように注意してください。

于 2009-09-25T21:04:43.700 に答える
0

MichaelSipserの「IntroductiontotheTheory of Computation」では、1つの章でクワインの作り方を説明しています。私は最近、そのアイデアに基づいてJavaプログラムを作成し、次の場所に投稿しました:http: //bornagainprogrammer.net/2009/11/07/hello-world-from-the-tm-self/

その本を手に入れて、自分の好きな言語でプログラムを実装してみることをお勧めします。その本には他にもたくさんの楽しい定理があります。

-キラン

于 2009-11-08T17:04:01.987 に答える
0
// save it as file.cpp

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    system("cat file.cpp"); 
    return 0;
}
于 2012-08-09T14:27:55.007 に答える
-1

Java では可能ですが、いくつかの制約があります。

自分自身を印刷する簡単なコードを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);
            }
    
        }
    }
    
于 2016-03-11T07:23:15.407 に答える