Regex Golf: Regiones de Italia vs. Estados de EE. UU.

23

Ya tenemos un problema de meta-regex-golf inspirado en el cómic xkcd

derechos de autor 2013 Randall Munroe

Pero, este golf regex también se ve divertido Quiero distinguir entre los estados de los EE. UU. Y las regiones de Italia. ¿Por qué? Soy ciudadano de ambos países y siempre tengo problemas con esto * .

Las regiones de Italia son

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

y los estados de los Estados Unidos son

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

Su trabajo es escribir un programa que distinga estas listas con una expresión regular. Este es un juego nuevo, así que aquí está el

Reglas

  • La distinción entre listas debe hacerse con una sola expresión regular coincidente.
  • Su puntaje es la longitud de esa expresión regular, más pequeño es mejor.

Para ser claros: todo el trabajo debe hacerse mediante la expresión regular: sin filtros, sin reemplazos, sin nada ... incluso si también se realizan con expresiones regulares. Es decir, la entrada debe pasar directamente a una expresión regular, y solo la respuesta binaria (coincidencia / no coincidencia) puede ser utilizada por partes posteriores del código. La entrada nunca debe ser inspeccionada o modificada por otra cosa que no sea la expresión coincidente. Excepción : comer una nueva línea con algo parecido a Ruby's chompestá bien.

Su programa debe tomar una sola entrada (opcionalmente seguida de \no EOFsi facilita las cosas) de cualquiera de las listas desde stdin e imprimir para stdout el nombre de esa lista. En este caso, nuestras listas se nombran Italyy USA.

Para probar su código, simplemente ejecute ambas listas a través de él. El comportamiento puede ser indefinido para cadenas que no aparecen en la lista.

Problemas de puntuación

Esto podría tener que hacerse idioma por idioma. En perl

m/foobarbaz/

es una expresión regular coincidente Sin embargo, en Python,

import re
re.compile('foobarbaz')

hace lo mismo No contaríamos las citas para Python, por lo que digo que no contamos el m/y final /en Perl. En ambos idiomas, lo anterior debería recibir una puntuación de 9.

Para aclarar un punto planteado por Abhijit , la longitud real de la expresión coincidente es la puntuación, incluso si la genera dinámicamente. Por ejemplo, si encontraste una expresión mágica m,

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

entonces no debe informar una puntuación de 12: mtiene una longitud 24. Y para ser más claro, la expresión regular generada no puede depender de la entrada. Eso sería leer la entrada antes de pasarla a la expresión regular.

Sesión de ejemplo

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

* En realidad, eso es mentira. Nunca he tenido ningún problema con esto en absoluto.

boothby
fuente
¿Puede explicar qué quiere decir con "sin filtro, sin reemplazos, sin nada ... incluso si también se hacen con expresiones regulares". Solo para aclarar, ¿significa filtrado, reemplazos de la lista de estados / regiones o el enfoque es más amplio?
Abhijit
@Abhijit editado. ¿Eso está más claro?
stand
3
@ Eliseod'Annunzio: DC no es un estado
Kyle Kanos
1
"El comportamiento puede ser indefinido para cadenas que no aparecen en la lista". esta regla se rompe : permite que uno regrese USAen caso de una cadena de este tipo, por lo tanto, solo tendría que verificar las regiones italianas y regresar de lo USAcontrario.
o0 '.
1
@boothby bueno, no, es una lógica simple: básicamente se trata solo de una expresión regular para que coincida con las regiones italianas, pero innecesariamente redactada de una manera muy complicada. El conjunto de puntos sobre los Estados Americanos no es totalmente relevante para la cuestión real preguntó, gracias a este error. Esto también hace que la pregunta sea mucho menos interesante.
o0 '.

Respuestas:

10

Perl - 51 36 bytes (para expresiones regulares)

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

Nada especial, pero también puede publicarlo, porque es diferente a otra solución de 51 bytes.

O, alternativamente, acortar mi solución ya corta en 15 bytes. Esto gana por ahora, creo.

Konrad Borowski
fuente
7

Perl, 40 caracteres

Acercarse a esto desde la otra dirección, es decir, coincidir con los estados de EE. UU .:

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

La única característica específica de Perl / PCRE en la expresión regular es el \bancla de límite de palabra, que utilicé en lugar del ancla de $fin de cadena para que coincida con "Carolina del Sur".

Aquí está la expresión regular en una línea Perl para pruebas:

perl -nE 'say /[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b/ ? "USA" : "Italy"'
Ilmari Karonen
fuente
Este es un arnés de prueba más golf: perl -pe '$ _ = / re /? "USA \ n": "Italy \ n"'
Seudónimo
3
@ Seudónimo: meh. Siempre que no cuente en el puntaje, también podría ser legible.
Ilmari Karonen
5

Rubí (expresión regular simple), 44

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

¿Sabes que? La distinción entre mayúsculas y minúsculas es el mejor ancla de inicio de palabra.

No estoy seguro, pero creo que se lo debo paa la respuesta de Hax0r778 .

John Dvorak
fuente
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");
Hax0r778
fuente
3

JavaScript 42

alert(/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(prompt())?"Italy":"USA")

Inicialmente iba a resolver esto desde el lado de EE. UU., Ya que la eliminación de KWXY de la lista de EE. UU. Despoja a muchos de los Estados ... Pero Italia lo superó con unos buenos 17 caracteres ...

Si vamos con la notación de flecha gruesa podemos reducir esto a una función simple con una variable de retorno.

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
WallyWest
fuente