クイン1、51バイト
IO
stdoutに直接出力する匿名アクション。
putStr`mappend`print`id`"putStr`mappend`print`id`"
オンラインでお試しください!
クイン2、265バイト
この関数f
は仮引数を取り、文字列を返します。
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,90,52,82,89,52,51,51,94,84,24,24,39,34,34,106,95,102,110,0,94,50,89,0,90,52,82,82,82,106,95,102,110,0,48,24,24,39,35,106,95,102,110,0,40,24,24,39,37,37,84,24,24,45,37,37,84,24,24,90,84,50,94,52]
オンラインでお試しください!
クイン3、803バイト
LANGUAGE
プラグマの後のすべては、仮引数を取り文字列を返すanymous関数です。
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&'#'&'L'&'A'&'N'&'G'&'U'&'A'&'G'&'E'&' '&'C'&'P'&'P'&'#'&'-'&'}'&'('%'\\'&'q'&'('&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'z'&')'&'y'&'('&'#'&')'&'_'&'-'&'>'&'('&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'&'%'\''&':'&'q'&':'&'k'&':'&'q'&':'&'x'&')'&'#'&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'%'%'\''&':'&'q'&':'%'\''%'\\'%'\\'%'\''&':'&'k'&':'&'q'&':'&'x'&')'&'$'&'y'&'('&':'&')'&'#'&'y'&'('&':'&')'&'$'&' '%'\\'&'x'&'-'&'>'&'x'&')'&'z'&')'%'\''%'\\'%'\''%'\''&'_'&'_'&'T'&'I'&'M'&'E'&'_'&'_'&'('%'\\'&'('&'?'&')'&'v'&' '&'k'&' '&'x'&'-'&'>'&'v'&'$'&'k'&'?'&'x'&')'&'$'&' '%'\\'&'('&'&'&')'&'('&'%'&')'&'v'&'-'&'>'&'v'
オンラインでお試しください!
キャラクターズ
クイン1:
"S`adeimnprtu
クイン2:
!+,.0123456789;<=[]bcfghosw
クイン3:
#$%&'()-:>?ACEGILMNPTU\_kqvxyz{}
使い方
クイン1
putStr`mappend`print`id`"putStr`mappend`print`id`"
クイン1は、私の最近のGolf youクインの答えの修正版です(H.PWizによる改善を含む):
- 完全なプログラムは必要ないため、
main=
削除されました。
<>
そして、$
同義語mappend
とに置き換えられましたid
。
これにより、重要なキャラクター=<>
と$
他のクインの役に立つオペレーターが解放されます。
クイン2
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,......]
Quine 2は、最近の相互排他的なQuines回答のプログラム2とやや似た方法を使用しますが、Quine 3に必要な文字リテラルの使用を回避するために、特にQuine 3に直接適用されshow
ます。運が良ければ、そのキャラクターはまだ使用されていません。
このクインはスペースの代わりにタブを使用しますが、読みやすくするために以下のスペースを使用しました。
g
コードの末尾にある整数のリストとしての、クインデータです。各数字は、残りのコードの文字を表します。
- 番号はによってシフトされる
9
ため、タブは0
。これにより、関数名と変数名の小文字を2桁に収めることができるため、エンコードが少し短くなります。
b c=[[[show 9!!0,show 1!!0..]!!6..]!!c]
は、数値を文字(実際には1文字の文字列)に変換する関数です。
[[show 9!!0,show 1!!0..]!!6..]
は、タブ文字で始まる文字範囲であり、でインデックス付けされ!!c
ます。
- タブ文字自体は別の範囲にインデックスを付けることによって製造される
[show 9!!0,show 1!!0..]
、数字の文字で始まる'9'
と'1'
し、8の段階で飛び降り。
- 数字
show
は、対応する数字の文字列にインデックスを付けることにより生成されます。
f c=[b=<<g]!!0++show g
主な機能です。c
仮引数です。
b=<<g
=<<
各数字g
をその文字に変換するために使用します。(=<<
例えば、の使用は、返された文字をリストでラップする必要map
がある理由b
です。)
show g
g
のリストの文字列表現を提供し、文字列を++
連結します。
- の
=<<
優先順位はに比べて低いため++
、いくつかのブラケットが必要です。使用を避けるために()
(クイン3で予約済み)、[...]!!0
1つの要素を持つリストにインデックスを付けます。
クイン3
他のクインの設計により、クイン3はまだ括弧、ラムダ式、文字リテラル、および文字列/リストコンストラクターにアクセスできます:
。これは、クインのコードを文字列の先頭に追加する関数を作成するのに十分です。
残念ながら、すべての小文字の母音(を除くy
)が使用されており、有用な英数字の組み込み関数は残っていません。また[]""
なくなっています。これは、コードのふりを開始する空の文字列を作成する通常の方法を残しません。
ただし、ほとんどすべての大文字が引き続き使用できるLANGUAGE
ため、言語拡張機能を取得するプラグマが可能です。再び運が良ければ、CPP
(Cプリプロセッサを有効にする)は大文字のみで名前が付けられた唯一の言語拡張です。また、CPPマクロには多くの場合、大文字の名前があります。
そのため、必須の空の文字列を取得するために、クインCPP
は__TIME__
マクロを使用してフォームの文字列定数"??:??:??"
(常に同じ長さであることが便利に保証されます)を取得し、そのパターンに一致します。
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&......
言語プラグマの後、クインは、パラメーターをこれらの4つの引数にバインドするラムダ式で構成されます(最終ダミーパラメーター_
は後で適用されます)。
q
にバインドされ'\''
、単一引用符文字を提供します。
_:_:_:_:_:_:_:_:z
にバインドされ__TIME__
、別名のような文字列で、空の文字列"??:??:??"
を作成z
します。
y
にバインドされた(\(?)v k x->v$k?x)
、ラムダコンビネータは、クインデータを左関連(「foldl」)から右関連(「foldr」)形式に変換するのに使用されます。
- に
(#)
バインドされた演算子\(&)(%)v->v&'{'&'-'&...
、クインデータ自体。
馬のデータは、チャーチエンコーディングの形式、パラメーター付きのラムダ式で提供されます(&)(%)v
。
- 特定の値に式を適用して
(&)
、(%)
およびをインスタンス化v
することにより、このエンコードを使用して、クインのコアコードを構築するか、クインデータ表現自体を再構築できます。
- Haskellのデフォルトの固定性のルールによって、
&
および%
ラムダ内側左結合演算子なります。したがって、文字パラメータv
は、左から始まる最初の文字と結合されます。
- ほとんどの文字
k
には、対応する&'k'
。
- とき
k
である'
か\
、文字リテラル内でエスケープする必要がある、エンコーディングが代わりにあります%'\k'
。
データエンコーディングは左結合型ですが、文字列は右結合方式で構築されるためy = (\(?)v k x->v$k?x)
、不一致を埋めるためにコンビネータが導入されます。
より一般的には、いつ(#)
quine data関数でありf1,f2
、文字と文字列を組み合わせた関数です:
(y(f1)#y(f2)$v) x
= (...(y(f1)(y(f1)v '{') '-')...) x
= v(f1 '{' (f1 '-' (... x)))
クワインデータ機能を適用する(&)=y(f1)
と(%)=y(f2)
、これは、所定の使用f1
とf2
してクワインデータの文字を組み合わせてx
、その後に結果の文字列を渡しますv
。
メインラムダ式の本体は、これをすべてまとめます。
(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z
'&':q:k:q:x
文字のためのk
前に付加&'k'
文字列にx
、しばらく'%':q:'\\':k:q:x
前に付加%'\k'
元のクワインのデータ形式です。
- したがって
y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
、最終的なz
(空の文字列)の前に追加され、次の関数に渡される、クインデータ表現を再構築するための適切なパラメーターです。
y(:)#y(:)
他の変更を加えずに、クインのコアコードを文字列の先頭に追加する適切なパラメーターです。
- 最後に、
\x->x
構築されたクインに対して何もしないことが取得され、それが返されます。