Regex Golf: İtalya ve ABD Devletleri bölgeleri


23

Xkcd çizgi romanından esinlenilmiş bir meta-regex-golf problemimiz var .

telif hakkı 2013 Randall Munroe

Ancak, bu regex golf de eğlenceli görünüyor! ABD'nin eyaletleri ile İtalya'nın bölgeleri arasında ayrım yapmak istiyorum. Niye ya? Her iki ülkenin de vatandaşıyım ve bu konuda her zaman sorun yaşıyorum * .

İtalya'nın bölgeleri

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

ABD’nin devletleri

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

İşiniz, bu listeleri düzenli bir ifadeyle ayıran bir program yazmaktır. Bu yeni bir oyun, işte burada

kurallar

  • Listeleri birbirinden ayırmak tek bir eşleştirme düzenli ifadesiyle yapılmalıdır.
  • Puanınız, normal ifadenin uzunluğudur, daha küçük daha iyidir.

Açık olmak gerekirse, tüm çalışmalar düzenli ifadelerle yapılmalıdır - filtreleme yok, değişiklik yok, hiçbir şey yok ... normal ifadelerle de olsalar. Diğer bir deyişle, girdi doğrudan normal bir ifadeye geçirilmelidir ve yalnızca ikili cevap (eşleşme / eşleşme yok) kodun sonraki bölümlerinde kullanılabilir. Girdi, eşleşen ifade dışında hiçbir şey tarafından incelenmemeli veya değiştirilmemelidir. İstisna : Ruby'ninkine benzer bir şeyle yeni bir çizgi yemek chompiyidir.

Programınız , stdin'den bir listeden (isteğe bağlı olarak takip eden \nveya EOFişleri kolaylaştırırsa) tek bir giriş yapmalı ve bu listenin adını stdout'a yazdırmalıdır. Bu durumda listelerimiz Italyve USA.

Kodunuzu test etmek için iki listeyi de kolayca çalıştırın. Davranış, listede bulunmayan dizgiler için tanımsız olabilir.

Puanlama Konuları

Bunun dil bazında yapılması gerekebilir. Perl'de

m/foobarbaz/

eşleşen bir düzenli ifadedir. Ancak, Python’da

import re
re.compile('foobarbaz')

aynı şeyi yapar. Python için alıntıları saymazdık, ben de Perl'de m/final /ve saymadığımızı söylüyorum . Her iki dilde de yukarıdaki puan 9 olmalıdır.

Abhijit'in yükselttiği bir noktayı netleştirmek için , eşleşen ifadenin gerçek uzunluğu, dinamik olarak oluştursanız bile puandır. Örneğin, sihirli bir ifade bulursanız m,

n="foo(bar|baz)"
m=n+n

Öyleyse 12 puan almamalısınız: muzunluğu 24. Bu, normal ifadeye geçmeden önce girişi okumak olacaktır.

Örnek Oturum

input> Calabria
Italy
input> New Hampshire
USA
input> Washington
USA
input> Puglia
Italy

* Aslında, bu bir yalan. Bununla hiçbir zaman bir sorunum olmadı.


Ne demek istediğinizi "filtreleme yok, değiştirme yok, hiçbir şey yok ... normal ifadelerle de yapılsalar" ile açıklayabilir misiniz? Sadece açıklığa kavuşturmak, filtreleme, eyaletler / bölgeler listesinin değiştirilmesi veya odağın daha geniş olduğu anlamına mı geliyor?
Abhijit

@Abhijit düzenlendi. Daha açık mı?
stand

3
@ Eliseod'Annunzio: DC bir devlet değil
Kyle Kanos

1
"Listede bulunmayan dizgiler için davranış tanımsız olabilir." bu kural çiğnenmiştir : USAböyle bir dize olması durumunda birinin geri dönmesine izin verir , bu nedenle sadece İtalyan bölgelerini kontrol etmeniz ve USAaksi takdirde geri dönmeniz gerekir .
'.

1
@boothby iyi, hayır, basit bir mantık: temelde sadece İtalyan bölgelerini eşleştirmek için sadece bir regexp istiyor, ama çok karmaşık bir şekilde gereksiz yere dile getirdi. Bütün gerçek soru soruların amerikan durumları hakkında noktası, tamamen bu hata sayesinde ilgili değildir. Bu aynı zamanda soruyu daha az ilginç hale getirir.
'.

Yanıtlar:


10

Perl - 51 36 bayt (regex için)

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

Özel bir şey yok, ancak gönderebilir, çünkü diğer 51 baytlık çözümden farklı.

Veya alternatif olarak, zaten kısa olan çözümümü 15 bayt kısaltın. Sanırım bu kazanıyor.


7

Perl, 40 karakter

Buna diğer yönden yaklaşmak, yani ABD devletlerini eşleştirmek:

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

Regexp'deki Perl / PCRE'ye özgü tek özellik, "Güney Carolina" ile eşleşmesi için dize sonu çapası \byerine kullandığım sınır kelimesidir $.

İşte Perl bir astarın içindeki regexp test için:

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

Bu daha çok golfçü bir test koşum takımı: perl -pe '$ _ = / re /? "ABD \ n": "İtalya \ n"'
Sahte

3
@ Sahte: meh. Skorda sayılmadığı sürece, okunabilir tutulması gerekebilir.
Ilmari Karonen

5

Yakut (düz regex), 44

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

Biliyor musun? Büyük / küçük harf duyarlılığı, en iyi sözcük başlangıcı çapasıdır.

Emin değilim, ama ben borçlusun paiçin Hax0r778 cevabı .


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")

Başlangıçta bunu ABD tarafından çözecektim, çünkü KWXY'yi ABD listesinden çıkarmak, bir çok devleti elinden alıyordu ... Ama İtalya bunu 17 karakterden en iyi şekilde aldı ...

Yağ ok gösterimi ile gidersek, bunu bir dönüş değişkeni olan basit bir fonksiyona indirgeyebiliriz.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.