Wir haben bereits ein Meta-Regex-Golf-Problem , das vom xkcd-Comic inspiriert ist
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 chomp
ist in Ordnung.
Ihr Programm sollte einen einzelnen Eintrag (optional gefolgt von \n
oder EOF
wenn 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 Italy
und 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 m
angeben : 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.
quelle
USA
im Falle eines solchen Strings zurückzukehren, daher müsste man nur die italienischen Regionen überprüfen undUSA
andernfalls zurückkehren.Antworten:
Perl -
5136 Bytes (für Regex)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.
quelle
Perl, 40 Zeichen
Annäherung aus der anderen Richtung, dh passend zu den US-Bundesstaaten:
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:
quelle
Rubin (normaler Regex), 44
Weißt du was? Groß- und Kleinschreibung ist der beste Anfang des Wortes.
Ich bin nicht sicher, aber ich glaube, ich schulde die Antwort
pa
von Hax0r778 .quelle
Perl - 51
quelle
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"
quelle