Regex Golf: Regionen Italiens gegen Staaten der USA


23

Wir haben bereits ein Meta-Regex-Golf-Problem , das vom xkcd-Comic inspiriert ist

Copyright 2013 Randall Munroe

Aber dieser Regex-Golf macht auch Spaß! Ich möchte zwischen den Bundesstaaten der USA und den Regionen Italiens unterscheiden. Warum? Ich bin Staatsbürger beider Länder und habe immer Probleme damit * .

Die Regionen von Italien sind

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

und die Staaten der USA sind

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

Ihre Aufgabe ist es, ein Programm zu schreiben, das diese Listen durch einen regulären Ausdruck unterscheidet. Das ist ein neues Spiel, also hier ist das

Regeln

  • Die Unterscheidung zwischen Listen muss mit einem einzelnen übereinstimmenden regulären Ausdruck erfolgen.
  • Ihre Punktzahl ist die Länge dieses regulären Ausdrucks, kleiner ist besser.

Um es klar auszudrücken: Alle Arbeiten müssen mit dem regulären Ausdruck ausgeführt werden - keine Filterung, keine Ersetzungen, kein Nichts ... auch wenn diese ebenfalls mit regulären Ausdrücken ausgeführt werden. Das heißt, die Eingabe sollte direkt an einen regulären Ausdruck übergeben werden, und nur die binäre Antwort (Übereinstimmung / keine Übereinstimmung) kann von späteren Teilen des Codes verwendet werden. Die Eingabe sollte niemals von etwas anderem als dem übereinstimmenden Ausdruck überprüft oder geändert werden. Ausnahme : Eine Newline mit etwas ähnlichem wie Ruby zu essen chompist in Ordnung.

Ihr Programm sollte einen einzelnen Eintrag (optional gefolgt von \noder EOFwenn es die Sache einfacher macht) aus einer der beiden Listen von stdin übernehmen und den Namen dieser Liste in stdout ausgeben. In diesem Fall heißen unsere Listen Italyund USA.

Um Ihren Code zu testen, führen Sie einfach beide Listen durch. Für Zeichenfolgen, die nicht in der Liste enthalten sind, kann das Verhalten undefiniert sein.

Scoring-Probleme

Dies muss möglicherweise sprachweise erfolgen. In Perl

m/foobarbaz/

ist ein passender regulärer Ausdruck. In Python jedoch

import re
re.compile('foobarbaz')

macht das gleiche. Wir würden die Anführungszeichen für Python nicht zählen, also sage ich, wir zählen das m/und das Finale /in Perl nicht. In beiden Sprachen sollte das oben genannte eine Punktzahl von 9 erhalten.

Um einen von Abhijit angesprochenen Punkt zu verdeutlichen , ist die tatsächliche Länge des übereinstimmenden Ausdrucks die Punktzahl, auch wenn Sie sie dynamisch generieren. Wenn Sie zum Beispiel einen magischen Ausdruck gefunden haben m,

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

dann sollten Sie keine Punktzahl von 12 mangeben : Hat die Länge 24. Und um es noch deutlicher zu machen, der generierte reguläre Ausdruck kann nicht von der Eingabe abhängen. Das wäre, die Eingabe zu lesen, bevor sie an den regulären Ausdruck übergeben wird.

Beispielsitzung

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

* Eigentlich ist das eine Lüge. Ich hatte noch nie Probleme damit.


Können Sie bitte erklären, was Sie unter "keine Filterung, kein Ersetzen, kein Nichts ... auch wenn diese auch mit regulären Ausdrücken erfolgen" verstehen. Nur zur Verdeutlichung: Bedeutet dies, dass die Liste der Bundesstaaten / Regionen gefiltert oder ersetzt wird oder dass der Schwerpunkt weiter gefasst wird?
Abhijit

@Abhijit bearbeitet. Ist das klarer?
Stand

3
@ Eliseod'Annunzio: DC ist kein Staat
Kyle Kanos

1
"Für Zeichenfolgen, die nicht in der Liste enthalten sind, kann das Verhalten undefiniert sein." Diese Regel ist gebrochen : Es erlaubt einem, USAim Falle eines solchen Strings zurückzukehren, daher müsste man nur die italienischen Regionen überprüfen und USAandernfalls zurückkehren.
o0 '.

1
@boothby Nun, nein, es ist eine einfache Logik: Grundsätzlich wird nur ein regulärer Ausdruck angefordert, um den italienischen Regionen zu entsprechen, der jedoch unnötig kompliziert formuliert ist. Der ganze Punkt über amerikanische Staaten ist für die tatsächlich gestellte Frage aufgrund dieses Fehlers überhaupt nicht relevant. Dies macht die Frage auch viel weniger interessant.
o0 '.

Antworten:


10

Perl - 51 36 Bytes (für Regex)

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

Nichts besonderes, kann aber genauso gut posten, da es sich von anderen 51-Byte-Lösungen unterscheidet.

Oder kürzen Sie meine ohnehin kurze Lösung um 15 Byte. Das gewinnt vorerst, denke ich.


7

Perl, 40 Zeichen

Annäherung aus der anderen Richtung, dh passend zu den US-Bundesstaaten:

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

Die einzige Perl / PCRE-spezifische Funktion in regulären Ausdrücken ist der Wortbegrenzungsanker \b, den ich anstelle des $Ende-der-Zeichenfolge-Ankers verwendet habe, damit er mit "South Carolina" übereinstimmt.

Hier ist der reguläre Ausdruck in einem Perl-Einzeiler zum Testen:

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

Dies ist ein Golf-Testgeschirr: perl -pe '$ _ = / re /? "USA \ n": "Italien \ n"'
Pseudonym

3
@Pseudonym: meh. Solange es nicht in der Partitur zählt, sollte es auch lesbar bleiben.
Ilmari Karonen

5

Rubin (normaler Regex), 44

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

Weißt du was? Groß- und Kleinschreibung ist der beste Anfang des Wortes.

Ich bin nicht sicher, aber ich glaube, ich schulde die Antwortpa von Hax0r778 .


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

Ich wollte dies zunächst von der US-Seite herausarbeiten, da die Eliminierung von KWXY von der US-Liste einen Großteil der Staaten entfernt hatte ... Aber Italien hatte es mit gut 17 Charakteren geschafft ...

Wenn wir uns für die Fettpfeilnotation entscheiden, können wir dies auf eine einfache Funktion mit einer Rückgabevariablen reduzieren.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.