Introducción
Un cierre palindrómico de una cadena de entrada es el palíndromo más corto que se puede construir a partir de la cadena de entrada donde el palíndromo final comienza con la cadena de entrada.
Para este desafío, consideraremos un cierre palindrómico bidireccional tal que
- El cierre palindrómico izquierdo de una cadena de entrada es el palíndromo más corto posible que comienza con la cadena de entrada.
- El cierre palindrómico derecho de una cadena de entrada es el palíndromo más corto posible que termina con la cadena de entrada.
- El cierre palindrómico bidireccional de una cadena de entrada es el más corto del cierre palindrómico izquierdo o derecho de la cadena de entrada.
Tarea
Tu tarea es simple. Dada una cadena (que consiste solo en ASCII imprimible, nuevas líneas y espacios en blanco), genera el cierre palindrómico bidireccional de esa cadena. En caso de empate, cualquiera de los cierres palindrómicos izquierdo o derecho son salidas válidas.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función, e imprimiendo el resultado en STDOUT (o la alternativa más cercana) o devolviéndolo como una cadena.
Puede suponer que la entrada nunca será una cadena vacía.
Pocos ejemplos:
<Input> -> <Output>
"abcdef" -> "abcdefedcba" (or "fedcbabcdef")
"abcba" -> "abcba"
"abcb" -> "abcba"
"cbca" -> "acbca"
El crédito de la idea inicial va a VisualMelon, la idea final con la ayuda de Martin y Zgarb
Los términos cierre palindrómico, cierre palindrómico izquierdo y cierre palindrómico derecho se usaron y definieron por primera vez en este documento .
fuente
Respuestas:
Pyth,
2219Pruébalo en línea .
Explicación
El cierre palindrómico bidireccional es de la forma
AX
oXA
, dondeX
es la cadena de entrada yA
es una subcadena deX
. De hecho, tengo que ser una subcadena contigua deX
, un prefijo para una forma, un sufijo para la otra forma. Pero no me importan estos defectos. Una subcadena (contigua o no) es todo lo que necesito en Pyth.Editar
La versión anterior ordenó las cadenas después de filtrar por longitud
.olN...
. Acabo de darme cuenta, quey
devuelve las subcadenas ordenadas por longitud. Entonces estos palíndromos ya están ordenados.fuente
Clip , 40
Ejemplo
Explicación
fuente
CJam, 30 bytes
Realmente esperaba ver una respuesta de CJam por ahora ... Así que aquí va: P
Realmente odio ese
{,}$
bloqueo allí, pero obtengo una lista desordenada de posibles palíndromos debido al algoritmo de generación que estoy usando.Explicación del código
Pruébalo en línea aquí
fuente
{,}$
bloque allí también! Es broma, no tengo idea de lo que hace CJam.Python 2,
11511310910596 bytesCon suerte puede jugar golf más abajo. Bits posiblemente dignos de mención:
fuente
a
.Mathematica, 96 bytes
Debe haber una forma más elegante que esta ...
Esto define una función sin nombre que toma una cadena y devuelve el resultado.
La idea básica es
Characters
.Use la coincidencia de patrones para encontrar el palindrómico correcto de cada uno de ellos:
Tenga en cuenta que esto en realidad no devuelve una lista plana. Por ejemplo, para
{a,b,c}
obtenerOrdenar los dos resultados por longitud.
""<>#&@@
.fuente
abacaba
cuando la entrada esabac
. La respuesta correcta escabac
. Creo que deberías aplanarlos antes de ordenarlos por longitud.Brachylog (2), 6 bytes, desafío de fechas posteriores al idioma
Pruébalo en línea!
Como es habitual en Brachylog, esta es una función, no un programa completo.
Explicación
Hasta donde yo sé (no es mi idioma, pero parece poco probable),
a
no se agregó a Brachylog para este desafío, pero es realmente útil aquí. Usamos el método "revertir y afirmar que no ha cambiado" para afirmar que el valor que encontramos es un palíndromo.En cuanto a por qué esto produce el palíndromo más corto , el orden de evaluación de Prolog (y, por lo tanto, de Brachylog) está muy influenciado por lo primero que evalúa. En este caso, se trata de un comando "inverso" y (como la mayoría de las operaciones de lista) establece un orden de evaluación que tiene como objetivo minimizar el tamaño de la lista resultante. Como es lo mismo que el tamaño de la salida, el programa felizmente termina minimizando exactamente lo correcto por casualidad, lo que significa que no necesité agregar ninguna pista explícita.
fuente
a
- No se agregó Adfix para este desafío. No tenía ningún símbolo disponible con buenos mnemónicos para el prefijo y el sufijo, por lo tanto, fusioné ambos en un adfix que puede tomar subíndices para seleccionar prefijos o sufijos solo si es necesario.Rubí, 76 + 2 = 78
Con indicadores de línea de comandos
-pl
(l
puede que no sean necesarios dependiendo de cómo esté haciendo la entrada), ejecuteDada una cadena 'abaa', genera las cadenas 'cbca 0 acbc' y 'acbc 0 cbca', donde 0 es el carácter no imprimible con el código ascii 0. Luego elimina una copia del marco de cadena repetido más largo 0 que encuentra en cada uno, 'a' en el primero y 'cbc' en el segundo, para obtener los dos cierres. Luego genera el resultado más corto.
Lo único realmente extraño del código de golf es que acorta las cadenas en su lugar mientras las ordena, lo que podemos evitar porque
min_by
solo ejecuta el bloque una vez por elemento que se compara (tanto porque es una transformación de Schwartzian como porque solo hay dos elementos para comparar).fuente
Python 3, 107 bytes
Probar:
fuente
Haskell, 107 bytes
Prueba:
fuente
J,
6662 bytesBastante sencillo. Los dos trucos que uso:
El cierre palindrómico derecho es el cierre palindrómico izquierdo de la cuerda invertida.
Encontrar la longitud de la cadena con longitud mínima y palindromidad con la expresión min (is_palindrome / length).
Pruébelo en línea aquí.
fuente