クワインはプログラムの実際のコード、つまり難読化されていないものを出力しますか、それとも難読化されたプログラムを出力しますか?
6 に答える
難読化はそれとは何の関係もないと思います。通常、Quine はプログラム自体の実際のソース コードを出力します。
ソースの「難読化」またはその他の方法で表面的に変更されたバージョンを出力する C プログラムがあるとします。たとえば、空白または変数名に違いがあるとします。
その場合、そのプログラムはクワインではありません。定義上、クワインはそれ自体を出力するプログラムであり、「それ自体」とはまったく同じバイトシーケンスを意味するからです。しかし、そのプログラムの出力は、一度コンパイルされると、元のプログラムと同じものを出力します (これは単なる表面的な変形であるため)、つまりそれ自体です。したがって、出力は quine です。
これにより、クワインを作成するプロセスが簡単になる場合があります。書式設定が正しくない可能性がある「ほぼクワイン」を作成し、一度実行すると、実際のクワインが出力されます。
これはすべてCの quine を想定しています。x86 マシン コードの quineは、その C ソースではなく、.exe ファイルを構成する同じバイト シーケンスを出力する必要があります。
「難読化されたコード」ではなく「実際のコード」が何を意味するのかわかりませんが、何かがクインであるかどうかをテストするには、クインであると想定される言語を決定する必要があります。おそらくそれを決定することによってあなたはあなた自身の質問に答えることができます.Cのクインが欲しいだけですか、それともあなたの難読化ツールと関係があるクインが欲しいですか?
Wikipediaにある標準 C の実際のクワインを次に示します。
main() { char *s="main() { char *s=%c%s%c; printf(s,34,s,34); }"; printf(s,34,s,34); }
その構造は比較的単純であることがわかります。プログラムのテキストを含む文字列定数を、フォーマット文字列と によってフォーマットされる値の 1 つとして使用しますprintf()
。
コンパイルして実行すると、その 1 行のコードが正確に出力されます。
ウィキの記事には、C 言語を含むさまざまな言語の quines の例があります。
#include <stdio.h>
main(){
FILE* fp = fopen("printItself.c", "r");
int c;
while ((c = getc(fp)) != EOF) putc(c, stdout);
}
printItself.c という名前のファイルに保存します...前の例の問題は、プログラムに行を追加すると、たとえば int x; になることです。改行やスペースなどを処理しながら、文字列にも追加する必要があります...しかし、この例では、好きなものを追加できます。