Tugas
Tetapkan regex sederhana sebagai ekspresi reguler tidak kosong yang hanya terdiri dari
- karakter
0
dan1
, - tanda kurung pengelompokan
(
dan)
, - pengukur pengulangan satu atau lebih
+
.
Dengan string 0
s dan 1
s yang tidak kosong , program Anda harus menemukan regex sederhana terpendek yang cocok dengan string input penuh . (Yaitu, ketika mencocokkan regex sederhana, berpura-pura itu dibukukan oleh ^
dan $
.) Jika ada beberapa regex terpendek, cetak salah satu atau semuanya.)
kode-golf , jadi pengiriman terpendek (dalam byte) menang.
Uji kasus
1 -> 1
00 -> 00 or 0+
010 -> 010
1110 -> 1+0
01010 -> 01010
0101010 -> 0(10)+ or (01)+0
011111 -> 01+
10110110 -> (1+0)+
01100110 -> (0110)+ or (01+0)+
010010010 -> (010)+
111100111 -> 1+001+ or 1+0+1+
00000101010 -> 0+(10)+ or (0+1)+0
1010110001 -> 1(0+1+)+ or (1+0+)+1
01100110
adalah kasus yang menarik ... algoritma naif akan menulis01+0+1+0
atau(0+1+)+0
yang tidak optimal.Jawaban:
Pyth, 20 byte
Ini membutuhkan waktu sekitar 30 detik untuk dijalankan, sehingga perlu dijalankan secara offline.
Penjelasan:
Saya tidak sepenuhnya yakin bahwa setiap string terpendek adalah urutan dari "() 01+" * 4, tetapi 4 dapat ditingkatkan menjadi 9 tanpa biaya byte jika diperlukan.
sumber
JavaScript (ES6),
488341 bytePenjelasan: Karena enam regex dapat mengekspresikan semua kata biner yang mungkin, dan dua terpanjang panjangnya sembilan karakter, cukup untuk memeriksa semuanya dan semua regex yang lebih pendek. Satu kandidat jelas merupakan string dengan "run length encoding" (yaitu semua digit berjalan diganti dengan
+
s yang sesuai ), tetapi juga string dengan satu set()
s perlu diperiksa. Saya menghasilkan 1596 regex semacam itu (ini termasuk duplikat dan regex yang tidak berguna tetapi mereka hanya akan dihilangkan) dan menguji semua 1597 untuk melihat mana yang paling cocok. Regex yang dihasilkan terbagi dalam dua jenis:\(\d{2,5}\)\+
(60 regex) dan(\d\+?)?\(\d[\d+]?(\d[\d+]?)?\)(\d\+?)?
(1536 regex karena saya menghindari menghasilkan regex dengan digit terdepan dan tambahan).sumber
Pyth -
313029 bytePaksaan! Mungkin bisa sedikit golf iterator.
Test Suite .
sumber
Ruby, 109 byte
Ini adalah pendekatan brute force yang membosankan. Berfungsi karena tidak ada regex yang perlu lebih dari 9 karakter (seperti yang dicatat Neil) dan tidak ada karakter individu yang perlu diulang lebih dari 4 kali (mencobanya dengan
'01()+'.chars*9
membuat CPU saya tidak senang).sumber
Python 3, 186 byte
Saya sedang menyelidiki apakah ada pendekatan untuk masalah ini selain brute-forcing, tapi di sini ada solusi brute-force Python untuk saat ini.
sumber