Regex Golf: Regioni d'Italia contro Stati degli Stati Uniti


23

Abbiamo già un problema con il meta-regex-golf ispirato al fumetto di xkcd

copyright 2013 Randall Munroe

Ma anche questo golf regex sembra divertente! Voglio distinguere tra gli stati degli Stati Uniti e le regioni d'Italia. Perché? Sono cittadino di entrambi i paesi e ho sempre problemi con questo * .

Le regioni d'Italia sono

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

e gli stati degli Stati Uniti lo sono

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

Il tuo compito è scrivere un programma che distingua questi elenchi con un'espressione regolare. Questo è un nuovo gioco, quindi ecco il

Regole

  • La distinzione tra liste deve essere fatta con una singola espressione regolare corrispondente.
  • Il tuo punteggio è la lunghezza di quell'espressione regolare, più piccolo è meglio.

Per essere chiari: tutto il lavoro deve essere fatto dall'espressione regolare - nessun filtro, nessun rimpiazzo, niente di niente ... anche se quelli sono fatti anche con espressioni regolari. Cioè, l'input deve essere passato direttamente in un'espressione regolare e solo le risposte binarie (match / no match) possono essere utilizzate da parti successive del codice. L'input non deve mai essere ispezionato o modificato da nient'altro che dall'espressione corrispondente. Eccezione : mangiare una newline con qualcosa di simile a Ruby chompva bene.

Il tuo programma dovrebbe prendere una sola voce (facoltativamente seguita da \no EOFse rende le cose più facili) da entrambi gli elenchi di stdin e stampare su stdout il nome di quell'elenco. In questo caso, i nostri elenchi sono denominati Italye USA.

Per testare il tuo codice, esegui semplicemente entrambi gli elenchi. Il comportamento potrebbe non essere definito per le stringhe che non si verificano nell'elenco.

Problemi di punteggio

Questo potrebbe essere fatto su una base lingua per lingua. In Perl,

m/foobarbaz/

è un'espressione regolare corrispondente. Tuttavia, in Python,

import re
re.compile('foobarbaz')

fa la stessa cosa. Non contiamo le virgolette per Python, quindi dico che non contiamo il m/e il finale /in Perl. In entrambe le lingue, quanto sopra dovrebbe ricevere un punteggio di 9.

Per chiarire un punto sollevato da Abhijit , la lunghezza effettiva dell'espressione corrispondente è il punteggio, anche se lo si genera dinamicamente. Ad esempio, se hai trovato un'espressione magica m,

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

quindi non dovresti riportare un punteggio di 12: mha lunghezza 24. E solo per essere più chiaro, l'espressione regolare generata non può dipendere dall'input. Quello sarebbe leggere l'input prima di passarlo nell'espressione regolare.

Sessione di esempio

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

* In realtà, è una bugia. Non ho mai avuto problemi con questo.


Puoi spiegare cosa intendi con "nessun filtro, nessuna sostituzione, niente di niente ... anche se anche quelli sono fatti con espressioni regolari". Giusto per chiarire, significa filtraggio, sostituzioni dell'elenco di stati / regioni o l'attenzione è più ampia?
Abhijit,

@Abhijit modificato. È più chiaro?
stand dal

3
@ Eliseod'Annunzio: DC è non uno stato
Kyle Kanos

1
"Il comportamento potrebbe non essere definito per le stringhe che non si verificano nell'elenco." questa regola è infranta : consente di tornare USAin caso di tale stringa, quindi dovresti solo controllare le regioni italiane e restituireUSA altrimenti.
o0 '.

1
@boothby bene, no, è una logica semplice: in pratica sta solo chiedendo una regexp per abbinare le regioni italiane, ma inutilmente formulato in un modo molto complicato. L' intero punto sugli stati americani non è del tutto rilevante per la vera domanda posta, grazie a questo bug. Questo rende anche la domanda molto meno interessante.
o0 '.

Risposte:


10

Perl - 51 36 byte (per regex)

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

Niente di speciale, ma può anche pubblicarlo, perché è diverso dalle altre soluzioni da 51 byte.

O in alternativa, accorcia la mia soluzione già breve di 15 byte. Questo vince per ora, penso.


7

Perl, 40 caratteri

Avvicinarsi a questo dall'altra direzione, cioè abbinando gli stati USA:

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

L'unica caratteristica specifica di Perl / PCRE in regexp è la \b parola anchor boundary, che ho usato al posto $dell'ancoraggio end-of-string per far corrispondere "South Carolina".

Ecco la regexp in un one-liner Perl per i test:

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

Si tratta di un'imbracatura di prova più da golf: perl -pe '$ _ = / re /? "USA \ n": "Italy \ n"'
Pseudonimo

3
@Pseudonimo: meh. Finché non conta nel punteggio, potrebbe anche mantenerlo leggibile.
Ilmari Karonen,

5

Ruby (regex normale), 44

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

Sai cosa? La distinzione tra maiuscole e minuscole è il miglior ancoraggio di inizio parola.

Non ne sono sicuro, ma penso di essere in debito pacon la risposta di 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")

Inizialmente stavo per risolverlo dalla parte degli Stati Uniti, poiché l'eliminazione di KWXY dalla lista degli Stati Uniti toglieva molti Stati Uniti ... Ma l'Italia aveva avuto la meglio su ben 17 personaggi ...

Se andiamo con la notazione della freccia grassa, possiamo ridurla a una semplice funzione con una variabile di ritorno.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.