Tantangan Anda adalah membuat regex yang cocok dengan setiap permutasi string itu sendiri, dan tidak ada yang lain. Pertandingan juga harus peka terhadap huruf besar-kecil.
Jadi, misalnya, jika regex Anda adalah:
ABC
Itu harus cocok (dan hanya cocok) string ini:
ABC
ACB
BAC
BCA
CAB
CBA
Seharusnya tidak cocok dengan hal-hal seperti:
AABC (contains an extra A)
ABCD (contains an extra D)
AC (no B)
AAA (no B and C, extra 2 A's)
abc (case-sensitive)
Aturan:
- Anda diizinkan menggunakan rasa regex yang Anda sukai.
- Celah standar berlaku.
- Anda harus memiliki setidaknya dua karakter berbeda dalam kode Anda. Itu berarti solusi seperti
1
tidak valid. - Regex harus hanya berisi ASCII yang dapat dicetak, dan tidak ada yang lain.
(ABC|ACB|BAC|BCA|CAB|CBA)
tetapi Anda menginginkan jawaban umum.Jawaban:
JavaScript,
6457 byte4 byte dihapus berkat Martin Ender.
Coba di sini.
Penjelasan (kedaluwarsa)
sumber
^(?!.*(\S)(.*\1){3}[^1]?)[]zzSS[-^?!!.'''-*1{33}0066-]{60}\z
regex101^(?'4'(?!(.*\4){3})[]$$[\\^^?!!..'-*{}33-5-]){54}$[5]*
Perl dan PCRE regex, 280 byte
(Sedikit) lebih mudah dibaca:
Ini berjalan dalam O (2 ^ n) waktu seperti yang ditulis, sehingga sangat tidak efisien. Cara termudah untuk mengujinya adalah mengganti setiap kemunculan
.*
dengan.*?
, yang menyebabkan case yang cocok diperiksa terlebih dahulu (artinya cocok dengan waktu linier, tetapi masih membutuhkan waktu eksponensial jika gagal mencocokkan).Ide dasarnya adalah bahwa kita menegakkan panjang regex menjadi sama dengan 280, dan menggunakan pernyataan lookahead untuk memaksa setiap karakter dalam regex untuk muncul setidaknya beberapa kali, misalnya
(?=(.*z){2})
memaksaz
karakter untuk tampil setidaknya dua kali.2+43+43+22+23+2+6+16+7+4+1+3+2+2+1+22+22+11+2+23+23
adalah 280, jadi kami tidak dapat memiliki "ekstra" kemunculan karakter apa pun.Ini adalah contoh pemrograman autogram , sebuah kalimat yang menggambarkan dirinya dengan mencantumkan jumlah setiap karakter yang dikandungnya (dan, dalam hal ini, juga total panjang). Saya cukup beruntung dalam membangunnya (biasanya Anda harus menggunakan brute force tetapi saya menemukan solusi ini saat menguji program brute-force saya sebelum saya sepenuhnya selesai menulisnya).
Perl dan PCRE regex, 253 byte, bekerja sama dengan Martin Ender
Saya berhipotesis bahwa mungkin ada solusi yang lebih pendek yang menghilangkan beberapa digit (kemungkinan besar 9, 8, atau 7). Martin Ender menemukan satu, ditunjukkan di bawah:
Versi yang dapat dibaca:
sumber
{}
dalam dua pencarian terakhir. Anda juga tidak perlu menambahkan hal-hal seperti(?=(.*5){1})
karena tidak akan ada5
jika Anda tidak memiliki tampilan itu. Satu masalah adalah bahwa$
memungkinkan linefeed line, jadi Anda harus menggunakan di\z
sana daripada$
seperti jimmy lakukan, tapi itu tidak akan dikenakan biaya satu byte saya pikir karena Anda menyimpan\
di lookahead pertama.$
memungkinkan baris baru di akhir string, yang umumnya tergantung pada bagaimana regex dipanggil oleh sekitarnya. program (mereka biasanya dijalankan pada kode yang sudah diuraikan ke dalam baris).(?=(.*5){1})
dalam hal ini. Jika saya menghapusnya, akan ada angka 5 di program, karena(?=(.*1){6})
baris sekarang harus membaca(?=(.*1){5})
.$
menjadi\z
tidak ada salahnya (dan tidak dapat mematahkan autogram).\$
...$
untukz
...\z
. Itu bekerja; Saya akan mengubahnya.