Inversement-ajout de palindrome
Le processus d'inversion-addition est où un nombre est ajouté à son inverse jusqu'à ce que le nombre créé soit un palindrome. Par exemple, si nous commençons par 68, le processus serait:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Comme vous pouvez le voir, cela a pris 3 ajouts pour obtenir un nombre palindromique. Si nous devions commencer 89
, nous aurions besoin de 24 étapes (dont vous pouvez voir la répartition ici ).
Le record du monde pour le plus grand nombre de mesures prises avant qu'un palindrome soit atteint est 261, ce qui se produit pour le nombre 1186060307891929990
, produisant un nombre supérieur à 10 118 . Cependant, il y a eu pas mal de chiffres que nous n'avons pas pu obtenir de palindrome. Ce sont les nombres de Lychrel .
Puisque nous travaillons en base 10, nous ne pouvons vraiment les appeler que des candidats, car il n'existe aucune preuve que ces chiffres n'atteignent jamais un palindrome. Par exemple, le plus petit candidat Lychrel en base 10 est 196, et a traversé bien plus d'un milliard d'itérations. Si le palindrome existe, il est beaucoup plus grand que 10 10 8,77 . À titre de comparaison, si ce nombre de 1 était inscrit sur des atomes, il nous faudrait 2,26772 × 10 588843575 univers d'atomes pour l'écrire, en supposant qu'il existe.
Ta tâche
Créez un programme ou une fonction qui prend une entrée entière et renvoie ou imprime le nombre d'étapes nécessaires pour atteindre un palindrome. Vous ne serez pas obligé de traiter avec des candidats Lychrel (c.-à-d. Que votre programme, lorsqu'il reçoit un candidat Lychrel, est autorisé à lancer une erreur ou à courir indéfiniment).
Cas de test:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
Règles
Bonus
- Si vous imprimez chaque étape d'ajout, formatée
n + rev(n) = m
, vous pouvez multiplier votre score par 0,75 . Les sommes doivent être imprimées avant le nombre d'étapes. - Si votre code peut détecter si un nombre est un candidat Lychrel, vous pouvez multiplier votre score par 0,85 . Dans ce cas, il suffit de supposer que tout ce qui prend plus de 261 itérations est un candidat Lychrel. Soit ne renvoyez rien, ou tout ce qui n'est pas un nombre qui peut être confondu avec une réponse correcte (etc: n'importe quelle chaîne ou un nombre non compris dans la plage 0-261). Toute erreur ne compte pas comme sortie valide (ex. Profondeur de récursivité maximale dépassée) et ne peut pas être utilisée dans la détection.
- Si vous terminez les deux bonus, multipliez par 0,6 .
Il s'agit de code-golf , donc le moins d'octets gagne.
Cet extrait de code montre un exemple de solution en Python 3 avec les deux bonus.
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
bonus est-il au-dessus des autres? Ou est-ce juste cela?
10 + 01 = 11
ou 10 + 1 = 11
ou est-ce à nous de décider?
262
?