Kami sudah memiliki masalah meta-regex-golf yang terinspirasi oleh komik xkcd
Tapi, golf regex ini terlihat menyenangkan juga! Saya ingin membedakan antara negara bagian AS dan wilayah Italia. Mengapa? Saya warga negara dari kedua negara, dan saya selalu mengalami masalah * ini .
Wilayah Italia adalah
Abruzzo, Valle d'Aosta, Puglia, Basilicata, Calabria, Campania, Emilia-Romagna, Friuli-Venezia Giulia, Lazio, Liguria, Lombardia, Marche, Molise, Piemonte, Sardegna, Sicilia, Trentino-Alto Adige/Südtirol, Toscana, Umbria, Veneto
dan negara bagian AS adalah
Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin, Wyoming
Tugas Anda adalah menulis program yang membedakan daftar ini dengan ekspresi reguler. Ini adalah permainan baru, jadi inilah
Aturan
- Membedakan antara daftar harus dilakukan dengan satu ekspresi reguler yang cocok.
- Skor Anda adalah panjang dari ekspresi reguler itu, lebih kecil lebih baik.
Untuk menjadi jelas: semua pekerjaan harus dilakukan dengan ekspresi reguler - tanpa filter, tanpa penggantian, tidak ada apa-apa ... bahkan jika itu juga dilakukan dengan ekspresi reguler. Artinya, input harus diteruskan langsung ke ekspresi reguler, dan hanya jawaban biner (kecocokan / tidak ada kecocokan) yang dapat digunakan oleh bagian kode selanjutnya. Masukan tidak boleh diinspeksi atau diubah dengan apa pun kecuali ekspresi yang cocok. Pengecualian : makan baris baru dengan sesuatu yang mirip dengan Ruby chomp
baik-baik saja.
Program Anda harus mengambil satu entri (opsional diikuti oleh \n
atau EOF
jika itu membuat segalanya lebih mudah) dari salah satu daftar dari stdin, dan cetak untuk stdout nama daftar itu. Dalam hal ini, daftar kami diberi nama Italy
dan USA
.
Untuk menguji kode Anda, cukup jalankan kedua daftar itu. Perilaku mungkin tidak ditentukan untuk string yang tidak muncul dalam daftar.
Masalah Penilaian
Ini mungkin harus dilakukan berdasarkan bahasa-per-bahasa. Di Perl,
m/foobarbaz/
adalah ekspresi reguler yang cocok. Namun, dengan Python,
import re
re.compile('foobarbaz')
melakukan hal yang sama. Kami tidak akan menghitung tanda kutip untuk Python, jadi saya katakan kami tidak menghitung m/
dan terakhir /
dalam Perl. Dalam kedua bahasa, yang di atas harus menerima skor 9.
Untuk memperjelas poin yang diajukan oleh Abhijit , panjang sebenarnya dari persamaan yang cocok adalah skor, bahkan jika Anda menghasilkannya secara dinamis. Misalnya, jika Anda menemukan ekspresi magis m
,
n="foo(bar|baz)"
m=n+n
maka Anda tidak boleh melaporkan skor 12: m
memiliki panjang 24. Dan hanya untuk lebih jelas, ekspresi reguler yang dihasilkan tidak dapat bergantung pada input. Itu akan membaca input sebelum meneruskannya ke ekspresi reguler.
Contoh Sesi
input> Calabria
Italy
input> New Hampshire
USA
input> Washington
USA
input> Puglia
Italy
* Sebenarnya, itu bohong. Saya tidak pernah memiliki masalah dengan ini sama sekali.
USA
jika string seperti itu, maka Anda hanya perlu memeriksa wilayah Italia, dan mengembalikanUSA
sebaliknya.Jawaban:
Perl -
5136 byte (untuk regex)Tidak ada yang istimewa, tetapi boleh juga mempostingnya, karena berbeda dengan solusi 51 byte lainnya.Atau sebagai alternatif, persingkat solusi saya yang sudah pendek sebesar 15 byte. Ini menang untuk saat ini, saya pikir.
sumber
Perl, 40 karakter
Mendekati ini dari arah lain, yaitu mencocokkan negara bagian AS:
Satu-satunya fitur khusus Perl / PCRE di regexp adalah
\b
anchor batas kata, yang saya gunakan sebagai pengganti$
anchor akhir-string agar sesuai dengan "South Carolina".Inilah regexp dalam Perl one-liner untuk pengujian:
sumber
Ruby (regex polos), 44
Kamu tahu apa? Sensitivitas huruf adalah jangkar awal kata terbaik.
Saya tidak yakin, tapi saya pikir saya berutang
pa
untuk jawaban Hax0r778 ini .sumber
Perl - 51
sumber
JavaScript 42
alert(/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(prompt())?"Italy":"USA")
Saya awalnya akan mengerjakan ini dari sisi AS, karena menghilangkan KWXY dari daftar strip USA banyak Amerika Serikat ... Tapi Italia telah dikalahkan oleh 17 karakter yang baik ...
Jika kita menggunakan notasi panah gemuk, kita bisa menguranginya menjadi fungsi sederhana dengan variabel return.
r=s=>/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(s)?"Italy":"USA"
sumber