Esto se inspiró en una pregunta CS.SE ahora eliminada .
Tarea
Dadas dos cadenas de entrada no vacías A y B, genera la distancia más pequeña de A a un palíndromo que contiene B como una subcadena. La distancia se define por el número de reemplazos de caracteres ( distancia de Hamming ).
Restricciones
- Entrada sensible: existe un palíndromo. Esto significa | A | ≥ | B |.
- A y B contienen solo caracteres ASCII inferiores, las minúsculas y mayúsculas son distintas (al igual que todos los demás caracteres).
- Si su idioma no puede tratar con caracteres ASCII, también puede usar números enteros (o algún otro tipo de datos razonable), y puede elegir limitar el rango a 128 elementos.
- Puede recibir información de stdin, argumentos de función, argumentos de línea de comando, etc.
- Puede dar el resultado en stdout, valor de retorno, etc.
- No necesita dar un palíndromo que funcione, la distancia más pequeña a uno es suficiente.
Ejemplos
A B Output
thilloaoyreot hello 4 (thelloaolleht)
benjonson stack 9 (stackcats)
neversaynever! odd 9 (neveroddoreven)
ppcggcpp gg 0 (ppcggcpp)
stars tat 1 (stats)
Puntuación
Este es el código de golf, el código más corto en bytes gana.
code-golf
string
palindrome
Comunidad
fuente
fuente
Pyth, 45 bytes
Pruébalo en línea. Banco de pruebas.
Todavía no estoy exactamente satisfecho con cómo resultó esto. Pero al menos es bastante difícil de entender sin una explicación ahora. (¿Éxito, supongo?)
Explicación
Q
y B comoz
.m
…_BQ
Calcule lo siguiente para A y su reverso comod
:m
…h-ldlz
Calcule lo siguiente para todosk
desde 0 hastalen(A) - len(B)
inclusive:+Bklz
Consigue el park, k + len(B)
.cd
Divididod
en esos índices.X
...1z
Reemplace la segunda parte (del medio) con B.Ks
Concatenar las piezas y guardar enK
. B ahora se inserta en la posiciónk
en A o en su reverso.hc2
Divide la cuerda resultante en dos y mantén la primera pieza. Esto le da a la mitad de la cadena el posible carácter del medio.hc2PK
Elimina el último personaje y haz la misma división, manteniendo la primera pieza. Esto le da la mitad de la cadena sin el posible carácter del medio.+
…_
Agregue el reverso de la pieza más corta a la pieza más larga. Ahora tenemos un palíndromo.s
Concatenar los resultados para A y su reverso.f}zT
Elimine todas las cadenas que no contengan B.m
Calcule lo siguiente para todas las cadenas resultantesd
:nVQd
Obtenga la desigualdad por pares con A. Esto da verdadero para los pares que necesitan ser cambiados.s
Suma la lista. Esto le da a Hamming la distancia.hS
Toma el resultado mínimo.fuente
JavaScript (Firefox 30+),
152146 bytesEnfoque de fuerza bruta: genere cada posible superposición de A y B, convierta cada uno en un palíndromo, calcule las distancias de Hamming desde A y tome la menor de las distancias resultantes.
Probablemente podría jugar al golf un poco más ...
Fragmento de prueba
Mostrar fragmento de código
fuente