Jenis ekspresi reguler adalah PCRE.
Tulis program yang mengeluarkan PCRE yang valid sehingga cocok dengan semua bilangan asli antara m
dan n
dan tidak cocok dengan yang lain. Tidak ada angka nol di depan.
Sebagai contoh, biarkan m
dan n
menjadi 123
dan 4321
, maka program mungkin menghasilkan
1(2[3-9]|[3-9]\d)|[2-9]\d\d|[123]\d\d\d|4([012]\d\d|3([01]\d|2[01]))
.
Ini cocok dengan string yang tepat, jadi ^
dan $
jangkar adalah implisit.
Seseorang harus mencoba menyeimbangkan keduanya:
Ekspresi reguler harus memiliki ukuran yang masuk akal.
Kode harus pendek.
Mari kita optimalkan
code length in characters
+ 2 *regular expression length for input 123456 and 7654321
Catatan Sisi: Sangat menarik jika kita dapat membuktikan bahwa ekspresi reguler PCRE terpendek adalah dari ukuran O (log n log n) atau sesuatu.
sumber
re_size*5 + prog_size
(lebih kecil = lebih baik), di manare_size
maksimumm
dann
hingga 5 digit. Ada banyak cara lain untuk melakukannya - yang penting adalah kita bisa menilai jawabannya.print .*
dalam beberapa bahasa.if(min == 123456 && max == 7654321){print_hardcoded_regex}else{enumerate_range_and_join}
Jawaban:
Perl, skor 455
191 karakter, panjang 132 regex
Memasukkan:
123456, 7654321
Pembaruan: Saya dapat lebih menyederhanakan ini ketika saya menyadari bahwa sebagian besar pola diakhiri dengan hal-hal seperti
\d{3}
. Ini melakukan tidak lebih dari menegakkan panjang string - dan melakukannya dengan sangat berulang, karena mereka terjadi pada setiap istilah. Saya menghilangkan ini dengan menggunakan lookahead lain untuk memberlakukan kondisi "kurang dari", hanya memeriksa apakah: 1) bagian pertama dari angka tidak melebihi input atau 2) angka lebih sedikit digit daripada input. Kemudian regex utama hanya memverifikasi bahwa itu tidak terlalu banyak digit.Saya juga memasukkan ide Peter Taylor tentang pandangan negatif untuk memeriksa kondisi "lebih besar dari".
Kunci untuk menyederhanakan masalah ini (setidaknya bagi saya) adalah memecah regex menjadi dua: pandangan ke depan memastikan jumlahnya tidak kurang dari minimum, maka bagian utama dari regex memeriksa bahwa ia tidak lebih besar dari maksimum. Agak konyol untuk input kecil, tetapi tidak terlalu buruk untuk input besar.
Catatan:
0|
di awal adalah untuk mengecualikan apa pun yang dimulai dengan nol dari pencocokan. Ini diperlukan karena sifat rekursif dari fungsi regex: bagian dalam pertandingan dapat dimulai dengan nol, tetapi seluruh jumlahnya tidak bisa. Fungsi regex tidak dapat membedakannya, jadi saya mengecualikan angka apa pun yang dimulai dengan nol sebagai kasus khusus.Memasukkan:
1, 4
Versi Regex Panjang yang Tidak Pantas, 29 karakter:
sumber
m
0 maka Anda harus mengizinkan 0 meskipun memiliki nol di depannya.Javascript, skor 118740839
Saya kira Anda suka atau tidak tergantung pada bagaimana Anda mendefinisikan 'ukuran yang masuk akal.' :-)
sumber
Haskell 2063 + 2 * 151 = 2365
Dijamin regex yang dihasilkan memiliki panjang O (log n log n).
matchIntRange 12345 7654321
1(2(3(4(5[6-9]|[6-9]\d)|[5-9]\d\d)|[4-9]\d{3})|[3-9]\d{4})|[2-9]\d{5}|[1-6]\d{6}|7([0-5]\d{5}|6([0-4]\d{4}|5([0-3]\d{3}|4([012]\d\d|3([01]\d|2[01])))))
Kode di bawah ini adalah versi sederhana yang membantu memahami algoritma, tetapi tidak melakukan optimasi untuk meningkatkan ukuran regex.
matchIntRange 123 4321
Ekspresi reguler memiliki 680 karakter. Ini kodenya
sumber
GolfScript (126 + 2 * 170 = 466)
Untuk nilai yang diberikannya memberikan
Diseksi untuk diikuti, tetapi ide dasarnya adalah untuk mendefinisikan blok kode yang memetakan nomor alami tunggal ke regex yang cocok dengan nomor alami yang lebih kecil, dan kemudian mengubah input
lb
danub
menjadi pencarian yang negatif (nomor alami lebih kecil darilb
) dikombinasikan dengan regex untuk (angka alami lebih kecil dariub+1
).Logikanya cukup rumit, bahkan oleh standar GolfScript itu samar. Sampai saya selesai menulis pembedahan terperinci, berikut adalah daftar variabel:
sumber
|
maka itu adalah bug di mesin regex Anda, bukan di regex saya.(a|)
sebenarnya valid. Namun,[1-0]
di regex Anda sebelumnya tidak berfungsi di Perl atau penguji online yang saya coba.