新しいタイプの正規表現ゴルフチャレンジを試してみたいと思います。これは、正規表現の置換だけで、自明ではない計算タスクを解決するように求めます。これを可能にし、面倒な作業を少なくするために、次々にいくつかの置換を適用できます。
チャレンジ
簡単に始めましょう。2つの正の整数を含む文字列を、a ,
で区切られた10進数として指定すると、合計も10進数としても含む文字列が生成されます。だから、非常に簡単に
47,987
になるはずです
1034
あなたの答えは、任意の正の整数に対して機能するはずです。
フォーマット
すべての答えは置換ステップのシーケンスである必要があり、各ステップは正規表現と置換文字列で構成されます。オプションで、シーケンス内のこれらの各ステップについて、ストリングの変更が停止するまで置換を繰り返すことを選択できます。以下に送信例を示します(上記の問題は解決しません)。
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
inputが与えられると123,456
、このサブミッションは入力を次のように処理します。最初の置換が1回適用され、次のようになります。
|123,|456
これで、ストリングの変更が停止するまで、2番目の置換がループで適用されます。
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
最後に、3番目の置換が1回適用されます。
111111
ループの終了基準は、正規表現が一致を検出したかどうかではなく、文字列が変更されたかどうかであることに注意してください。(つまり、一致するものが見つかっても置換が一致する場合にも終了する可能性があります。)
得点
プライマリスコアは、提出の代替ステップの数になります。置換が繰り返されるたびに、10ステップがカウントされます。したがって、上記の例ではスコアが付けられ1 + 10 + 1 = 12
ます。
タイの(あまりありそうにない)ケースでは、2次スコアはすべてのステップのサイズの合計です。各ステップで、正規表現(区切り文字なし)、修飾子、置換文字列を追加します。上記の例では、これはになります(6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
。
その他の規則
任意の正規表現フレーバー(指定する必要があります)を使用できますが、すべてのステップで同じフレーバーを使用する必要があります。さらに、置換コールバックやPerlコードを評価するPerl の修飾子など、フレーバーのホスト言語の機能を使用しないでくださいe
。すべての操作は、正規表現の置換によってのみ行われる必要があります。
各置換がすべての出現を置き換えるか、単一の出現のみを置き換えるかは、フレーバーと修飾子に依存することに注意してください。たとえば、ECMAScriptフレーバーを選択した場合、g
修飾子を使用しない限り、デフォルトでは1つのステップで1つのオカレンスのみが置き換えられます。一方、.NETフレーバーを使用している場合、各ステップは常にすべての出現を置き換えます。
シングルとグローバル交換(例えばRubyのためのさまざまな代替方法を持っている言語についてはsub
対をgsub
)、単一の置換は、デフォルトなど御馳走グローバルの交換であることを前提としていg
修飾子。
テスト中
選択したフレーバーが.NETまたはECMAScriptの場合、Retinaを使用して送信をテストできます(私は言われていますが、Monoでも動作します)。他のフレーバーの場合、おそらく、置換を順番に適用するホスト言語で小さなプログラムを作成する必要があります。その場合は、このテストプログラムを回答に含めてください。