Algunos números, como , son palíndromos en la base 10: si escribe los dígitos en orden inverso, obtiene el mismo número.
Algunos números son la suma de 2 palíndromos; por ejemplo, , o .
Para otros números, 2 palíndromos no son suficientes; por ejemplo, 21 no puede escribirse como la suma de 2 palíndromos, y lo mejor que puede hacer es 3: .
Escriba una función o programa que tome la entrada entera n
y genere el n
número th que no puede descomponerse como la suma de 2 palíndromos. Esto corresponde a OEIS A035137 .
Los dígitos individuales (incluido 0) son palíndromos.
Se aplican reglas estándar para secuencias:
- entrada / salida es flexible
- puede usar 0- o 1- indexación
- puede generar el
n
término th, o los primerosn
términos, o una secuencia infinita
(Como nota al margen: todos los enteros se pueden descomponer como la suma de como máximo 3 palíndromos).
Casos de prueba (1 indexado):
1 -> 21
2 -> 32
10 -> 1031
16 -> 1061
40 -> 1103
Este es el código de golf, por lo que gana la respuesta más corta.
n
, imprime el enésimo miembro de la secuencia OEIS An? Suena prometedor ...Respuestas:
JavaScript (ES6),
93 83 8079 bytesGuardado 1 byte gracias a @tsh
Devuelve eln º plazo, 1-indexados.
Pruébalo en línea!
¿Cómo?
Dadon , probamos si existe 1≤k≤n manera que tanto k como n−k sean palíndromos. Si encontramos tal k , entonces n es la suma de dos palíndromos.
El truco aquí es procesark y n−k al mismo tiempo probando una sola cadena hecha de la concatenación de k , n−k y k .
Ejemplo:
Paran=2380 :
Comentado
NB: Esta es una versión sin
eval()
legibilidad.fuente
i=>eval("for(n=k=1;k=(s=[...k+[n-k]+k])+''!=s.reverse()?k-1||i--&&++n:++n;);n")
79 bytesi=>eval("...")
, ES6 le permite usari=>eval`...`
, ahorrando 2 bytes;n
al final.eval()
porque no obliga su argumento a una cadena. Eliminar eliminaría;n
un error de sintaxis y eliminar solon
la funciónundefined
.Jalea ,
16 109 bytes-1 byte gracias a Erik the Outgolfer . Emite los primerosn términos.
Pruébalo en línea!
Traté de tener una idea diferente en comparación con mi enfoque original. Repasemos el proceso de pensamiento:
Inicialmente, la prueba funcionó de la siguiente manera: generó las particiones enteras de ese número, luego filtró las que también contenían no palíndromos, luego contó cuántas listas elegibles para longitud 2 había. Obviamente, esto no era demasiado eficiente en términos de longitud del código.
Generar las particiones enteras deN y luego filtrar tenía 2 desventajas principales: eficiencia de duración y tiempo. Para resolver ese problema, pensé que primero se me ocurriría un método para generar solo los pares de enteros (x,y) que sumen N (no todas las listas de longitud arbitraria) con la condición de que ambos números deben ser palíndromos.
Pero aún así, no estaba satisfecho con la "forma clásica" de hacer esto. Cambié los enfoques: en lugar de generar pares , hagamos que el programa se centre en palíndromos individuales . De esta manera, uno simplemente puede calcular todos los palíndromosx debajo de N , y si N−x también es palíndromo, entonces hemos terminado.
Explicación del Código
* Cualquier otro dígito distinto de cero funciona, para el caso.
fuente
Jalea , 11 bytes
Pruébalo en línea!
El programa completo funciona más o menos así:
Puede sospechar que el paso 5 en realidad no hace el trabajo que debería. Realmente no deberíamos disminuir z si todos los pares que suman x son palindrómicos. Sin embargo, podemos demostrar que esto nunca sucederá:
Llegamos a la conclusión de que, si comenzamos estableciendo x en un valor mayor o igual a 10 , nunca podremos tener todos los pares de enteros no negativos que sumen a x sean pares de palíndromos.
fuente
ŻŒḂ€aṚ$Ṁ¬µ#
Retina ,
135102bytesPruébalo en línea! Demasiado lento para
n
10 o más. Explicación:Comience probando 0.
Repite
n
veces.Convierta el valor de prueba actual en unario e increméntelo.
Cree todos los pares de enteros no negativos que sumen el nuevo valor de prueba.
Repita mientras exista al menos un par que contenga dos enteros palindrómicos.
Incremente y expanda el valor de prueba nuevamente.
Extraer el valor final.
fuente
Haskell,
686763 bytesDevuelve una secuencia infinita.
Recoge todo
n
donde seaa
on-a
no sea un palíndromo para todosa <- [0..n]
.Pruébalo en línea!
fuente
Perl 5
-MList::Util=any -p
,5955 bytes-3 bytes gracias a @NahuelFouilleul
Pruébalo en línea!
Nota:
any
podría reemplazarsegrep
y evitar el-M
cambio de línea de comando, pero según las reglas de puntuación actuales, eso costaría un byte más.fuente
+
después delwhile
.R ,
115111 bytes-4 gracias a Giuseppe
Pruébalo en línea!
La mayor parte del trabajo se empaqueta en los argumentos de la función para eliminar la
{}
llamada a una función de varias instrucciones y para reducir los corchetes necesarios para definir el objetor
La estrategia básica es encontrar todos los palíndromos hasta un límite dado (incluido 0), encontrar todas las sumas por pares y luego tomar el enésimo número que no está en esa salida.
El límite de
n*1000
fue elegido exclusivamente por una suposición educada, por lo que animo a cualquiera que lo pruebe / refute como una opción válida.r=0:(n*1e3)
Probablemente se puede mejorar con un límite más eficiente.Map(paste,Map(rev,strsplit(a,"")),collapse="")
está arrancado de la respuesta de Mark aquí , y es increíblemente inteligente para mí.r[!r%in%outer(p,p,'+')][n]
lee un poco ineficiente para mí.fuente
C # (compilador interactivo de Visual C #) , 124 bytes
Pruébalo en línea!
fuente
J , 57/60 bytes
Pruébalo en línea!
La versión vinculada agrega 3 bytes para un total de 60 para guardar como una función que el pie de página puede llamar.
En REPL, esto se evita llamando directamente:
Explicación
La estructura general es la de esta técnica a partir de una respuesta de Miles :
Esto ahorró algunos bytes sobre mi técnica de bucle original, pero dado que la función principal es mi primer intento de escribir J, es probable que todavía haya muchas cosas que puedan mejorarse.
fuente
1&(_:1&((e.((*&(-:|.)&":"0>:)&i.-))+])+)*
05AB1E ,
1512 bytes-3 bytes gracias a @Grimy .
0 indexado.
Muy lento, por lo que se agota el tiempo de espera para la mayoría de los casos de prueba.
Pruébelo en línea o verifique los primeros casos eliminando el
Iè
.Versión anterior de 15 bytes mucho más rápida:
1 indexado.
Pruébelo en línea o envíe el primeronorte los valores .
Explicación:
fuente
°LDʒÂQ}ãOKIè
(probablemente hay un límite superior mejor que 10 ^ x para la velocidad). Supongo∞DʒÂQ}ãOK
que técnicamente es un 9, pero se agota antes de la primera salida.Iè
) es como:[1,21,32,43,54,65,76,87,98,111,131,141,151,...]
pero se supone que debe ser como[*,21,32,43,54,65,76,87,98,201,1031,1041,1051,1052,...]
(la primera1
/*
puede ignorarse ya que usamos una entrada indexada 1).L
en 1 a 0 .. :)Rojo , 142 bytes
Pruébalo en línea!
Devuelve el enésimo término, 1 indexado
fuente
Python 3 , 107 bytes
Pruébalo en línea!
Invertir la comprobación de palíndromo guardado 2 bytes :)
Como referencia, la verificación positiva directa (109 bytes):
fuente
APL (NARS), 486 bytes
¿Cuál es la palabra para romper el bucle? Parece que es ": vete", ¿verdad?
{k≡⌽k←⍕⍵}
en p es la prueba para palíndromo. Esta función anterior en el bucle almacena todo el palíndromo encontrado en el conjunto P, si para algún elemento w de P es tal que iw también está en P, esto significa que i no es correcto y tenemos un incremento i. Resultados:fuente