APL(158文字、スコア= 4)
'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0
ここではDyalog APLを使用しています。0
式の最後と文字列の最後(の前'''
)に(0の後にスペースが続く)を追加することにより、サイクル数を1つ増やすことができます。サイクルの長さは(# 0's) + 1
であり、式の長さは150 + 4*(cycle length))
です。永遠にゼロを追加し続けると仮定すると、スコアはでLimit[(150 + 4*n)/(n - 1), n -> Infinity] = 4
、ここn
でサイクルの長さです。
サイクル長= 6の例を次に示します。
'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0
0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0
0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0
0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0
0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0
0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0
0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0
0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0
0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0
0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1
0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1
'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0
192文字、スコア= 2
'''{2≠⍴⍺:¯3⌽(2×1+⍴⍺)⍴(1+⍴⍺)⍴⍺ ⋄ a←⊃2⌷⍺ ⋄ ⍵=0:¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a⋄(-4+⌊10⍟⊃⍺)⌽(2×1+⍴a)⍴(1+⍴a)⍴a}01'''{2≠⍴⍺:¯3⌽(2×1+⍴⍺)⍴(1+⍴⍺)⍴⍺⋄a←⊃2⌷⍺⋄⍵=0:¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a⋄(-4+⌊10⍟⊃⍺)⌽(2×1+⍴a)⍴(1+⍴a)⍴a}01
実装に応じて、文字列の前にある整数が大きすぎる場合に障害が発生する可能性があります。ただし、理論的に1
は、文字列の最後(の前'''
)と1
行全体の最後に2つの文字を追加することにより、サイクルを追加できます。
200文字、スコア= 1
'''{a←{2=⍴⍵:⊃2⌷⍵⋄⍵}⍺⋄(⍺{⍵=9:⍬⋄⍕1+{2=⍴⍵:10×⊃⍵⋄0}⍺}⍵),(¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a),⍺{⍵=9:(⍕9),⍕⊃⍺⋄⍕⌊⍵÷10}⍵}'''{a←{2=⍴⍵:⊃2⌷⍵⋄⍵}⍺⋄(⍺{⍵=9:⍬⋄⍕1+{2=⍴⍵:10×⊃⍵⋄0}⍺}⍵),(¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a),⍺{⍵=9:(⍕9),⍕⊃⍺⋄⍕⌊⍵÷10}⍵}91
私のAPL実装にはデフォルトで無制限の精度の整数がありません。そのため、整数が大きくなりすぎると整数になり、出力が間違ってしまいます。そのため、これは最も繊細ですが、理論的には(手作業または別のAPLインタープリターを使用して)スコア1が必要です。1
式の最後にa を追加すると、別のサイクルが得られます。
概要(短いクインを使用)
おそらく一番理解しやすいと思うので、最初のバージョンの概要を説明します。ただし、そのバージョンに取り組む前に、APLで簡単なクインを検討します。
1⌽22⍴11⍴'''1⌽22⍴11⍴'''
一部のAPL式を理解する最良の方法の1つは、演算子/関数のカスケード全体で出力を確認することであることがわかりました。APLのすべての演算子と関数は右結合であり、同じ優先順位を持っています。そのため、右から左に次のとおりです。
'''1⌽22⍴11⍴'''
:これは単なる文字列リテラル(文字のリスト)です。''
単一引用符をエスケープするAPLの方法です。出力:'1⌽22⍴11⍴'
。
11⍴'''1⌽22⍴11⍴'''
:ここでは⍴
、文字列の長さを変更します()11
。文字列の長さが11未満であるため、繰り返されます(つまり、5⍴'abc'
を生成します'abcab'
)。出力:'1⌽22⍴11⍴''
。そのため、最後に2つの引用符があります-どこかに到達しています!
22⍴11⍴'''1⌽22⍴11⍴'''
:同様に、以前の出力をlengthに変更し22
ます。出力:'1⌽22⍴11⍴'''1⌽22⍴11⍴''
。もうすぐです-最初の単一引用符を最後に移動するだけです。
1⌽22⍴11⍴'''1⌽22⍴11⍴'''
:ここでは⌽
、文字のリストをで回転()し1
ます。これにより、文字列の最初の文字が最後に移動します。別の例として、を2⌽'abcdef'
返します'cdefab'
。出力:1⌽22⍴11⍴'''1⌽22⍴11⍴'''
。
回転するクイン
その短いクインは、回転クインの主な基盤です。さて、それを念頭に置いて、私たちの馬を見てみましょう:
'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0
{ ... }
名前のない関数を定義します。ここで作業を行います。APLの関数は、で示される右側の引数⍵
と⍺
((中置記号)で示される)オプションの左側の引数を取ることに注意してください。この関数には、クイン文字列と、任意の数のサイクルを作成するのに役立つ何かの両方を供給します。自分自身(およびサイクルを追加したい人)を簡単にするために、クイン文字列を左引数にします。正しい引数は、サイクルのリストを置く場所です。スペースで区切られた2つ以上のアイテムがリストを作成するため、この例では、a 1
とaで構成される2要素リストがあり0
ます。
関数が以前のクインに似ていることがわかります。...⌽...⍴...⍴...
以前と同じフォームを使用しています。だからそれは良いことです-少なくともそれだけは理解しています!のは、最後の後にすべてのものから始めて、楕円を深く掘り下げてみましょう⍴
:⊃,/(~^/¨⍺=0)/⍺
。
- 上記の例を見るとわかるように、文字列の先頭に右側から0を付け、繰り返しごとに1つずつ追加しています。しかし、私たちは今それらを気にしません。文字列が欲しいだけです!
- 最初に、括弧内の内容を検討します。(ちなみに、他のほとんどの言語と同様にグループ化されています。)
⍺=0
この場合、と同じ形状のリストを返します。この場合、の⍺
各要素はに等しい場合はaに、それ以外の場合は⍺
aに置き換えられます。これは再帰的に実行されます。したがって、文字のリストのリストがある場合、個々の文字は0に対してテストされ、バイナリ値のリストのリストのリストが返されます。1
0
0
- したがって
⍺
、文字列だけで構成されている場合、0のリストが返されます。それ以外の場合、左側の引数にはいくつかの0が接頭辞として付けられているため(例:)0 0 0 'quinestring'
、0で構成されるリストと別のリストである文字列です。次に、出力は次のようになり1 1 1 <sub-list of zeros>
ます。
^/¨⍺=0
:論理関数AND()を使用して^/
(/
)を削減する派生関数を、の^
各(¨
)要素に適用し⍺=0
ます。これは、ゼロのサブリストをフラット化して、キイン文字列を1つのバイナリ値と見なすことができるようにすることです。前の例を考慮すると、出力はになります1 1 1 0
。
~
:以前の各値をバイナリーではありません(例:を返す0 0 0 1
)。
(~^/¨⍺=0)/⍺
:の各要素について、左引数の対応する要素によって指定された回数だけ⍺
複製します(/
)。これにより、0がすべて削除され、クイン文字列のみが残ります。
⊃,/
は、連結関数(,
)で結果を減らすことにより、文字のフラット化されたリストを確実に取得するために必要な書類です。入力が既にフラット化されたリストである場合(つまり、メイン関数の左引数が文字列のみである場合)、そのリストを含む1要素のリストを取得します。他の場合、文字列のサブリストで構成されるリストがある場合、同じもの(サブリストを持つリスト)が返されます。次に、これをアンパックし(⊃
)、リストの最初の要素(つまり、文字のサブリスト)のみを提供します。これは不要に思えるかもしれませんが、それ以外の場合は、1要素のリストを作り直そうとしています。
次に、かっこ内の最初の形状変更に指定された長さを確認します。
⍺,⍵
:正しい引数を最初の引数に連結します
⊃,/⍺,⍵
:前と同じ-リストをフラット化します。
+/0=⊃,/⍺,⍵
:追加/
(+
)関数を使用して()を減らし、リスト内のゼロの数を合計します。
2×+/0=⊃,/⍺,⍵
:その数に2を掛けます。
z←2×+/0=⊃,/⍺,⍵
:←
結果を変数に割り当てます()z
。要約するとz
、左と右の両方の引数で見つかったゼロの数の2倍になりました。
77+z←2×+/0=⊃,/⍺,⍵
:次に77
、文字列の文字にを追加します1
。後続のスペース以降のすべてを無視します。最初のクインの例のように、文字列の長さに1を追加して、別の単一引用符を取得します。
- この再形成の出力は、この例では次のとおりです。
'{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 ''
次の形状変更の引数は単純で、短いクイン(最初の形状変更の長さの2倍)を反映しています。現在の出力は次のとおりです。
'{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 ''
最後のステップでは、出力文字列を回転させる量を計算します:
- 前の出力を見ればわかるように、2つの最終的な引用符を先頭に戻すために、それを逆方向(負の量)に回転させたいと思います。私たちがしたいので
0
、同様先頭に移動する(および他のスペース)を、我々は戻ってそれをさらに3つの文字を回転したいです。
+/+/¨⍺=0
:左引数のゼロの数を合計します。最初の(右から)+/¨
は各要素のカウント(つまり、サブリストまたは単なる整数)を+/
合計し、2番目はその結果のリストの合計を提供します。
5+2×+/+/¨⍺=0
:2を掛けて(スペースも回転させるため)、5を加えます(前に思いついた結果)。
- 次に、左の引数から前の値を減算して
-
、サイクルの最後に達した場合を処理します。
(3+z)×^/⍵
:AND正しい引数内のすべての要素を一緒に使用して、終了(1
)に到達したかどうかを確認し、それに乗算し3+z
ます。
これで完了です!