通常、クワインプログラムに関するインタビューの質問の主な目的は、以前にそれらに出くわしたことがあるかどうかを確認することです. それらは、他の意味ではほとんど役に立ちません。
上記のコードは、次のように (GCC に従って) C99 準拠のプログラムを作成するために適度にアップグレードできます。
コンパイル
/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes \
-Wstrict-prototypes -Wold-style-definition quine.c -o quine
コード
#include <stdio.h>
char*s="#include <stdio.h>%cchar*s=%c%s%c;%cint main(void){printf(s,10,34,s,34,10,10);}%c";
int main(void){printf(s,10,34,s,34,10,10);}
"
これは、コード ポイント 34 で改行がコード ポイント 10であるコード セットを想定していることに注意してください。このバージョンでは、オリジナルとは異なり、最後に改行が出力されます。必要なも含まれて#include <stdio.h>
おり、行は水平スクロール バーなしで SO で作業するのに十分なほど短いです。もう少し努力すれば、間違いなく十分に短くすることができます.
テスト
クワインプログラムの酸性テストは次のとおりです。
./quine | diff quine.c -
ソースコードと出力に違いがある場合は、報告されます。
「クインのような」テクニックのほぼ有用なアプリケーション
若い頃、バイリンガルの「自己再生」プログラムを作成しました。これは、シェル スクリプトと Informix-4GL (I4GL) ソース コードの組み合わせでした。これを可能にした 1 つの特性は、I4GL が{ ... }
コメントとして扱うことですが、シェルはそれを I/O リダイレクションの単位として扱います。シェルと同様に、 I4GL にも#...EOL
コメントがあります。ファイルの先頭にあるシェル スクリプトには、ポインターをサポートしない言語で検証操作の複雑なシーケンスを再生成するためのデータと操作が含まれていました。このデータは、どの I4GL 関数を生成したか、および各関数がどのように生成されたかを制御します。次に、I4GL コードをコンパイルして、外部データ ソースからインポートされたデータを毎週検証しました。
ファイルfile0.4gl
をシェル スクリプトとして実行し (それを と呼びます)、出力をキャプチャし (それを と呼びますfile1.4gl
)、次にfile1.4gl
シェル スクリプトとして実行し、出力を でキャプチャしたfile2.4gl
場合、2 つのファイルfile1.4gl
とfile2.4gl
は同一になります。ただし、file0.4gl
生成された I4GL コードがすべて欠落している可能性があり、ファイルの先頭にあるシェル スクリプトの「コメント」が破損していない限り、自己複製ファイルが再生成されます。