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.
Jawaban:
Gabungkan loop jika memungkinkan
Dalam perhitungan non-sepele Anda akan sering menemukan diri Anda menggunakan beberapa loop untuk memproses data:
Jadi ini berjalan
stage1
sampai output konvergen, lalustage2
sampai output konvergen dan kemudianstage3
sampai 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:Jika
stage1
ini adalah tahap pertama ataustage3
merupakan 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 .
sumber
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:
Itu 8 byte (atau sedikit kurang jika
n = 2
ataun = 3
karena 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:
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. Untukn = 3
itu 8 byte dan untukn = 2
itu 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:Ini juga 9 byte, dan juga tidak akan termasuk linefeed baris tambahan. Ini juga menjadi 8 byte untuk
n = 3
dilakukan..?.?
. Namun perhatikan bahwa itu berkurang menjadi 6 byten = 2
karena sekarang kita hanya perlu..?
. Perhatikan juga bahwaM
ini 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:
Itu 7 byte, atau kurang untuk
n = 2
,n = 3
. Sekali lagi, perhatikan bahwa Anda dapat menghilangkanM
jika 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
M
memiliki&
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:sumber
123456
menjadi123\n456
dan1234567890
menjadi12345\n67890
??=
.