pengantar
Saya tidak melihat banyak tantangan regex di sini, jadi saya ingin menawarkan ini sederhana yang menipu yang dapat dilakukan dalam beberapa cara menggunakan sejumlah rasa regex. Saya harap ini memberi para penggemar regex waktu bermain golf yang menyenangkan.
Tantangan
Tantangannya adalah untuk mencocokkan apa yang secara longgar saya juluki seri "egaliter": serangkaian jumlah karakter yang berbeda dengan jumlah yang sama. Ini paling baik dijelaskan dengan contoh.
Pertandingan:
aaabbbccc
xyz
iillppddff
ggggggoooooollllllffffff
abc
banana
Jangan cocokkan:
aabc
xxxyyzzz
iilllpppddff
ggggggoooooollllllfff
aaaaaabbbccc
aaabbbc
abbaa
aabbbc
Untuk menggeneralisasikan, kami ingin mencocokkan subjek dari bentuk ( untuk daftar karakter untuk , di mana untuk semuac1)n(c2)n(c3)n...(ck)n
c1
ck
ci != ci+1
i, k > 1, and n > 0.
Klarifikasi:
Masukan tidak akan kosong.
Suatu karakter dapat terulang kembali nanti dalam string (mis. "Pisang")
k > 1
, jadi akan selalu ada setidaknya 2 karakter berbeda dalam string.Anda dapat mengasumsikan hanya karakter ASCII yang akan diteruskan sebagai input dan tidak ada karakter yang akan menjadi terminator garis.
Aturan
(Terima kasih kepada Martin Ender untuk blok peraturan yang dinyatakan dengan sangat baik ini)
Jawaban Anda harus terdiri dari satu regex, tanpa kode tambahan (kecuali, secara opsional, daftar pengubah regex yang diperlukan untuk membuat solusi Anda berfungsi). Anda tidak boleh menggunakan fitur rasa regex bahasa Anda yang memungkinkan Anda untuk memohon kode dalam bahasa hosting (mis. e
Pengubah Perl ).
Anda dapat menggunakan rasa regex apa pun yang ada sebelum tantangan ini, tetapi mohon tentukan rasanya.
Jangan berasumsi bahwa regex berlabuh secara implisit, misalnya jika Anda menggunakan Python, anggap bahwa regex Anda digunakan dengan re.search dan bukan dengan re.match. Regex Anda harus cocok dengan seluruh string untuk string egaliter yang valid dan tidak menghasilkan yang cocok untuk string yang tidak valid. Anda dapat menggunakan sebanyak mungkin grup penangkap sesuai keinginan.
Anda dapat mengasumsikan bahwa input akan selalu berupa string dua atau lebih karakter ASCII yang tidak mengandung terminator garis apa pun.
Ini adalah golf regex, jadi regex terpendek yang menang. Jika bahasa Anda membutuhkan pembatas (biasanya /.../
) untuk menunjukkan ekspresi reguler, jangan hitung pembatas itu sendiri. Jika solusi Anda memerlukan pengubah, tambahkan satu byte per pengubah.
Kriteria
Ini golf yang bagus, jadi lupakan efisiensi dan cobalah untuk mendapatkan regex sekecil mungkin.
Sebutkan rasa regex mana yang telah Anda gunakan dan, jika mungkin, sertakan tautan yang menunjukkan demo online ekspresi Anda saat beraksi.
sumber
banana
egaliter.Jawaban:
.NET rasa, 48 byte
Cobalah online! (menggunakan Retina )
Ya, ternyata tidak meniadakan logika itu lebih sederhana. Saya membuat ini sebagai jawaban yang terpisah, karena kedua pendekatan tersebut sangat berbeda.
Penjelasan
sumber
((^.|\2(?=.*\4\3)|\4(?!\3))(?=\2*+((.)\3?)))+\3$
Saya sedang bereksperimen dengan\3*
tempat(?!\3)
untuk membuatnya 45b tetapi gagal pada "aabbbc" :( Versi Perl lebih mudah dimengerti, dan sekarang turun menjadi 45b:^((?=(.)\2*(.))(?=(\2(?4)?\3)(?!\3))\2+)+\3+$
- alasan saya menyebutnya Perl meskipun itu tampaknya PCRE valid adalah bahwa PCRE berpikir(\2(?4)?\3)
dapat muncul kembali tanpa batas sedangkan Perl sedikit lebih pintar / memaafkan.NET rasa, 54 byte
Cobalah online! (menggunakan Retina )
Saya cukup yakin ini suboptimal, tapi ini yang terbaik yang saya lakukan untuk menyeimbangkan grup saat ini. Saya punya satu alternatif pada jumlah byte yang sama, yang sebagian besar sama:
Penjelasan
Gagasan utamanya adalah membalikkan masalah, mencocokkan string non-egaliter dan menempatkan semuanya dalam tampilan negatif untuk meniadakan hasilnya. Keuntungannya adalah kita tidak harus melacak n di seluruh string (karena sifat dari kelompok penyeimbang, Anda biasanya mengonsumsi n saat memeriksanya), untuk memeriksa bahwa semua run memiliki panjang yang sama. Sebagai gantinya, kami hanya mencari satu pasangan lintasan yang berdekatan yang tidak memiliki panjang yang sama. Dengan begitu, saya hanya perlu menggunakan n sekali.
Berikut ini rincian dari regex.
sumber
banana
,aba
,bbbaaannnaaannnaaa
,bbbaaannnaaannnaaaaaa
,The Nineteenth Byte
,11
,110
,^(?!.*(?<=(\2)*(.))(?!\2)(?>(.)(?<-1>\3)*)(?(1)|\3)).+
,bababa
. Akulah yang gagal. :( +1