網膜、77バイト
この機会を利用して、Retinaの新しい機能であるマルチステージループを披露すると思いました。これにより、多くのタスクが大幅に短縮されます(特に条件付き置換)。
ii
-
+`(.)\1|0
(.)-|(\d)(\d)
-$1$3$2
12
i3
23
i1
31
i2
)`(\d)i
i$1
^\D*$
$&0
Retinaは、正規表現ベースのプログラミング言語です。ソースコードはステージにグループ化できます。各ステージは2行で構成され、1行目には正規表現(および場合によっては構成)が含まれ、2行目には置換文字列が含まれます。その後、ステージは順番にSTDINに適用され、最終結果がSTDOUTに出力されます。
-s
コマンドラインスイッチを使用して、上記をソースファイルとして直接使用できます。ただし、各行を個別のファイルに入れることもできるため、スイッチはカウントしません(その後、改行では15バイトが失われますが、追加のファイルでは+15を追加します)。
説明
このソリューションの新しい点)
は、最後から2番目の段階です。これにより、マルチステージループが閉じます。一致するものはありません(
つまり、ループは最初の段階で暗黙的に開始されます。したがって、最初の7つのステージは、7つすべてのパスが結果の変更を停止するまで繰り返されます。これらの7つのステージは、ストリング内の行列の数を徐々に減らし、フェーズを結合するさまざまな変換を単に実行します。最終結果に到達すると、7つのパターンのいずれもこれ以上一致せず、ループは終了します。その後、結果にまだ数字がない場合は0を追加します(上記の段階では、結果を含むすべてのIDが単純にドロップされるため)。
個々のステージが行うことは次のとおりです。
ii
-
すべてのペア兼ね備えi
への-
位相の文字を低減することができます。
+`(.)\1|0
<empty>
2つの連続する同一の文字が残っている場合、それは2つ--
または2つの同一のマトリックスです。どちらの場合でも、それらを掛け合わせることでアイデンティティが得られます。ただし、IDは必要ないため、すべてを削除し、明示的なID(0
s)も削除します。この段階は+
、結果が変化しなくなるまで繰り返されます。これにより123321
、次のステップで数字のすべてのペアが異なると仮定できるように、完全に解決されるようになります。
(.)-|(\d)(\d)
-$1$3$2
これは、実際には1つの2つの別々の変換です(golfitudeの場合)。なお、第1の代替的なマッチが、場合に$2
及び$3
空で、2つ目一致する場合は$1
空です。したがって、これは次の2つのステップに分解できます。
(\d)(\d)
-$2$1
これにより、すべての数字のペアがスワップされ、マイナス記号が追加されます。我々はすべて削除以来0
の、すべて同一ペアを、これが唯一の一致します12
、23
、31
、21
、32
、13
。この手順は奇妙に思えるかもしれませんが、後で処理できないケースは次の反復でここで交換されるため、これらのケースの半分しかチェックできません。
上記の段階の他の部分は次のとおりです。
(.)-
-$1
これにより-
、符号が徐々に左に移動します(反復ごとに1ポジション)。最終的にそれらがすべて隣り合うようにこれを行い、前のステップで解決されます。
12
i3
23
i1
31
i2
これらの3つの段階では、3組の製品を単純に解決します。上記で述べたように、これは関連するケースの半分のみをキャッチしますが、残りの半分は、前のステップですべてのペアを交換した後の次の反復で処理されます。
)`(\d)i
i$1
これがループの最後の段階です。-
を除いて、左にシフトするものに似ていi
ます。主な違いは、これi
は数字のみと交換することです。私が使用(.)i
した場合、1 つ-i
またはi-
2つが無期限にスワップされ、プログラムが終了しない場合に取得します。したがって、これはそれらを-
標識の右側にのみ交換します。これで十分です-すべてが-
ありi
、ある時点で一緒に表示される限り、それらは正しく解決できます。
^\D*$
$&0
最後のステップ(ループ外)。常にすべてのIDを削除したため、結果が実際にID(フェーズの倍数)である場合は、出力に必要な数字がもうないので、追加し直します。
例として、すべての中間形式0223202330203313021301011023230323
(変更を実行しないスキップステージ)は次のとおりです。
0223202330203313021301011023230323
321321312 # Remove identities
-23-31-12-132 # Swap all pairs
-23-31-i3-132 # Resolve 12
-i1-31-i3-132 # Resolve 23
-i1-i2-i3-132 # Resolve 31
-i-1i-2i-3-312 # Move - to the left and swap pairs
-i-1i-2i-3-3i3 # Resolve 12
-i-i1-i2-3-i33 # Move i to the left
-i-i1-i2-3-i # Remove identities
--ii-1i-2-3i # Move - to the left
--ii-i1-2-i3 # Move i to the left
----i1-2-i3 # Resolve ii
i1-2-i3 # Remove identities
i-1-2i3 # Move - to the left
i-1-i23 # Move i to the left
-i-1i-32 # Move - to the left and swap pairs
-i-i1-32 # Move i to the left
--ii-1-23 # Move - to the left and swap pairs
--ii-1-i1 # Resolve 23
----1-i1 # Resolve ii
1-i1 # Remove identities
-1i1 # Move - to the left
-i11 # Move i to the left
-i # Remove identities. Now the loop can't change this any longer.
-i0 # Fix the result by adding in the 0.