Inversión-adición de palíndromo
El proceso de adición de reversión es donde se agrega un número al reverso hasta que el número creado es un palíndromo. Por ejemplo, si comenzamos con 68, el proceso sería:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Como puede ver, esto tomó 3 adiciones para llegar a un número palindrómico. Si comenzáramos 89
, necesitaríamos 24 pasos (que puede ver el desglose aquí ).
El récord mundial para la mayoría de los pasos dados antes de alcanzar un palíndromo es 261, lo que ocurre para el número 1186060307891929990
, produciendo un número mayor que 10 118 . Sin embargo, ha habido bastantes números que no hemos podido obtener un palíndromo. Estos se llaman números de Lychrel .
Como estamos trabajando en la base 10, realmente solo podemos llamarlos candidatos, porque no existe prueba de que estos números nunca lleguen a un palíndromo. Por ejemplo, el candidato más pequeño de base 10 Lychrel es 196, y ha pasado por más de mil millones de iteraciones. Si el palíndromo existe, es mucho más grande que 10 10 8.77 . En comparación, si esa cantidad de 1s estuviera inscrita en átomos, necesitaríamos 2.26772 × 10 588843575 universos por valor de átomos para escribirla, suponiendo que exista.
Tu tarea
Cree un programa o función que tome una entrada entera y devuelva o imprima el número de pasos necesarios para alcanzar un palíndromo. No tendrá que tratar con candidatos de Lychrel (es decir, su programa, cuando recibe un candidato de Lychrel, puede lanzar un error o ejecutarse para siempre).
Casos de prueba:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
Reglas
Bonos
- Si imprime cada paso adicional, formateado
n + rev(n) = m
, puede multiplicar su puntaje por 0.75 . Las sumas deben imprimirse antes del número de pasos. - Si su código puede detectar si un número es un candidato de Lychrel, puede multiplicar su puntaje por 0.85 . En este caso, es suficiente suponer que cualquier cosa que requiera más de 261 iteraciones es un candidato de Lychrel. O no devuelve nada, o cualquier cosa que no sea un número que pueda confundirse con una respuesta correcta (etc.: cualquier cadena o un número que no esté en el rango 0-261). Cualquier error no cuenta como salida válida (p. Ej., Se excede la profundidad máxima de recursión) y no puede utilizarse en la detección.
- Si completa ambas bonificaciones, multiplique por 0.6 .
Este es el código de golf , por lo que gana el menor número de bytes.
Este fragmento de código muestra una solución de ejemplo en Python 3 con ambos bonos.
def do(n,c=0,s=''):
m = str(n)
o = m[::-1]
if c > 261:
return "Lychrel candidate"
if m == o:
print(s)
return c
else:
d = int(m)+int(o)
s+="%s + %s = %s"%(m,o,str(d))
return do(d,c+1,s)
*0.6
bono está por encima de los demás? ¿O es solo eso?
10 + 01 = 11
o 10 + 1 = 11
depende de nosotros?
262
?