No espírito deste xkcd
Escreva um programa que reproduza regex golf com pares arbitrários de listas. O programa deve pelo menos tentar encurtar a regex, um programa que apenas produza /^(item1|item2|item3|item4)$/
ou similar não é permitido.
A pontuação é baseada na capacidade de gerar o menor regex. As listas de testes são de candidatos presidenciais dos EUA bem-sucedidos e sem êxito, encontrados aqui (obrigado @ Peter). Obviamente, o programa deve funcionar para todas as listas disjuntas, portanto, basta retornar uma resposta para o presidente que não conta.
regular-expression
metagolf
Manishearth
fonte
fonte
/^item1|atem2|item3|item4$/
provavelmente tem precedência não intencional (a string deve começaritem1
, conteratem2
, conteritem3
ou terminar comitem4
).Respostas:
Perl (
111110122 caracteres)Isso usa o módulo CPAN chamado
Regexp::Assemble
para otimizar as expressões regulares. Porque qual é a melhor linguagem para expressões regulares do que Perl.Além disso, versão legível, apenas por diversão (feita com a ajuda de
-MO=Deparse
).Saída de amostra (fiz CTRL-D depois
item4
).Além disso, como bônus, estou escrevendo o regex para cada palavra da pergunta.
Além disso, lista de presidentes (262 bytes).
fonte
Não é a minha solução (obviamente não sou Peter Norvig!), Mas aqui está uma solução da pergunta (ligeiramente modificada), cortesia dele: http://nbviewer.ipython.org/url/norvig.com/ipython/xkcd1313.ipynb
o programa que ele dá é o seguinte (seu trabalho, não o meu):
onde vencedores e perdedores são as listas de vencedores e perdedores, respectivamente (ou duas listas, é claro), consulte o artigo para obter explicações detalhadas.
fonte
Minha solução escrita em Fator :
É o mesmo algoritmo que o de Norvig. Se prejudicar a legibilidade é o objetivo, provavelmente você poderá jogar fora muitos outros personagens.
fonte
Meu código não é muito sofisticado e condensado, mas você pode verificá-lo em https://github.com/amitayd/regexp-golf-coffeescript/ (ou especificamente o algoritmo em src / regexpGolf.coffee).
É baseado no algoritmo de Peter Norvig, com duas melhorias:
(E também jogou uma aleatoriedade opcional)
Para os conjuntos de vencedores / perdedores neste questionário, encontrei um regex de 76 caracteres usando-o:
Mais alguns detalhes no meu post sobre como portar o solucionador para coffeescript .
fonte