¡Hoy harás otro desafío de palíndromo!
Entonces, su tarea hoy es tomar una cadena y determinar la cantidad mínima de letras necesarias para insertar para convertirlo en un palíndromo.
Por ejemplo, tomemos la cadena fishes
.
En este caso, la mejor manera sería agregar h if
, por lo que el resultado sería 3.
fishe s
h if
---------
fishehsif
Ahora intentemos con codegolf
. Como hay una repetición o
, solo podemos hacer:
codeg o lf
fl ed c
-------------
flcodegedoclf
para obtener un resultado de 5.
Casos de prueba
ppcg -> 2
codegolf -> 5
palindrome -> 9
stackexchange -> 8
programmingpuzzlesandcodegolf -> 20
code-golf
string
palindrome
Oliver Ni
fuente
fuente
ppcg
, la puntuación es 4 + 2 = 6)Respuestas:
Pyth, 10 bytes
Banco de pruebas.
Hay algunas caracterizaciones equivalentes del valor que buscamos:
La idea común es el "esqueleto" de letras en la entrada que coinciden con las letras de la entrada en el producto final.
Este esqueleto es siempre un palíndromo, con letras que coinciden con sus contrapartes invertidas. Cada letra no esqueleto no tiene comparación y debe tener su contraparte insertada.
Una alternativa de la misma longitud utiliza la cuarta condición, la longitud de la entrada menos la longitud de su subsecuencia palindrómica más larga
Enlace a la suite de prueba.
La parte que es diferente es
Para ambos, en lugar de eliminar la subsecuencia palindrómica de la entrada y tomar la longitud, podríamos restar su longitud de la longitud de la entrada. Cualquiera de los dos costos: 4 bytes
-lQl
vsl.-Q
.fuente
Python, 112 bytes
Muy ineficiente
Pruébalo en línea! Tienes que esperar un minuto hasta que termine el último caso.
Llame con
e(<string>, 0, <length of string - 1>)
, como e ("peces", 0, 5) `.Ungolfed (más o menos) con explicación:
fuente
l=0
.05AB1E , 11 bytes
Utiliza la codificación CP-1252 .
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
Brachylog , 9 bytes
Pruébalo en línea!
Este desafío realmente necesitaba una respuesta Brachylog v2, ya que la inserción de palindromización es muy intuitiva en ese idioma.
Explicación
⊆P↔P
realmente es lo que hace la palindromización por inserción (ver este ejemplo )fuente
C,
89121 bytesPuerto descarado de la respuesta de Oliver , no podía pensar en una solución más corta.
g
llamaf
con el puntero al primer y último carácter de una cadena (el último carácter es parte de la cadena, no el'\0'
). Se vuelve aún más ineficiente porquef
se llama dos veces para elmin
caso.Sin golf:
Uso:
fuente
Brachylog v1 , 13 bytes
Pruébalo en línea!
Puede verificar los palíndromos que encuentra con este código .
Explicación
Casi me sorprende que esto incluso funcione, al ver lo ridículamente simple que es.
Esto está garantizado para encontrar el palíndromo más pequeño porque
IrI
generará cadenas de longitud creciente al retroceder, comenzando desde la cadena vacía.Esto no es lo suficientemente eficiente como para calcular el último caso de prueba en TIO, debido al uso de
s - Ordered subset
.fuente
Lote,
234232 bytesFunciona intentando recursivamente insertar caracteres no coincidentes en ambos extremos, muy lento (no probé el último caso de prueba). Los límites de recursión significan que esto solo funciona para una longitud de cadena limitada de todos modos, por lo que
99
es algo arbitrario. Tengo que usarcall
parámetros como variables locales, ya que no pudesetlocal
trabajar para mí, lo que significa que el%1
parámetro de la:l
subrutina es una expresión que evalúa el número de inserciones realizadas hasta ahora.fuente