Implemente uma função de padrão e sequência a serem correspondidas; retorne true se o padrão corresponder à sequência inteira, caso contrário, false.
Nossa sintaxe de padrão glob é:
?
corresponde a qualquer caractere+
corresponde a um ou mais caracteres*
corresponde a zero ou mais caracteres\
escapa
Regras:
- Sem avaliação, sem conversão em expressão regular, sem chamar uma função global do sistema.
- E / S não são necessárias: você pode simplesmente escrever uma função
- Vitórias mais curtas
Exemplos:
glob('abc', 'abc') => true
glob('abc', 'abcdef') => false IMPORTANT!
glob('a??', 'aww') => true
glob('a*b', 'ab') => true
glob('a*b', 'agwijgwbgioeb') => true
glob('a*?', 'a') => false
glob('?*', 'def') => true
glob('5+', '5ggggg') => true
glob('+', '') => false
glob('a\*b', 'a*b') => true
Aqui está uma dica para começar: http://en.wikipedia.org/wiki/Backtracking
code-golf
interpreter
regular-expression
Ming-Tang
fonte
fonte
Respostas:
Golfscript - 82 caracteres
Assume que não há novas linhas nas seqüências de caracteres. Retorna uma matriz vazia para false e uma matriz não vazia para true (consistente com a definição golfscript de true / false).
Esta é uma solução não recursiva (exceto por
*
s consecutivos ), que mantém uma lista das posições na cadeia de padrãoi
quepattern[0..i]
correspondestring[0..cur]
.Isso pode funcionar por um período muito longo. Você pode adicionar
.&
depois:C%
para evitar isso.fonte
Haskell, 141 caracteres
Funciona para todas as entradas, padrões e seqüências de caracteres. Manipula barra invertida no padrão como uma correspondência literal (o comportamento não foi especificado.)
Isso pode ser executado com o seguinte driver de teste:
Atualização: escrevi uma postagem no blog sobre essa resposta em particular, pois acho que mostra bem como Haskell codifica o problema com tanta facilidade.
d
em
por operadoresr
emc
+
caso%
, que foi tratada por&
fonte
PHP -
275243 caracteresUngolfed:
fonte
Python excessivamente verboso (
384367 caracteres)Não é o mais curto, mas é agradável e funcional. A coisa de ditado de despacho no meio poderia presumivelmente ser reescrita como uma disjunção sobre as
(h(p) == '?') and (? lambda body)
coisas de tipo. Definir esse operador h me custa alguns caracteres sem nenhum benefício, mas é bom ter uma palavra-chave para head.Eu gostaria de ter uma rachadura no script de golfe mais tarde, se o tempo permitir.
edit: removido terceiro ramo desnecessário no caso '*' depois de ler a resposta ruby do user300
fonte
Shorter Snappier Python 2.6 (272 caracteres)
golfed:
ungolfed:
apresentando:
agradeça à resposta do user300 por ilustrar como as coisas são simplificadas se você pode obter algum tipo de valor de terminador ao tirar a cabeça de uma string vazia.
gostaria que a descompactação da cabeça / cauda pudesse ser executada em linha durante a declaração dos argumentos de m. então m poderia ser um lambda, assim como seus amigos ne glob. python2 não pode fazer isso e, após algumas leituras, parece que python3 também não pode. ai.
teste:
fonte
Ruby -
199171Ungolfed:
Testes:
Inspirado pela resposta dos roobs
fonte
lambda s : list(s)+[None]
??
caracteres são literais,=>
são separadores de chave / valor no Ruby Hashes e->
iniciam um lambda :-) ({ ?? => ->{...} }
é um hash com chave"?"
e um lambda como valor). :-)Função C - 178 caracteres necessários
Compilado com o GCC, isso não produz avisos.
A primeira e a última linha não estão incluídas na contagem de caracteres. Eles são fornecidos apenas por conveniência.
Explodir:
fonte
JavaScript - 259 caracteres
Minha implementação é muito recursiva; portanto, a pilha transbordará se um padrão extremamente longo for usado. Ignorando o sinal de mais (que eu poderia ter otimizado, mas optou por não simplificar), um nível de recursão é usado para cada token.
Às vezes, a função retorna um número em vez de um booleano. Se isso for um problema, você pode usá-lo como
!!glob(pattern, str)
.Ungolfed (unminified, em vez disso) para servir como um recurso útil:
Observe que a indexação em caracteres de uma sequência de caracteres como para elementos de matriz não faz parte do padrão de linguagem mais antigo (ECMAScript 3), portanto, pode não funcionar em navegadores mais antigos.
fonte
Python (454 caracteres)
fonte
D: 363 caracteres
Mais legivelmente:
fonte
golfscript
é construído a partir de funções que consomem dois argumentos da pilha, se ep, e produzem um único valor de retorno booleano. há um pouco de confusão para torná-lo compatível com os operadores preguiçosos e preguiçosos. Eu realmente duvido que essa abordagem esteja perto do ideal, ou mesmo na direção certa.
há também alguns momentos divertidos e estúpidos, como destacar um
'*'
padrão, consumir o'*'
em uma comparação, apenas para perceber que o ramo subsequente não corresponde. para descer pelo outro ramo, precisamos do padrão com o'*'
na frente, mas consumimos esse padrão original quando acionamos o botão'*'
e consumimos o'*'
, de modo a obter o padrão novamente, carregamos uma nova e brilhante corda constante'*'
e coloque-o no lugar. fica ainda mais feio porque, por algum motivo, a correspondência de caracteres precisa ser feita com valores ascii, mas o pré-retorno à string precisa de strings.menos golfscript golfed
testes
fonte
C # (251 caracteres)
Um pouco mais legível:
† Eu sei, eu sei ... exceto pelos globs que contêm a barra invertida. O que é realmente lamentável. Caso contrário, teria sido realmente inteligente. :(
fonte