Retinaでゴルフするための一般的なヒントはありますか?Retinaに少なくともいくらか特有のコードゴルフ問題全般に適用できるアイデアを探しています(たとえば、「コメントの削除」は回答ではありません)。回答ごとに1つのヒントを投稿してください。
参考までに、オンラインコンパイラはこちらです。
@ Sp3000は、Regex Golfのヒントもあると指摘しました。ここでの回答は、一般的な正規表現のゴルフのヒントではなく、Retina機能に特に焦点を当てる必要があります。
Retinaでゴルフするための一般的なヒントはありますか?Retinaに少なくともいくらか特有のコードゴルフ問題全般に適用できるアイデアを探しています(たとえば、「コメントの削除」は回答ではありません)。回答ごとに1つのヒントを投稿してください。
参考までに、オンラインコンパイラはこちらです。
@ Sp3000は、Regex Golfのヒントもあると指摘しました。ここでの回答は、一般的な正規表現のゴルフのヒントではなく、Retina機能に特に焦点を当てる必要があります。
回答:
重要な計算では、データを処理するためにいくつかのループを使用することがよくあります。
+`stage1
+`stage2
+`stage3
この実行ので、stage1出力収束するまで、その後、stage2出力収束するまで、その後、stage3出力収束するまで。
ただし、段階を詳細に検討することは常に価値があります。ループをstage1, stage2, stage3, stage1, stage2, stage3, ...代わりにインターリーブ方式で実行することが可能な場合があります(これは実際にステージが何を行うかに大きく依存しますが、完全に直交する変更を行うか、パイプラインとして適切に機能する場合があります)。この場合、バイトを1つのループでラップすることでバイトを節約できます。
{`stage1
stage2
}`stage3
stage1がstage3プログラムの最初のステージまたは最後のステージである場合は、それらの括弧も省略することができます(つまり、これにより、2つのステージのループでバイトを節約できます)。
このテクニックの最近の使用は、この回答で見ることができます。
nほとんどの「通常の」言語と同様に、TMTOWTDI(それを行う方法は複数あります)。ここでは、入力に改行が含まれておらず、「分割」とは入力を行に分割することを想定しています。しかし、2つのまったく異なる目標があります。文字列の長さがチャンクの長さの倍数ではない場合、不完全な末尾のチャンクを保持しますか、それとも破棄しますか?
一般的に、Retinaで分割を行うには3つの方法があります。ここでは3つのアプローチすべてを紹介します。これは、関連する問題にそれらを適応させようとすると、大きな違いが生じる可能性があるためです。置換を使用して、一致ごとに改行を追加できます。
.{n}
$&¶
それは、(もしビット以下または8バイトのですn = 2かn = 3、あなたが使用することができますので、..または...それぞれ)。ただし、これには1つの問題があります。文字列の長さがチャンクの長さの倍数である場合、追加の改行が追加されます。
また、スプリットステージを使用して、キャプチャがスプリットに保持されるという事実を利用することもできます。
S_`(.{n})
この_オプションは、文字列全体を一致でカバーすることで生じる空行を削除します。これは9バイトですが、末尾の改行は追加されません。以下のためのn = 3それの8バイトのためのn = 2それの7バイト。空の行が問題にならない場合は、全体で1バイトを節約できることに注意してください(たとえば、空でない行のみを処理し、とにかく改行を取り除くため):次に、を削除できます_。
3番目のオプションは、一致を使用することです。では!オプション我々はすべての一致を印刷することができます。ただし、末尾のチャンクを含めるには、一致の長さを可変にする必要があります。
M!`.{1,n}
これも9バイトであり、末尾の改行も含まれません。また、これは8バイトになりn = 3実行して..?.?。ただし、必要なのは6バイトに減少することに注意してください。また、これがプログラムの最後のステージである場合は、が削除される可能性があることにも注意してください。n = 2..?M
末尾のチャンクを何も(存在する場合)、スプリットで置き換える必要があるため、置き換えを行うと、これは非常に長くなります。したがって、これらは無視しても問題ありません。興味深いことに、マッチアプローチの場合は逆です。短くなります。
M!`.{n}
それは7バイトですが、以下のためn = 2、n = 3。繰り返しますが、Mこれがコードの最後のステージである場合は省略できます。
ここで末尾の改行が必要な場合は|$、正規表現に追加することで取得できます。
にMは、&重複する一致を返すオプションがあります(これは通常、正規表現では不可能です)。これにより、指定した長さの文字列のすべての重複するチャンク(サブ文字列)を取得できます。
M!&`.{n}
123456なった123\n456と1234567890なると12345\n67890?
?=。