Retinaでのゴルフのヒント


10

Retinaでゴルフするための一般的なヒントはありますか?Retinaに少なくともいくらか特有のコードゴルフ問題全般に適用できるアイデアを探しています(たとえば、「コメントの削除」は回答ではありません)。回答ごとに1つのヒントを投稿してください。

参考までに、オンラインコンパイラはこちらです。

@ Sp3000は、Regex Golfのヒントもあると指摘しました。ここでの回答は、一般的な正規表現のゴルフのヒントではなく、Retina機能に特に焦点を当てる必要があります。



うーん、Retinaはまだまだ開発中であり、ほとんどの回答はRetinaに特化したものではなく、単純な正規表現のゴルフのヒントになると思っていたので、私はこれを投稿することを延期しました。しかし、私たちはそれを試してみるのもよいと思います... :)
マーティンエンダー

@MartinBüttner私やRetinaを検討し始めて以来、あなたや他の何人かは多くの良いヒントやヒントをくれました。一般的な正規表現のヒントはリンクされた質問に行くべきであるという説明を追加しました。
デジタルトラウマ

1
@MartinBüttnerここに質問するのに最適な場所があります-私はしばらく疑問に思っていました-好奇心から「Retina」という名前のインスピレーションは何ですか?「Re」の部分は正規表現だと思いますが、「tina」はどうですか?
デジタルトラウマ

3
@DigitalTrauma私は頭字語として機能する素晴らしい言葉を考え出そうとしていましたが、失敗しました。「網膜」という言葉は、いくつかの試みにかなり近く、私はその言葉が好きでした。私はそれを頭字語にどうにかして調整することができなかったので、それをあきらめました。つまり、「re」は「正規表現」の一種であり、「。NET」の「n」も多分ですが、結局のところ、それは言葉にすぎません。
マーティンエンダー

回答:


3

可能であればループを組み合わせる

重要な計算では、データを処理するためにいくつかのループを使用することがよくあります。

+`stage1
+`stage2
+`stage3

この実行ので、stage1出力収束するまで、その後、stage2出力収束するまで、その後、stage3出力収束するまで。

ただし、段階を詳細に検討することは常に価値があります。ループをstage1, stage2, stage3, stage1, stage2, stage3, ...代わりにインターリーブ方式で実行することが可能な場合があります(これは実際にステージが何を行うかに大きく依存しますが、完全に直交する変更を行うか、パイプラインとして適切に機能する場合があります)。この場合、バイトを1つのループでラップすることでバイトを節約できます。

{`stage1
stage2
}`stage3

stage1stage3プログラムの最初のステージまたは最後のステージである場合は、それらの括弧も省略することができます(つまり、これにより、2つのステージのループでバイトを節約できます)。

このテクニックの最近の使用は、この回答で見ることができます


2

文字列を同じ長さのチャンクに分割する n

ほとんどの「通常の」言語と同様に、TMTOWTDI(それを行う方法は複数あります)。ここでは、入力に改行が含まれておらず、「分割」とは入力を行に分割することを想定しています。しかし、2つのまったく異なる目標があります。文字列の長さがチャンクの長さの倍数ではない場合、不完全な末尾のチャンクを保持しますか、それとも破棄しますか?

不完全な後続チャンクを保持する

一般的に、Retinaで分割を行うには3つの方法があります。ここでは3つのアプローチすべてを紹介します。これは、関連する問題にそれらを適応させようとすると、大きな違いが生じる可能性があるためです。置換を使用して、一致ごとに改行を追加できます。

.{n}
$&¶

それは、(もしビット以下または8バイトのですn = 2n = 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 = 2n = 3。繰り返しますが、Mこれがコードの最後のステージである場合は省略できます。

ここで末尾の改行が必要な場合は|$、正規表現に追加することで取得できます。

ボーナス:チャンクの重複

Mは、&重複する一致を返すオプションがあります(これは通常、正規表現では不可能です)。これにより、指定した長さの文字列のすべての重複するチャンク(サブ文字列)を取得できます。

M!&`.{n}

文字列を可変長で正確に半分に分割することはどういうわけか可能ですか?そう123456なった123\n4561234567890なると12345\n67890
Kevin Cruijssen、2018年

1
@KevinCruijssen私はそれに特定の機能を追加したとは思いません。おそらく、分散グループを使用する必要があります:tio.run/##K0otycxLNPyvquGe8D/YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP//...あなたは末尾の改行を気にしない場合は、省略することができます?=
マーティンエンダー2018年

私は別の方法で必要だと思ったチャレンジを完了することができましたが、バランシンググループは本当に非常に便利です。私はそれがそれらの線に沿ったものでなければならないことを知っていましたが、私の正規表現/ Retinaスキルはほとんど十分ではありません。回答ありがとうございます!:)
Kevin Cruijssen、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.