Ya tenemos un problema de meta-regex-golf inspirado en el cómic xkcd
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 chomp
está bien.
Su programa debe tomar una sola entrada (opcionalmente seguida de \n
o EOF
si 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 Italy
y 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: m
tiene 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.
fuente
USA
en caso de una cadena de este tipo, por lo tanto, solo tendría que verificar las regiones italianas y regresar de loUSA
contrario.Respuestas:
Perl -
5136 bytes (para expresiones regulares)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.
fuente
Perl, 40 caracteres
Acercarse a esto desde la otra dirección, es decir, coincidir con los estados de EE. UU .:
La única característica específica de Perl / PCRE en la expresión regular es el
\b
ancla 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:
fuente
Rubí (expresión regular simple), 44
¿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
pa
a la respuesta de Hax0r778 .fuente
Perl - 51
fuente
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"
fuente