Tips untuk bermain golf di Retina

10

Tips umum apa yang Anda miliki untuk bermain golf di Retina ? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk Retina (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.

Untuk referensi, kompiler online ada di sini .

@ Sp3000 menunjukkan ada juga Tips untuk Regex Golf . Jawaban di sini harus fokus khusus pada fitur Retina dan bukan pada tips golf regex umum.

Trauma Digital
sumber
2
Terkait: Tips untuk golf regex
Sp3000
Hmmm, saya sudah menunda posting ini karena Retina masih banyak dalam pengembangan dan saya khawatir sebagian besar jawaban akan berakhir menjadi tip golf regex polos, tidak terlalu spesifik untuk Retina. Tapi sebaiknya kita coba, kurasa ... :)
Martin Ender
@ MartinBüttner Anda dan beberapa orang lain telah memberi saya banyak tips dan petunjuk yang baik sejak saya mulai melihat Retina, jadi saya pikir mungkin sudah saatnya untuk ini. Saya menambahkan klarifikasi bahwa tips regex umum harus masuk ke pertanyaan terkait.
Digital Trauma
1
@ MartinBüttner Ini tempat yang bagus untuk bertanya - Saya sudah lama bertanya-tanya - karena penasaran, apa inspirasi untuk nama "Retina"? Saya menganggap bagian "Re" adalah untuk Ekspresi Reguler, tetapi bagaimana dengan "tina"?
Trauma Digital
3
@DigitalTrauma Saya mencoba untuk datang dengan kata yang bagus yang akan berfungsi sebagai akronim, tetapi gagal. Kata "retina" cukup dekat dengan beberapa upaya, dan saya menyukai kata itu. Saya tidak pernah berhasil retcon menjadi akronim dan sejak itu menyerah pada itu. Jadi ya "re" adalah semacam untuk "ekspresi reguler" dan mungkin "n" untuk ". NET", tetapi pada akhirnya itu hanya sebuah kata yang terdengar bagus.
Martin Ender

Jawaban:

3

Gabungkan loop jika memungkinkan

Dalam perhitungan non-sepele Anda akan sering menemukan diri Anda menggunakan beberapa loop untuk memproses data:

+`stage1
+`stage2
+`stage3

Jadi ini berjalan stage1sampai output konvergen, lalu stage2sampai output konvergen dan kemudian stage3sampai output konvergen.

Namun, selalu ada baiknya memeriksa tahapan secara detail. Kadang-kadang mungkin untuk menjalankan loop dengan cara yang disisipkan sebagai stage1, stage2, stage3, stage1, stage2, stage3, ...gantinya (ini sangat tergantung pada apa yang sebenarnya dilakukan tahapan, tetapi kadang-kadang mereka membuat perubahan yang sepenuhnya ortogonal atau berfungsi dengan baik sebagai pipa). Dalam hal ini Anda dapat menyimpan byte dengan membungkusnya dalam satu lingkaran:

{`stage1
stage2
}`stage3

Jika stage1ini adalah tahap pertama atau stage3merupakan tahap terakhir dari program, Anda bahkan dapat menghilangkan tanda kurung itu (yang berarti ini sudah dapat menyimpan byte untuk satu loop dari dua tahap).

Penggunaan teknik ini baru-baru ini dapat dilihat dalam jawaban ini .

Martin Ender
sumber
2

Memisahkan string menjadi potongan dengan panjang yang sama n

Seperti dalam kebanyakan bahasa "normal" TMTOWTDI (ada lebih dari satu cara untuk melakukannya). Saya berasumsi di sini bahwa input tidak mengandung umpan baris, dan bahwa "pemisahan" berarti membaginya menjadi garis. Tetapi ada dua tujuan yang sangat berbeda: jika panjang string bukan kelipatan panjang chunk, apakah Anda ingin menyimpan chunk trailing yang tidak lengkap atau Anda ingin membuangnya?

Menyimpan potongan trailing yang tidak lengkap

Secara umum, ada tiga cara untuk melakukan pemisahan di Retina. Saya menghadirkan ketiga pendekatan di sini, karena mereka mungkin membuat perbedaan yang lebih besar ketika Anda mencoba menyesuaikannya dengan masalah yang terkait. Anda dapat menggunakan pengganti dan menambahkan umpan baris ke setiap pertandingan:

.{n}
$&¶

Itu 8 byte (atau sedikit kurang jika n = 2atau n = 3karena Anda dapat menggunakan ..atau ...masing - masing). Ini memiliki satu masalah: menambahkan baris baris tambahan jika panjang string adalah kelipatan dari panjang chunk.

Anda juga dapat menggunakan tahap pemisahan, dan memanfaatkan fakta bahwa tangkapan dipertahankan dalam pemisahan:

S_`(.{n})

The _pilihan menghilangkan garis-garis kosong yang dinyatakan akan dihasilkan dari meliputi seluruh string dengan pertandingan. Ini adalah 9 byte, tetapi tidak menambahkan linefeed tambahan. Untuk n = 3itu 8 byte dan untuk n = 2itu 7 byte. Perhatikan bahwa Anda dapat menyimpan satu byte secara keseluruhan jika baris kosong tidak masalah (mis. Karena Anda hanya akan memproses baris non-kosong dan menghilangkan baris baris nanti): maka Anda dapat menghapus _.

Opsi ketiga adalah menggunakan korek api. Dengan !opsi tersebut kita dapat mencetak semua kecocokan. Namun, untuk memasukkan bilah trailing, kami perlu mengizinkan panjang kecocokan variabel:

M!`.{1,n}

Ini juga 9 byte, dan juga tidak akan termasuk linefeed baris tambahan. Ini juga menjadi 8 byte untuk n = 3dilakukan ..?.?. Namun perhatikan bahwa itu berkurang menjadi 6 byte n = 2karena sekarang kita hanya perlu ..?. Perhatikan juga bahwa Mini dapat dihapus jika ini adalah tahap terakhir dalam program Anda, menghemat satu byte dalam hal apa pun.

Membuang potongan trailing yang tidak lengkap

Ini menjadi sangat lama jika Anda mencoba melakukannya dengan pengganti, karena Anda perlu mengganti bilah trailing dengan apa-apa (jika ada) dan juga dengan split. Jadi kita bisa dengan aman mengabaikannya. Menariknya, untuk pendekatan pertandingan justru sebaliknya: semakin pendek:

M!`.{n}

Itu 7 byte, atau kurang untuk n = 2, n = 3. Sekali lagi, perhatikan bahwa Anda dapat menghilangkan Mjika ini adalah tahap terakhir dalam kode.

Jika Anda ingin mengikuti garis makan di sini, Anda bisa mendapatkannya dengan menambahkan |$ke regex.

Bonus: potongan yang tumpang tindih

Ingatlah bahwa Mmemiliki &opsi yang mengembalikan kecocokan yang tumpang tindih (yang biasanya tidak dimungkinkan dengan regex). Ini memungkinkan Anda untuk mendapatkan semua potongan (substring) yang tumpang tindih dari string dengan panjang tertentu:

M!&`.{n}
Martin Ender
sumber
Apakah mungkin untuk memisahkan string tepat menjadi dua dengan panjang variabel? Jadi 123456menjadi 123\n456dan 1234567890menjadi 12345\n67890?
Kevin Cruijssen
1
@KevinCruijssen Saya rasa saya tidak menambahkan fitur spesifik untuk itu. Anda mungkin harus menggunakan grup penyeimbang: tio.run / ##K0otycxLNPyvquGe8D / YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP//... Jika Anda tidak keberatan dengan linefeed line tambahan, Anda dapat menghilangkannya ?=.
Martin Ender
Saya dapat menyelesaikan tantangan di mana saya pikir saya membutuhkannya secara berbeda, tetapi kelompok penyeimbang memang sangat berguna! Saya tahu itu harus menjadi sesuatu seperti itu, tetapi keterampilan regex / Retina saya hampir tidak cukup baik. Terimakasih telah menjawab! :)
Kevin Cruijssen