Já temos um problema de meta-regex-golf inspirado nos quadrinhos xkcd
Mas esse regex golf também parece divertido! Eu quero distinguir entre os estados dos EUA e as regiões da Itália. Por quê? Sou cidadão dos dois países e sempre tenho problemas com isso * .
As regiões da Itália são
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 os estados dos EUA são
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
Seu trabalho é escrever um programa que distinga essas listas com uma expressão regular. Este é um novo jogo, então aqui está o
Regras
- A distinção entre listas deve ser feita com uma única expressão regular correspondente.
- Sua pontuação é o tamanho dessa expressão regular, quanto menor, melhor.
Para ficar claro: todo o trabalho deve ser feito pela expressão regular - sem filtragem, sem substituições, sem nada ... mesmo que também sejam feitos com expressões regulares. Ou seja, a entrada deve ser passada diretamente para uma expressão regular e apenas a resposta binária (correspondência / não correspondência) pode ser usada por partes posteriores do código. A entrada nunca deve ser inspecionada ou alterada por nada além da expressão correspondente. Exceção : comer uma nova linha com algo parecido com Ruby chomp
é bom.
Seu programa deve pegar uma única entrada (opcionalmente seguida por, \n
ou EOF
se facilitar as coisas) de uma das listas do stdin e imprimir para mostrar o nome dessa lista. Nesse caso, nossas listas são nomeadas Italy
e USA
.
Para testar seu código, basta executar as duas listas nele. O comportamento pode ser indefinido para seqüências de caracteres que não ocorrem na lista.
Problemas de pontuação
Isso pode ter que ser feito idioma por idioma. No Perl,
m/foobarbaz/
é uma expressão regular correspondente. No entanto, em Python,
import re
re.compile('foobarbaz')
faz a mesma coisa. Não contaríamos as aspas para Python, por isso digo que não contamos o m/
final e o /
Perl. Nos dois idiomas, o acima deve receber uma pontuação de 9.
Para esclarecer um ponto levantado por Abhijit , o comprimento real da expressão correspondente é a pontuação, mesmo se você a gerar dinamicamente. Por exemplo, se você encontrou uma expressão mágica m
,
n="foo(bar|baz)"
m=n+n
então você não deve relatar uma pontuação 12: m
tem comprimento 24. E, para ser mais claro, a expressão regular gerada não pode depender da entrada. Isso seria ler a entrada antes de passá-la para a expressão regular.
Sessão de exemplo
input> Calabria
Italy
input> New Hampshire
USA
input> Washington
USA
input> Puglia
Italy
* Na verdade, isso é mentira. Eu nunca tive nenhum problema com isso.
USA
no caso de uma string desse tipo; portanto, você só precisa verificar as regiões italianas e retornar USA
caso contrário.