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.
USA
im Falle eines solchen Strings zurückzukehren, daher müsste man nur die italienischen Regionen überprüfen und USA
andernfalls zurückkehren.