Buat polyglot regex

19

Tulis regex yang berfungsi dalam setidaknya 2 rasa regex (atau versi), dan cocokkan dengan string yang berbeda di setiap rasa (atau versi) yang digunakan.

String yang harus dicocokkan dalam tantangan ini adalah kata-kata pertama dari nama kode Ubuntu, yang tercantum di bawah ini. Regex Anda harus cocok dari atas daftar. Artinya, jika regex Anda bekerja dalam 3 rasa, itu harus cocok Warty Hoarydan Breezy, dan bukan yang lain.

Warty
Hoary
Breezy
Dapper
Edgy
Feisty
Gutsy
Hardy
Intrepid
Jaunty
Karmic
Lucid
Maverick
Natty
Oneiric
Precise
Quantal
Raring
Saucy
Trusty
Utopic
Vivid
Wily
Xenial
Yakkety
Zesty
17.10
18.04
18.10
19.04
19.10
...

Jika regex Anda berfungsi dalam lebih dari 26 rasa, Anda dapat mencocokkan nomor versi Ubuntu. Mulai dari 17,10, untuk setiap rasa baru, ubah angka kedua menjadi 10 jika angka 04, dan tambah angka pertama dan ubah angka kedua menjadi 04.

Dalam setiap rasa, regex Anda harus cocok hanya dengan string yang seharusnya dan tidak ada yang lain (tidak terbatas pada nama kode). Mengejar baris baru tidak masalah. Itu berarti regex Anda hanya bisa mencocokkan string tanpa baris baru, mencocokkan hanya string dengan baris baru, atau cocok dengan keduanya. Dan itu tidak harus konsisten dalam rasa yang berbeda. Anda dapat berasumsi bahwa input tersebut dalam ASCII yang dapat dicetak (kecuali untuk baris baru yang tertinggal, jika ada).

Skor Anda adalah (panjang kode Anda + 10) / ((jumlah rasa) ^ 2). Skor terendah menang.

jimmy23013
sumber
1
Hanya untuk memeriksa - dengan "Dalam setiap rasa, regex Anda harus cocok hanya dengan string yang seharusnya dan tidak ada yang lain." nama string, atau apakah itu berarti bahwa regex hanya dapat mencocokkan string yang tepat dan tidak ada string lain, bahkan jika itu bukan nama versi dalam daftar di atas?
Sp3000
@ Sp3000 Itu harus cocok dengan string yang tepat, dan tidak ada string lainnya.
jimmy23013

Jawaban:

24

87 byte, 5 rasa, (87 + 10) / 25 = 3.88

^(((?=W)[[:word:]&&]art|Ho(?=a)\ar|Bre(?=ez)[]e]\z|E(?=dg)[[d]]g)y|(?=Da)[D-[E]]apper)$

Saya telah menggunakan uji rasa yang mudah untuk saat ini, yaitu:

Struktur umum adalah ^((...)y|...)$, yaitu memfaktorkan keluar trailing ydan menambahkan jangkar.

Warty (PCRE)

(?=W)[[:word:]&&]art

Dalam PCRE dan Ruby, [[:word:]]adalah kelas karakter POSIX yang cocok dengan karakter kata - dalam rasa lain Anda mendapatkan [[:word:]kelas karakter kemudian literal &&], yang gagal (?=W)menegaskan. Untuk membuat Ruby gagal, &&digunakan untuk memotong kelas POSIX dengan tidak ada, sedangkan di PCRE &&tidak memiliki arti khusus.

Hoary (Javascript)

Ho(?=a)\ar

Untuk alasan apa pun, Javascript adalah satu-satunya citarasa dari kelompok yang \amerupakan literal a- dalam citarasa lain itu cocok dengan karakter bel (ASCII 7).

Breezy (Python)

Bre(?=ez)[]e]\z

Dalam Python dan Javascript, \zadalah literal z- dalam arti lain itu setara dengan $akhir jangkar string. Untuk membuat Javascript gagal, kita menggunakan kelas char []e], yang merupakan kelas char kosong []lalu literal e]dalam Javascript, dan kelas dua-char []e]dengan Python.

Dapper (.NET)

(?=Da)[D-[E]]apper

In .NET, [D-[E]]adalah perbedaan set, menghapus set [E]dari [D]. Dalam PCRE, Javascript dan Python, kita memiliki kelas [D-[E]lalu literal ]. Ruby sedikit berbeda, tetapi karena suatu alasan ia mem-parsing sebagai kelas [D-[E]]yang hanya cocok E, dan saya belum mengetahui mengapa ...

Edgy (Ruby)

E(?=dg)[[d]]g

Ruby memungkinkan kelas char di dalam kelas char, jadi [[d]]sebenarnya setara dengan [d], atau adil d. Dalam rasa lain, kita memiliki [[d]literal ].

Sp3000
sumber