Regex Golf: Regiões da Itália vs. Estados dos EUA


23

Já temos um problema de meta-regex-golf inspirado nos quadrinhos xkcd

direitos autorais 2013 Randall Munroe

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, \nou EOFse facilitar as coisas) de uma das listas do stdin e imprimir para mostrar o nome dessa lista. Nesse caso, nossas listas são nomeadas Italye 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: mtem 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.


Você pode, por favor, explicar o que você quer dizer com "sem filtragem, sem substituições, sem nada ... mesmo que isso também seja feito com expressões regulares". Só para esclarecer, isso significa filtragem, substituição da lista de estados / regiões ou o foco é mais amplo?
Abhijit

@Abhijit editada. Isso é mais claro?
usar o seguinte comando

3
@ Eliseod'Annunzio: DC é não um estado
Kyle Kanos

1
"O comportamento pode ser indefinido para seqüências de caracteres que não ocorrem na lista." esta regra está quebrada : ela permite retornar USAno caso de uma string desse tipo; portanto, você só precisa verificar as regiões italianas e retornar USAcaso contrário.
o0 '.

1
@boothby bem, não, é uma lógica simples: é basicamente pedir apenas que um regexp corresponda às regiões italianas, mas desnecessariamente redigido de uma maneira muito complicada. A questão toda sobre os estados americanos não é totalmente relevante para a pergunta real, graças a esse bug. Isso também torna a questão muito menos interessante.
o0 '.

Respostas:


10

Perl - 51 36 bytes (para regex)

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

Nada de especial, mas também pode publicá-lo, porque é diferente de outras soluções de 51 bytes.

Ou, como alternativa, reduza minha solução já curta em 15 bytes. Isso ganha por enquanto, eu acho.


7

Perl, 40 caracteres

Abordando isso de outra direção, ou seja, coincidindo com os estados dos EUA:

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

O único recurso específico do Perl / PCRE no regexp é a \bâncora de limite de palavras, que eu usei em vez da âncora de $fim de cadeia para deixá-la corresponder à "Carolina do Sul".

Aqui está o regexp em um liner Perl para teste:

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

Este é um equipamento de teste mais eficiente: perl -pe '$ _ = / re /? "USA \ n": "Itália \ n"'
Pseudônimo

3
@Pseudônimo: meh. Contanto que não conte na pontuação, é melhor mantê-lo legível.
Ilmari Karonen

5

Ruby (regex simples), 44

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

Você sabe o que? A distinção entre maiúsculas e minúsculas é a melhor âncora no início da palavra.

Eu não tenho certeza, mas acho que devo o papara a resposta de 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")

Inicialmente, eu resolvia isso do lado dos EUA, já que eliminar o KWXY da lista dos EUA afasta muitos Estados ... Mas a Itália superou com bons 17 caracteres ...

Se usarmos a notação de seta gorda, podemos reduzir isso para uma função simples com uma variável 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.