Introducción
Para los que no saben, un palíndromo es cuando una cadena es igual a la cadena al revés (con excepción de la interpunción, espacios, etc.). Un ejemplo de palíndromo es:
abcdcba
Si revierte esto, terminará con:
abcdcba
Que es lo mismo. Por lo tanto, llamamos a esto un palíndromo. Para palindromizar cosas, echemos un vistazo a un ejemplo de una cadena:
adbcb
Esto no es un palíndromo. Para palindromizar esto, necesitamos fusionar la cadena invertida en la cadena inicial a la derecha de la cadena inicial , dejando ambas versiones intactas. Cuanto más corto, mejor.
Lo primero que podemos probar es lo siguiente:
adbcb
bcbda
^^ ^^
No todos los caracteres coinciden, por lo que esta no es la posición correcta para la cadena invertida. Vamos un paso a la derecha:
adbcb
bcbda
^^^^
Esto tampoco coincide con todos los personajes. Vamos otro paso a la derecha:
adbcb
bcbda
Esta vez, todos los personajes coinciden . Podemos fusionar ambas cadenas dejando el intacto . El resultado final es:
adbcbda
Esta es la cuerda palindromizada .
La tarea
Dada una cadena (con al menos un carácter) que contiene solo letras minúsculas (o mayúsculas, si eso encaja mejor), genera la cadena palindromizada .
Casos de prueba
Input Output
abcb abcba
hello hellolleh
bonobo bonobonob
radar radar
hex hexeh
Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
fuente
obonobo
sería una mejor solución para el caso de prueba.bono b o nob
es una oración completa. ¿Cuál es la diferencia entre Dios y Bono? Dios no deambula por Dublín fingiendo ser Bono ;-)Respuestas:
Jalea,
1110 bytesPruébalo en línea!
Cómo funciona
fuente
Pyth (commit b93a874), 11 bytes
Banco de pruebas
Este código explota un error en la versión actual de Pyth, commit b93a874 . El error es que
_IJ+zb
se analiza como si fueraq_J+zbJ+zb
, que es equivalente a_I+zb+zb
, cuando debería (por la intención de diseño de Pyth) analizarse comoq_J+zbJ
, que es equivalente a_I+zb
. Esto me permite guardar un byte: una vez que se solucione el error, se mostrará el código correcto.VkI_IJ+zbJB
. Explicaré ese código en su lugar.Básicamente, el código de fuerza bruta sobre todas las cadenas posibles hasta que encuentra la cadena más corta que se puede agregar a la entrada para formar un palíndromo, y genera la cadena combinada.
fuente
Python, 46 bytes
Si la cuerda es un palíndromo, devuélvala. De lo contrario, empareje la primera letra alrededor del resultado recursivo para el resto de la cadena.
Desglose de ejemplo:
fuente
s!=s[::-1]
)Haskell, 36 bytes
Más legible:
Si la cuerda es un palíndromo, devuélvala. De lo contrario, empareje la primera letra alrededor del resultado recursivo para la cola de la cadena.
La cadena
s
se divideh:t
en el segundo guardia, obviando un relleno1>0
para este caso. Esto es más corto que hacers@(h:t)
para la entrada.fuente
Pyth -
1612 bytes4 bytes guardados gracias a @FryAmTheEggman.
FGITW, mucho golf posible.
Test Suite .
fuente
Brachylog ,
1665 bytes (no competidor)Pruébalo en línea!
Cuando publiqué mi respuesta inicial, todavía estaba en la implementación anterior en Java. Como he reprogramado todo en Prolog, ahora funciona como debería haberlo hecho en primer lugar.
Explicación
La retropropagación hace que el primer valor válido para
A
él sea el más corto que pueda concatenar a Input para convertirlo en un palíndromo.Solución alternativa, 5 bytes.
Esto es más o menos lo mismo que la respuesta anterior, excepto que en lugar de decir "Salida es la concatenación de la Entrada con una cadena
A
", afirmamos que "Salida es una cadena para la cual la Entrada es un prefijo de la Salida".fuente
JavaScript (ES6), 92 bytes
Calcula y corta la superposición entre la cadena original y su inversión.
fuente
Retina,
2925Pruébalo en línea!
¡Muchas gracias a Martin por 11 bytes guardados!
Esto solo crea una copia invertida de la cadena y los suaviza juntos. La única parte realmente elegante de esto es el método de inversión:
O^#r`.\G
que se realiza mediante el modo de clasificación. Ordenamos las letras de la segunda cadena (las que no son líneas nuevas y son consecutivas desde el final de la cadena, gracias a\G
) por su valor numérico, que, dado que no hay números, es 0. Luego invierte el orden de los resultados de este tipo estable con la^
opción Todo el crédito por el uso elegante de\G
pertenece a Martin :)fuente
CJam, 18
Pruébalo en línea
Explicación:
fuente
Lua,
8988 bytesBatí el Javascript! \ o / Guardado 1 byte gracias a @LeakyNun ^^
Es un programa completo, toma su entrada como argumento de línea de comandos.
sin golf
fuente
while
se pueden eliminar?i=i+1end
?1end
como un número hexadecimal. En general, no se puede usar[abcdef]
directamente después de un número sin que se considere hexadecimal. Hay una excepción más0x
.Prólogo, 43 bytes
Esto espera una cadena de códigos como entrada, por ejemplo, en SWI-Prolog 7:
a(`hello`).
Explicación
Esto es básicamente un puerto de mi respuesta Brachylog.
fuente
Octava,
7875 bytes¡Guardado 3 bytes gracias a Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ!
ideone todavía falla para las funciones con nombre, pero aquí hay una prueba de ejecución del código como programa.
fuente
Perl, 37 bytes
Basado en la respuesta de xnor.
Incluye +2 para
-lp
Ejecutar con entrada en STDIN, p. Ej.
palindromize.pl
:fuente
05AB1E , 18 bytes
Código:
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
Pyke, 15 bytes
Pruébalo aquí!
fuente
J, 20 bytes
Este es un verbo monádico. Pruébalo aquí. Uso:
Explicación
Estoy usando el hecho de que la palindromización de S es S + inversa (P) , donde P es el prefijo más corto de S cuya eliminación da como resultado un palíndromo. En J, es un poco torpe hacer una búsqueda del primer elemento de una matriz que satisface un predicado; De ahí la indexación.
fuente
Haskell, 68 bytes
Ejemplo de uso:
f "abcb"
->"abcba"
.Busque a través
inits
de la entradai
(pinits "abcb"
. Ej. ->["", "a", "ab", "abc", "abcb"]
) hasta encontrar una en la que se adjunte al reverso parai
construir un palíndromo.fuente
r=reverse
tiene que ir antesf i=
...?MATL ,
1716 bytesInspirado libremente en la respuesta CJam de @aditsu .
Pruébalo en línea!
Explicación
fuente
Ruby, 44 bytes
Esta respuesta se basa en las soluciones Python y Haskell de xnor .
fuente
==s?s:
??
entre el?:
ternario y la?x == 'x'
sustitución utilizada desde Ruby 1.9Oracle SQL 11.2, 195 bytes
Sin golf
fuente
En serio, 34 bytes
El último carácter es un espacio que no se rompe (ASCII 127 o
0x7F
).Pruébalo en línea!
Explicación:
fuente
C #, 202 bytes
Lo intenté.
Sin golf:
¿Alguien me puede dar alguna idea para agrupar las dos llamadas a .Reverse (). ToArray ()? Un método separado es más bytes.
fuente
QBIC , 41 bytes
Explicación:
fuente
Haskell, 46 bytes
Me pregunto si hay una manera de eliminar el paréntesis en
(f$tail l)++[l!!0]
...fuente