コンピュータサイエンスにおけるクワインとは、出力とソースコードが同一のプログラム (メタプログラムの一種) です。挑戦または楽しみとして、プログラマの中には、特定の言語で最短のクワインを書こうとする人もいます。
ソースファイルを開いて表示することは不正行為とみなされますのでご注意ください。より一般的には、データ入力を使用するプログラムは有効なquineとは見なされません。簡単な解決策は、空のソース コードを含むプログラムです。実際、そのようなプログラムを実行しても、ほとんどの言語では出力、つまりプログラムのソース コードは生成されません。
クワインは、複数の言語で同時に有効である場合、多言語であると言われます。このようなクインのさまざまな例は、ページの下部にある外部リンクから入手できます。
クワインの名前は、間接的自己言及を深く研究したアメリカの哲学者で論理学者の WV クワイン (1908 ~ 2000 年) に由来します。とりわけ、彼は逆説的な (そして翻訳が難しい) 表現「’ が前にあると虚偽が生じる」を生み出しました。引用符‘ の前に引用符があると虚偽になります。
例
プログラミング言語
C
#含むchar *i= " \\ #include 」 ,n= ' \n ' ,q= '"' ,*p= "%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c %s%c%c;%s%c" ,*m= "int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n, m,n);}" ;int main ( ) {リターン! printf ( p,i +1 ,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n ) ; }
C++
注: 読みやすくするために改行が追加されています。 「#include より下のすべて」
#含むmain ( ) { int i;char t [ 2 ] ; t [ 0 ] =0x00;char *v,*w;v= ( char * ) malloc ( 10 ) ; w= ( char * ) malloc ( 9 ) ; t [ 1 ] =v [ 0 ] =v [ 9 ] =w [ 0 ] =0x22;v [ 1 ] =v [ 2 ] =v [ 7 ] =v [ 8 ] =w [ 1 ] =w [ 2 ] =0x3C;v [ 3 ] =0x75;w [ 4 ] =v [ 4 ] =0x5B; w [ 5 ] =v [ 5 ] =0x69;v [ 6 ] =w [ 6 ] =0x5D;w [ 3 ] =0x78;w [ 7 ] =0x3B;w [ 8 ] =0x7D;std::文字列u [ 2 ] ,x [ 2 ] ; u [ 0 ] =0x0A;u [ 1 ] =v;x [ 0 ] =t [ 0 ] ;x [ 1 ] =w;for ( i= 0 ;i< 2 ;i++ ) std::コスト< [i ] << "#include 」 < [i ] << "main(){int i;char t(link);t(link)=0x00;char *v,*w;v=(char*)malloc(10);w=(char*) malloc(9); t(リンク)=v(リンク)=v(リンク)=w(リンク)=0x22;v(リンク)=v(リンク)=v(リンク)=v(リンク)=w(リンク)=w(リンク) )=0x3C;v(リンク)=0x75;w(リンク)=v(リンク)=0x5B;w(リンク)=v(リンク)=0x69; v(リンク)=w(リンク)=0x5D;w(リンク)=0x78;w(リンク)=0x3B;w(リンク)=0x7D;std::string u(リンク),x(リンク);u(リンク) )=0x0A;u(リンク)=v;x(リンク)=t(リンク); x(link)=w;for(i=0;i<2;i++){std::cout<< 私] ; }[
C#
注: 読みやすくするために改行が追加されています。
システムを使用して; クワイン名前空間 { クラスプログラム { [ STAスレッド] static void Main ( string [ ] args ) { string s = "システムを使用;{0}名前空間 quine{0}{2}{0}{1}クラス プログラム{0} {1}{2}{0}{1}{1}[STAThread]{0}{1}{1}static void Main(string(link) args){0}{1}{1}{2}{ 0}{1}{1}{1} string s = {4}{6}{4};{0}{1}{1}{1}Console.Write(s, Environment.NewLine, {4}{5}t{4}, {4}{ 2} {4}、{4}{3}{4}、{4}{5}{4}{4}、{4}{5}{5}{4}、s);{0}{1}{ 1}{3}{0}{1}{3}{0}{3}" ; コンソール。 Write ( s, Environment.NewLine , " \t " , "{" , "}" , " \" " , " \\ " , s ) ; } } }
スキーム
( (ラムダ( x ) (リストx (リスト(引用引用) x ) ) ) (引用 (ラムダ( x ) (リストx (リスト(引用引用) x ) ) ) )
共通Lisp
( funcall (ラムダ( x ) ( append x ( list ( list ' quote x ) ) ) ' ( funcall (ラムダ( x ) ( append x ( list ( list ' quote x ) ) ) ) )
OCaml
( fun s -> Printf . printf "%s %S " ss ) "(fun s -> Printf.printf \" %s % S\ " ss ) "

パイソン
a= 'a=%s;print a%%`a`' ;print a%`a`
別の例:
b= ' \\ ' ;g= '"' ;p= ' %' ;s= "b='%s%s';g='%s';p='%s';s=%s% s%s;print s%s(b,b,g,p,g,s,g,p)" ;print s% ( b,b,g,p,g,s,g,p )
最後の 61 文字が前の例と共通している別の例 (複数の代入によってプログラムの長さが短縮されないことを示すためだけ):
b,g,p,s= ' \\ ' , '"' , '%' , "b,g,p,s='%s%s','%s','%s',%s% s%s;print s%s(b,b,g,p,g,s,g,p)" ;print s% ( b,b,g,p,g,s,g,p )
ルビー
<< 2 * 2 , 2を入れます << 2 * 2 , 2を入れます 2
JavaScript
unescape ( q= "unescape(q=%22*%22).replace('*',q)" ) 。置換( '*' ,q )
パール
$_ = q { $_ = q { Q } ;s/Q/ $_ /;print } ;s/Q/ $_ /;print
そしてシェルと Perl の混合:
perl -le '$n=q{perl -le a$n=q{$x};($_=$n)=~s/\141/\47/g;s/\$x/$n/ ;printa};($_=$n)=~s/\141/\47/g;s/\$x/$n/;print'
ベーシック
10 C=": 印刷 CHR(49)+CHR(48)+CHR(32)+CHR(67)+CHR(61)+CHR(34)+C+CHR(34)+C": プリント CHR(49)+CHR(48)+CHR(32)+CHR(67)+CHR(61)+CHR(34)+C+CHR(34)+C
パスカル
const a= 'const a=' ;b= '書き込み開始(a,#39,a,#39#59#98#61#39,b,#39#59#10,b) 終了。 ; begin write ( a, # 39 , a, # 39 # 59 # 98 # 61 # 39 , b, # 39 # 59 # 10 , b ) end 。
ブレインファック
(注: これは連続した 1 行のコードである必要がありますが、読みやすくするために改行が追加されています。)
->+>+++>>+>++>+>++++>>+>++>>>+>+>+>++>+>>>>++++>+> >+ +>+>++++>>++>++>>+>>+>++>++> +>>>>++++>+>>>>++>>++>>>>+>>++>+>++++>>>++>>++++++> >+ >>++>>+>>>>++++>>++++++>>+>+++ >>>++>>++>>+>>++>>+>++++>>>++>>++++++++++++++>>+>>+ +> +>++++>++++++>>>++>>++++>>+>> +>+>>>>+++>>++++++>>>>++>>>>+>+>++>>+++>+>>>>+++>+ >>>>++++>+>>>>++++>>++>++>+>+ +>+>++>++>>>>>>++>+>++++>>>>>+++>>>++>+>+++>+>+>++ >>>>>>++>>>>+>>>>++>+>>>>+++> +>>>+>>++>++++++++++++++++++++>>>>+>+>>>+>>++>+>++ +>>>++>>++++++++>>+>>++>+>> >>++++>>++++++>>>>++>++>>++++>+>+>++>+>++++>>>>>++++ >>>+ >>>>++>++++++>>>++>>++++++++ >>+>>++>>+>>>>++++>>++++>>+>++++>>>>>>++++>+>++++>>+>+ +> >>>+>+>++>>+>>>>+++>>++++>>>+ [[->>+<<]<+]+++++[->++++++++++<]>.[+]>>[<<++++++++[ - >++++++++<]>- .---->-[-<.<+>>]<[+]<+>>>]<<<[-[-[- [>>+<++++++[->++++++<]]>++++ ++++++++<]>++++<]++++++[->++++++++<]>+<<<-[->>>++< < <]>[->>.<<]<<]
本社9+
Q
ボーンシェル(sh)
#!/bin/sh クワイン( ) { echo -e "#!/bin/sh \n $1" エコー「クイン '$1'」 } クワイン クワイン () { echo -e "#!/bin/sh \\ n$1" エコー「クイン\0 47$1 \0 47」 } '

バッチ (MS-DOS)
@エコーオフ
%1 %2
%0 への呼び出し %%
call %0 goto e %%3 echo.%%4
エコー:f
fに移動
:e
echo.%4@エコーオフ
エコー。%4%31 %32
echo.%4call %30 goto e %3%3
echo.%4call %30 goto e %3%33 echo.%3%34
echo.%4echo:f
echo.%4goto f
エコー.%4:e
:f
PHP
$a = 'chr(60).chr(63).chr(10).chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59 ).chr(10)."echo $a;".chr(10).chr(63).chr(62)' ; エコーchr ( 60 ) 。 chr ( 63 ) 。 chr ( 10 ) 。 chr ( 36 ) 。 chr ( 97 ) 。 chr ( 61 ) 。 chr ( 39 ) 。 $a 。 chr ( 39 ) 。 chr ( 59 ) 。 chr ( 10 ) 。 "エコー $a;" 。 chr ( 10 ) 。 chr ( 63 ) 。 chr ( 62 ) ; ?> $a = ' $a=2; echo str_replace(1+1,chr(39).$a.chr(39),$a); ?> ' ; echo str_replace ( 1 +1 , chr ( 39 ) . $a . chr ( 39 ) , $a ) ; ?>
PL1
注: PL/I で書かれたこの短い Quine は、OS PL/I V2.3.0 バージョンのコンパイラーを使用してコンパイルされますが、多数のエラーやエラー警告を回避するために左マージン 1 とCOMPILEオプションが必要です。
%dcl z%z='put edit';proc options(main;q=''''put list(m;do i=1,2;z(q)skip;do j=
1to 78c=substr(m(i),j;if c=qz(c;z(c;end;z(q',';dcl(c,q)char,m(2)char(99)init(
'%dcl z%z=''put edit'';proc options(main;q=''''''put list(m;do i=1,2;z(q)skip;do j= '、
'1to 78c=substr(m(i),j;if c=qz(c;z(c;end;z(q'','';dcl(c,q)char,m(2)char(99) )init(',
前へ
注: この Quine は 4 つすべてのシステムで動作します。
: qs" 2dup cr 115 放出 34 放出スペース タイプ 34 放出スペース タイプ cr" 2dup cr 115 エミット 34 エミット スペース タイプ 34 エミット スペース タイプ cr ;
追記
(dup == {dup cvx exec} Pop 8 12 getinterval =)
dup cvx exec
ビジュアルフォックスプロ
クリア トークをオフにする テキストマージをオンに設定 \クリア \トークをオフに設定 \テキストマージをオンに設定
Tcl
proc Quine { } { set n [ lindex [情報レベル0 ] 0 ] append s [ list proc $n [ info args $n ] [ info body $n ] ] \n [ list $n ] $sを入れる } クワイン
その他
フランス語
引用符の間の文をコピーしてからコピーします 「引用符の間の文をコピーしてからコピーします」。

