Regex Golf: Wilayah Italia vs. Amerika Serikat


23

Kami sudah memiliki masalah meta-regex-golf yang terinspirasi oleh komik xkcd

hak cipta 2013 Randall Munroe

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 chompbaik-baik saja.

Program Anda harus mengambil satu entri (opsional diikuti oleh \natau EOFjika 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 Italydan 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: mmemiliki 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.


Bisakah Anda jelaskan, apa yang Anda maksud dengan "tanpa pemfilteran, tidak ada penggantian, tidak ada apa-apa ... bahkan jika itu juga dilakukan dengan ekspresi reguler." Hanya untuk memperjelas, apakah itu berarti penyaringan, penggantian daftar negara bagian / wilayah atau fokus lebih luas?
Abhijit

@ Abhijit diedit. Apakah itu lebih jelas?
Stanby

3
@ Eliseod'Annunzio: DC bukan negara
Kyle Kanos

1
"Perilaku mungkin tidak ditentukan untuk string yang tidak muncul dalam daftar." aturan ini rusak : ini memungkinkan seseorang untuk kembali USAjika string seperti itu, maka Anda hanya perlu memeriksa wilayah Italia, dan mengembalikan USAsebaliknya.
o0 '.

1
@ baiklah, tidak, itu logika sederhana: pada dasarnya hanya meminta regexp agar sesuai dengan wilayah italia, tetapi kata-kata yang tidak perlu dengan cara yang jauh rumit. The Seluruh titik tentang negara Amerika benar-benar tidak relevan dengan pertanyaan yang sebenarnya bertanya, berkat bug ini. Ini juga membuat pertanyaannya kurang menarik.
o0 '.

Jawaban:


10

Perl - 51 36 byte (untuk regex)

print<>=~/.A|ise|net|te|z.o|[cp]a|[lr]ia|r[cd]/?"Italy
":"USA
"

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.


7

Perl, 40 karakter

Mendekati ini dari arah lain, yaitu mencocokkan negara bagian AS:

[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b

Satu-satunya fitur khusus Perl / PCRE di regexp adalah \banchor batas kata, yang saya gunakan sebagai pengganti $anchor akhir-string agar sesuai dengan "South Carolina".

Inilah regexp dalam Perl one-liner untuk pengujian:

perl -nE 'say /[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b/ ? "USA" : "Italy"'

Ini adalah test harness yang lebih golf: perl -pe '$ _ = / re /? "USA \ n": "Italy \ n"'
Nama samaran

3
@ Nama samaran: meh. Selama itu tidak dihitung dalam skor, sebaiknya tetap dibaca.
Ilmari Karonen

5

Ruby (regex polos), 44

$_ = gets.chomp
puts /'|-|(([^gn]i|gn|at)a|[hst]e|to|zo)$|To|La|pa/ ? "Italy" : "USA"

Kamu tahu apa? Sensitivitas huruf adalah jangkar awal kata terbaik.

Saya tidak yakin, tapi saya pikir saya berutang pauntuk jawaban Hax0r778 ini .


3

Perl - 51

(<STDIN> =~ m/'|-|ru|pu|at|pa|az|gu|mb|rc|ie|rd|ci|os|abr|mol|ven/)?printf("Italy\n"):printf("USA\n");

3

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"

> r("South Dakota") // USA
> r("Puglia") // Italy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.