Explicação
A distância de edição entre duas cadeias é uma função do número mínimo possível de inserções, exclusões ou substituições para converter uma palavra em outra palavra.
Inserções e exclusões custam 1 e substituições custam 2.
Por exemplo, a distância entre AB
e A
é 1, porque as exclusões custam 1 e a única edição necessária é a exclusão do B
caractere.
A distância entre CAR
e FAR
é 2, porque as substituições custam 2. Outra maneira de ver isso é uma exclusão e uma inserção.
Regras
Dadas duas seqüências de entrada (fornecidas no entanto, é conveniente no seu idioma), seu programa deve encontrar a distância mínima de edição entre as duas seqüências.
Você pode assumir que as seqüências contêm apenas os caracteres A-Z
e têm menos de 100 caracteres e mais de 0 caracteres.
Isso é código de golfe , então a solução mais curta vence.
Casos de teste de amostra
ISLANDER, SLANDER
> 1
MART, KARMA
> 5
KITTEN, SITTING
> 5
INTENTION, EXECUTION
> 8
levenshtein
função incorporada trata as substituições como uma edição (substituto), não duas (excluir + inserir).Respostas:
brainfuck, 2680
Usando programação dinâmica, é claro.
As seqüências de entrada devem ser separadas por um espaço e seguidas por uma nova linha. Por exemplo:
fonte
Python, 138
148152caracteresOk, eu conhecia o princípio, mas nunca havia implementado a distância de edição antes, então aqui vai:
fonte
PHP, 40
Segue as regras conforme indicado, mas não o espírito das regras:
São dois parâmetros como argumentos. Exemplo chamando:
php edit_dist.php word1 word2
.Normalmente
levenshtein()
considera uma substituição como uma operação, mas possui uma forma sobrecarregada na qual os pesos de inserção / sub / exclusão podem ser especificados. Nesse caso, é 1/2/1.fonte
APL (90 caracteres)
Estou usando o Dyalog APL como meu intérprete, com
⎕IO
definido como 1 e⎕ML
definido como 0. A função direta ({ ... }
) calcula, dada uma linha como entrada, a próxima linha na matriz de distância. (É iniciado com a linha inicial:.0,⍳x
) O operador de energia (⍣
) é usado para aninhar a função uma vez para cada caractere na segunda sequência (⊃⍴b
). Depois de tudo isso, a linha final é invertida (⌽
) e seu primeiro elemento é obtido (⊃
).Exemplo:
fonte
R 51
Isso lê em duas linhas do usuário (que são a entrada) e, em seguida, apenas usa a
adist
função para calcular a distância. Como as substituições custam 2 para esse problema, precisamos adicionar um vetor nomeado para o parâmetro de custos para o adist. Como também há um parâmetro de contagem para o adist, só podemos reduzir os custos para cos, portanto ainda temos uma correspondência exclusiva para os nomes dos parâmetros.Exemplo de uso
fonte
Rubi 1.9, 124
Versão em golfe do método Ruby lento e recursivo aqui , modificado para dobrar o peso de substituições. O fato de que são necessários 7 caracteres para remover o primeiro caractere de uma string realmente dói, e seria legal substituir
(a[0]==b[0]?-1:1)
por algo como,-1**a[0]<=>b[0]
mas a ordem das operações não é minha amiga.fonte
Smalltalk (Smalltalk / X), 34
Tenho sorte - a classe "String" padrão já contém levenshtein:
entrada a, b:
(os parâmetros adicionais permitem pesos diferentes na substituição, exclusão etc.)
Execução de teste:
->
fonte