Explicación
La distancia de edición entre dos cadenas es una función del número mínimo posible de inserciones, eliminaciones o sustituciones para convertir una palabra en otra.
Las inserciones y eliminaciones cuestan 1 y las sustituciones cuestan 2.
Por ejemplo, la distancia entre AB
y A
es 1, porque las eliminaciones cuestan 1 y la única edición necesaria es la eliminación del B
carácter.
La distancia entre CAR
y FAR
es 2, porque las sustituciones cuestan 2. Otra forma de ver esto es una eliminación y una inserción.
Reglas
Dadas dos cadenas de entrada (proporcionadas, sin embargo, es conveniente en su idioma), su programa debe encontrar la distancia mínima de edición entre las dos cadenas.
Puede suponer que las cadenas solo contienen los caracteres A-Z
y tienen menos de 100 caracteres y más de 0 caracteres.
Este es el código de golf , por lo que gana la solución más corta.
Ejemplos de casos de prueba
ISLANDER, SLANDER
> 1
MART, KARMA
> 5
KITTEN, SITTING
> 5
INTENTION, EXECUTION
> 8
levenshtein
función integrada trata las sustituciones como una edición (sustituto), no dos (eliminar + insertar).Respuestas:
brainfuck, 2680
Usando programación dinámica, por supuesto.
Las cadenas de entrada deben estar separadas por un espacio y seguidas de una nueva línea. Por ejemplo:
fuente
Python, 138
148152caracteresOk, conocía el principio pero nunca antes había implementado la distancia de edición, así que aquí va:
fuente
PHP, 40
Sigue las reglas según lo establecido, pero no el espíritu de las reglas:
Toma sus dos parámetros como argumentos. Ejemplo de llamada:
php edit_dist.php word1 word2
.Normalmente
levenshtein()
considera una sustitución como una operación, pero tiene un formulario sobrecargado donde se pueden especificar los pesos de inserción / sub / eliminación. En este caso, es 1/2/1.fuente
APL (90 caracteres)
Estoy usando Dyalog APL como mi intérprete, con
⎕IO
set a 1 y⎕ML
set a 0. La función directa ({ ... }
) calcula, dada una fila como entrada, la siguiente fila en la matriz de distancia. (Se inicia con la fila inicial:.0,⍳x
) El operador de potencia (⍣
) se usa para anidar la función una vez para cada carácter en la segunda cadena (⊃⍴b
). Después de todo eso, la fila final se invierte (⌽
), y se toma su primer elemento (⊃
).Ejemplo:
fuente
R 51
Esto se lee en dos líneas del usuario (que son la entrada) y luego solo usa la
adist
función para calcular la distancia. Dado que las sustituciones cuestan 2 para este problema, necesitamos agregar un vector con nombre para el parámetro de costos para adist. Como también hay un parámetro de recuento para adist, solo podemos acortar los costos a cos, por lo que todavía tenemos una coincidencia única para los nombres de los parámetros.Ejemplo de uso
fuente
Ruby 1.9, 124
Versión de golf del lento y recursivo método de Ruby aquí , modificado para duplicar el peso de las sustituciones. El hecho de que se necesitan 7 caracteres para eliminar el primer carácter de una cadena realmente duele, y sería genial reemplazarlo
(a[0]==b[0]?-1:1)
por algo así,-1**a[0]<=>b[0]
pero el orden de las operaciones no es mi amigo.fuente
Smalltalk (Smalltalk / X), 34
Tengo suerte: la clase estándar "String" ya contiene levenshtein:
entrada a, b:
(los parámetros adicionales permiten diferentes pesos en la sustitución, eliminación, etc.)
Prueba de funcionamiento:
->
fuente