Description du défi
Prenons un entier positif n
, inversons ses chiffres pour obtenir rev(n)
et obtenir la valeur absolue de la différence de ces deux nombres: |n - rev(n)|
(ou abs(n - rev(n))
).
Exemple:
n = 5067
rev(n) = 7605
|n - rev(n)| = |5067 - 7605| = |-2538| = 2538
Après avoir répété cette opération suffisamment de fois, la plupart des nombres deviendront 0
(terminant ainsi la boucle) ...
5067 -> 2538 -> 5814 -> 1629 -> 7632 -> 5265 -> 360 -> 297 -> 495 -> 99 -> 0
... bien que certains nombres (comme 1584
) restent coincés dans une boucle infinie:
1584 -> 3267 -> 4356 -> 2178 -> 6534 -> 2178 -> 6534 -> 2178 -> 6534 -> ...
^ infinite loop starts here
Votre travail consiste à déterminer si un entier donné est bloqué dans une boucle infinie.
Description d'entrée
Un entier positif.
Description de la sortie
Une valeur vraie ( True
, 1
) si le nombre se coince dans une boucle infinie, une valeur fausse ( False
, 0
) sinon.
Remarques
code-golf
number-theory
shooqie
la source
la source
Réponses:
Pyth, 5 octets
4 octets grâce à FryAmTheEggman
Suite de tests.
La valeur véridique est l'un des nombres de la boucle.
La valeur de falsey est
0
.Explication
la source
Mathematica,
3937 octetsApplique simplement les
n
temps de transformation inverse / soustraire à l'entréen
, puis vérifie si le résultat est0
. Il ne peut jamais prendre plus de10n
étapes pour atteindre une boucle, car la transformation ne peut pas augmenter le nombre de chiffres, et il y a moins de10n
nombres sans plus de chiffres quen
. Voir la preuve de Dennis pour savoir comment réduire cette limite àn
.la source
Gelée ,
65 octetsEssayez-le en ligne!
Contexte
Cela utilise la limite supérieure de @ MartinEnder de 10n itérations et les observations suivantes.
Il y a 9 × 10 k - 1 entiers positifs n avec k chiffres.
La différence d'un nombre et son inverse est toujours un multiple de 9 , donc seulement 10 k - 1 d'entre eux peuvent se produire après la première itération.
Parmi les multiples, plus de 1/10 va perdre un chiffre dans la prochaine itération (pour commencer, tout ce début et fin avec les mêmes chiffres, et à peu près deux fois plus nombreux si le premier chiffre est ni 1 ni 9 ), de sorte il faut au plus 9 × 10 k - 2 pour entrer dans une boucle ou perdre un chiffre.
En appliquant le même raisonnement à l'entier résultant résultant de k - 1 chiffres et ainsi de suite, il faut au plus 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n itérations pour entrer dans une boucle ou atteindre 0 .
Comment ça marche
la source
Oracle SQL 11.2, 136 octets
Non golfé
la source
APL, 26 caractères
Nous utilisons l'argument de gauche comme accumulateur des valeurs que nous avons déjà vues. Nous l'initialisons à "0", qui est l'une des deux conditions de terminaison. Le gardien
⍵∊⍺:×⍵
se lit: "est-ce le bon argument que nous avons déjà vu (et cela inclut zéro)? Si c'est le cas, renvoyez le signe du nombre, c'est-à-dire 1 ou 0". Sinon, reprenons en nous appelant la valeur absolue de la soustraction après avoir caténé la valeur courante à l'argument de gauche.Une refonte de la solution Mathematica par Martin Ender cadrerait à 21 caractères :
Il se lit: "quel est le signe du résultat après avoir appliqué les 10n fois voulu"?
la source
Python 2, 50 octets
Testez-le sur Ideone .
Contexte
Cela utilise la limite supérieure de @ MartinEnder de 10n itérations et les observations suivantes.
Il y a 9 × 10 k - 1 entiers positifs n avec k chiffres.
La différence d'un nombre et son inverse est toujours un multiple de 9 , donc seulement 10 k - 1 d'entre eux peuvent se produire après la première itération.
Parmi les multiples, plus de 1/10 va perdre un chiffre dans la prochaine itération (pour commencer, tout ce début et fin avec les mêmes chiffres, et à peu près deux fois plus nombreux si le premier chiffre est ni 1 ni 9 ), de sorte il faut au plus 9 × 10 k - 2 pour entrer dans une boucle ou perdre un chiffre.
En appliquant le même raisonnement à l'entier résultant résultant de k - 1 chiffres et ainsi de suite, il faut au plus 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n itérations pour entrer dans une boucle ou atteindre 0 .
la source
CJam,
1513 octetsTestez-le ici.
Identique à ma réponse Mathematica.
la source
Python,
12912096 octetsSi une exception est interceptée (normalement la seule exception qui peut être levée avec cette fonction est une RuntimeError, en raison de la récursivité infinie), imprimez 1. Sinon, imprimez le résultat, 0.
Merci à @LeakyNun
Merci à @shooqie
la source
return a and rev(a)
a=[n-x,x-n][n>x]
def rev(n):a=abs(n-int(str(n)[::-1]));return a and rev(a)
. Aussi, nommez la méthode quelque chose de court (commer
au lieu derev
)Python,
10198 octetsAlgorithme de tortue et de lièvre.
Truthy est n'importe quelle valeur en boucle, falsey est
0
.Ideone it!
la source
Python 2,
858483 octetsUne autre réponse Python. Il ajoute n à une liste pour chaque itération, et si n est déjà dans la liste, il génère
False
. Sinon, cela fonctionne jusqu'à 0.Merci @NonlinearFruit pour un octet.
la source
print n<1
fonctionne (car iln
est toujours non négatif) et qu'il enregistre un octetdef f(n,L=[]):¶ if n<1or n in L:print n<1¶ else:f(abs(n-int(`n`[::-1])),L+[n])
enregistre 5 octets05AB1E,
1186 octetsExpliqué
La valeur vraie est un nombre de la boucle.
La valeur de la fausse valeur est 0.
Essayez-le en ligne
Utilise la borne supérieure expliquée dans la réponse de Dennis 'Jelly
Sauvegardé 2 octets grâce à @Adnan
Dans la version 7.9 de 05AB1E, les solutions à 5 octets suivantes fonctionnent comme indiqué par @Adnan
la source
DFÂ-Ä
fonctionne dans la version 7.9 mais pas dans la version actuelle. Dans la version actuelle, vous devez d'abord le convertir en entier (comme celui-ciDFÂï-Ä
), mais vous pouvez utiliser la version 7.9 pour lui donner 5 octets: p.Java 7, 161 octets
Cela nécessite une importation mais je l'ai écrit en fonction. Criez-moi dans les commentaires si un programme complet est préféré dans ce scénario. Affiche 1 s'il y a une boucle infinie et 0 si la valeur atteint 0.
la source
1
vrai?Brachylog ,
493223 octetsRetourne
true
pour les boucles infinies etfalse
autrement.Il s'agit d'une adaptation éhontée de l'algorithme de Martin Ender.
Réponse précédente, 32 octets
Explication de la réponse précédente
la source
PowerShell v2 +, 94 octets
Prend une entrée
$n
, démarre unefor
boucle infinie , avec$a=,0
comme condition initiale (cela utilise l'opérateur virgule pour définir$a
un tableau d'un élément,0
). Ceci$a
est notre tableau de valeurs déjà vues.Chaque itération de boucle que nous vérifions
if
. La condition définit d'abord la valeur suivante de l'$n
utilisation de l'inversion de chaîne et de l'[math]::Abs
appel .NET, et vérifie si cette valeur est déjà-in
$a
. Si oui, nous sortons$n
etexit
. Sinon, nous ajoutons cette valeur au tableau et continuons la boucle.Sorties
0
pour les valeurs d'entrée où elle ne va pas dans une boucle infinie (ce qui est falsey dans PowerShell) et sorties la valeur où la boucle a été rencontrée autrement (les entiers non nuls sont vrais). Par exemple, sorties2178
pour entrée1584
.la source
Haskell, 65 octets
Renvoie
0
False et1
True. Exemple d'utilisation:([]#) 1584
->1
.L'approche évidente: garder une liste avec tous les résultats observés jusqu'à présent. Calculez le nombre suivant jusqu'à ce
0
qu'il soit dans la liste.la source
JavaScript (ES6), 75 octets
n<0?n=-n:n
etn*=n>0||-1
aussi travailler. L'algorithme ressemble quelque peu à la réponse PowerShell, bien qu'il s'agisse d'une formulation récursive.la source
Rubis, 57 octets
Le tableau initialement vide
h
suit les valeurs précédemment atteintes. Nous itérons le nombre jusqu'à ce que nous atteignions une valeur précédente, puis vérifions la valeur à la dernière itération. Puisque 0 est un cycle de 1, ce sera 0 si et seulement s'il n'y a pas de cycle plus grand. Je prends 2 octets supplémentaires pour convertir cela en un booléen car 0 est vrai en Ruby.la source
Perl 6
58 53 3330 octetsExplication:
(se fonde sur l'observation précédente selon laquelle il vous suffit d'effectuer cette transformation la plupart du
n
temps)la source
Perl 5,
3129 octetsIl itère
n=|n-rev(n)|
n fois, donc la sortie est 0 s'il n'y a pas de boucle,> 0 sinon. Dennis a déjà prouvé que cela suffisait.La nouvelle version utilise
eval
etx
répète l'opérateur au lieu de lafor
boucle.la source
-p
option,-l
n'est pas nécessaire pour une seule entréeMatlab,
8984 octetsApproche simple - empile tous les numéros et vérifie si un numéro est apparu avant.
Explication
la source