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)
la source
*0.6
bonus est-il au-dessus des autres? Ou est-ce juste cela?10 + 01 = 11
ou10 + 1 = 11
ou est-ce à nous de décider?262
?Réponses:
Pyth, 12 octets
Essayez-le en ligne: démonstration ou test de harnais
Cela utilise une toute nouvelle fonctionnalité (seulement 17 heures).
Explication
Éditer:
Un peu changé le code. L'ancienne version était
Même nombre d'octets, mais le nouveau est beaucoup plus cool.
la source
Python, 51
Pour Python 2, les backticks ne peuvent pas remplacer en
str()
raison de l'L
attachement auxlong
littéraux.Voici une autre version avec un score de 64 * 0,85 = 54,4 :
Et une version alternative pour Python 3 avec un score de 88 * 0,6 = 52,8 :
la source
CJam,
232220,4 octetsLe code fait 24 octets et affiche -1 pour les candidats Lychrel.
Essayez-le en ligne.
Comment ça fonctionne
Si elle
{}#
réussit, l'index correspond également au nombre d'étapes. Si, en revanche, le tableau ne contient pas de palindrome,{}#
il poussera -1 .la source
Java, 200 * 0,6 = 120
Il s'agit d'une simple boucle qui fait exactement ce qu'elle dit sur la boîte, mais avec du golf ajouté. Retourne
1000
pour les candidats Lychrel pour obtenir le bonus de détection. Il s'avère que j'ai pu imprimer pour pas trop de caractères (pour Java au moins) et accrocher ce bonus également. Le mieux que je pouvais faire sans code bonus était 156, donc ça valait le coup.Avec quelques sauts de ligne:
Ancienne réponse: 171 * 0,85 = 145,35 octets
la source
s++<999
Rubis, (80 + 2) * 0,6 = ~ 49,2
Avec des drapeaux
-nl
, courezLa sortie ressemble à
Si donné 196, il imprime les 261 premières étapes d'addition puis
nil
.Rien de trop compliqué ici. Nous vérifions si
$_
(qui est initialisé à l'entrée) contient son revers, ce qui n'est possible que s'ils sont égaux car ils sont de la même taille. Si c'est le cas, nous imprimons le numéro d'étape et quittons, sinon, nous affichons et exécutons l'étape d'addition, stockant la nouvelle valeur dans$_
(je ne peux malheureusement pas simplementeval
la chaîne que j'affiche car elle interprète un nombre inversé avec un 0 à la fin) comme un octal littéral).puts
renvoie une valeur de falsey pour que la boucle continue.la source
" + #{b} = "
enregistre un octet.-l
si nous mettons le numéro dans un fichier sans retour à la ligne et le canalisons?Pyth - 19 octets
Utilise une boucle et un compteur. Il existe probablement un algorithme plus petit que celui-ci, mais il est assez court.
Essayez-le en ligne ici .
la source
K, 25 octets
Pas très élégant. La forme globale (
{monad 1}{monad 2}\x
) est l'équivalent de K d'une boucle "while" générale, où la première monade est la condition d'arrêt et la seconde est une fonction appliquée de manière itérative à l'argumentx
. La première monade ({~x~|x}
) est la négation de la phrase classique "is xa palindrome". La deuxième monade concatène ensemble une chaîne représentant x plus l'inverse de x, l'évalue puis recompose le résultat dans une chaîne avec$
.Un échantillon montrant des résultats intermédiaires:
Faire une sortie formatée comme demandé pour le bonus serait très maladroit et ajouterait une quantité importante de code.
la source
CJam, 23 octets
Encore quelques jours dans CJam, je suis donc assez heureux d'être au moins dans la même gamme que certains des pros. :) J'ai utilisé l'astuce de comparaison de cordes de Martin qu'il a également publiée dans les conseils CJam. J'ai également jeté un œil à la solution de Dennis pour comprendre comment inverser une chaîne.
Explication:
Testez-le en ligne
la source
Julia,
129120octets * 0,6 = 72Cela crée une fonction sans nom qui prend un entier en entrée et renvoie un entier, en attendant l'impression de chaque étape. Les candidats Lychrel ont une valeur de retour de 262. Pour l'appeler, donnez-lui un nom, par exemple
f=i->...
.Notez qu'en omettant le code relatif uniquement aux bonus, cette solution serait de 84 octets.
Non golfé + explication:
Exemples:
Sauvegardé 2 octets grâce aux Geobits!
la source
CJam, 24 octets
Testez-le ici.
Explication
Pour plus d'informations sur la raison pour laquelle vous
#
pouvez utiliser pour vérifier l'inégalité des chaînes, consultez cette astuce .la source
#
.Haskell,
6653 octetsExemple d'utilisation:
la source
r=reverse x
? Cela changerait votre deuxième lignef x|x==r=0|1<2=1+f(show$read x+read(r))
et économiserait 2 octets.x
ce ne serait pas dans le champ d'application. Cependant,f x|x==r=0 .... read(r)) where r=reverse x
cela fonctionnerait, mais c'est plus long.Clojure, 94 octets
C'est ma première tentative de coder le golf, alors dites-moi si je fais quelque chose de mal.
Avec quelques espaces:
Récursivité simple de la fonction interne. Il prend deux arguments, l'entier
%1
et un index%2
. S'il%1
s'agit d'un palindrome, l'index est renvoyé. Sinon, la fonction s'appelle avec la somme et l'index incrémenté. La fonction externe initialise l'index avec zéro.Un échantillon:
la source
Boost.Build, 304 octets
Pas vraiment une langue. Toujours cool.
Assez simple, à part le hack basé sur les regex élaborés que j'ai utilisé pour inverser la chaîne.
la source
Rubis, 44
Nécessite Ruby 1.9 ou supérieur pour la
->
syntaxe lambda.la source