Je pense que la conjecture de Collatz est déjà bien connue. Mais que faire si nous inversons les règles?
Commencez avec un entier n> = 1.
Répétez les étapes suivantes:
Si n est pair , multipliez-le par 3 et ajoutez 1.
Si n est impair , soustrayez 1 et divisez-le par 2.
Arrêtez quand il atteint 0
Imprimez les numéros itérés.
Cas de test:
1 => 1, 0
2 => 2, 7, 3, 1, 0
3 => 3, 1, 0
10 => 10, 31, 15, 7, 3...
14 => 14, 43, 21, 10, ...
Règles:
Cette séquence ne fonctionne pas pour beaucoup de nombres car elle entre dans une boucle infinie. Vous n'avez pas besoin de gérer ces cas. Seule l'impression des cas de test ci-dessus est suffisante.
J'ai suggéré de soustraire 1 et de diviser par deux pour donner un entier valide pour continuer, mais il n'est pas nécessaire de le calculer de cette façon. Vous pouvez diviser par 2 et convertir en entier ou toute autre méthode qui donnera la sortie attendue.
Vous devez également imprimer l'entrée initiale.
La sortie n'a pas besoin d'être formatée comme cas de test. C'était juste une suggestion. Cependant, l'ordre itéré doit être respecté.
Le plus petit code gagne.
0
à la fin?Réponses:
Perl 6 , 30 octets
Essayez-le en ligne!
Bloc de code anonyme qui renvoie une séquence.
Explication:
la source
Haskell ,
4039 octetsEssayez-le en ligne!
Maintenant sans le 0 final.
la source
Nettoyer , 53 octets
Essayez-le en ligne!
la source
Gelée , 9 octets
Essayez-le en ligne!
la source
Python 2,
545244 octets-2 octets grâce à M. Xcoder
Il doit certainement y avoir un moyen plus rapide. Curieusement, lorsque j'ai essayé un lambda, c'était le même nombre de fois. J'hallucine probablement.
Essayez-le en ligne!
la source
0
soit désormais facultatif, il est donc plus court de se débarrasser du secondprint
Haskell ,
76 69 6156 octetsJ'ai l'impression que c'est beaucoup trop long. Ici
l
produit une liste infinie de la séquence inverse-collatz, et la fonction anonyme à la première ligne la coupe juste au bon endroit.Merci pour -5 octets @ ØrjanJohansen!
Essayez-le en ligne!
la source
(>0)
devrait donc suffire. Il y a aussi uneodd
fonction.Rouille ,
6564 octetsEssayez-le en ligne!
la source
05AB1E ,
1514 octets-1 octet grâce à @MagicOctopusUrn .
Essayez-le en ligne.
Explication:
la source
[Ð=_#Èi3*>ë<2÷
avec=
au lieu deD,
.JAEL , 18 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 31 octets
Essayez-le en ligne!
Ou 30 octets dans l'ordre inverse.
la source
Pyth , 12 octets
Essayez-le ici comme suite de tests!
la source
Wolfram Language (Mathematica) , 35 octets
Essayez-le en ligne!
0<Echo@# && ...&
est une évaluation de court-circuit: il imprime l'entrée#
, vérifie si elle est positive, et si oui, évalue...
. Dans ce cas,...
est#0[3#+1-(5#+3)/2#~Mod~2]
; puisque#0
(l'emplacement zéro) est la fonction elle-même, il s'agit d'un appel récursif3#+1-(5#+3)/2#~Mod~2
, ce qui simplifie3#+1
quand#
est pair et(#-1)/2
quand#
est impair.la source
Lisp commun , 79 octets
Essayez-le en ligne!
la source
PowerShell,
5352 octetsEssayez-le en ligne!
Edit:
-1 octet grâce à @mazzy
la source
for(;$i)
placewhile($i)
Emojicode 0,5 , 141 octets
Essayez-le en ligne!
la source
Stax , 11 octets
Exécuter et déboguer
la source
MathGolf , 12 octets
Essayez-le en ligne!
Explication
la source
code machine x86, 39 octets
Assemblage (syntaxe NASM):
Essayez-le en ligne!
la source
R ,
6661 octets-5 octets grâce à Robert S. pour consolider ifelse dans
if
et supprimer les crochets, et x! = 0 à x> 0au lieu de
Essayez-le en ligne!
la source
perl -Minteger -nlE, 39 octets
la source
Ajouter ++ ,
383533 octetsEssayez-le en ligne!
Comment ça fonctionne
Tout d'abord, nous commençons par définir une fonctionF( x ) , qui prend un seul argument, effectue l'opération Collatz inversée sur X sort ensuite le résultat. C'est,
En mode fonction, Add ++ utilise un modèle de mémoire de pile, sinon des variables sont utilisées. Lors du calculF( x ) , la pile ressemble initialement S= [ x ] .
Nous dupliquons ensuite cette valeur (S= [ x , x ] . Nous donnons ensuite la première option possible,3 x + 1 ( ⌊ x2⌋ , en quittant S= [ 3 x + 1 , ⌊ x2⌋ ] .
d
), pour donner3*1+
), permutez les deux premières valeurs, puis calculezEnsuite, nous poussonsX à S et calculez le peu de X c'est à dire X%2 , où une%b denotes the remainder when dividing a by b . This leaves us with S=[3x+1,⌊x2⌋,(x%2)] . Finally, we use (x%2) . If that's 0 , we return the first element i.e. 3x+1 , otherwise we return the second element, ⌊x2⌋ .
D
to select the element at the index specified byThat completes the definition off(x) , however, we haven't yet put it into practice. The next three lines have switched from function mode into vanilla mode, where we operate on variables. To be more precise, in this program, we only operate on one variable, the active variable, represented by the letter
x
. However,x
can be omitted from commands where it is obviously the other argument.For example,x≠0 . The loop is very simple, consisting of a single statement: f(x) , then assign that to
+?
is identical tox+?
, and assigns the input tox
, but asx
is the active variable, it can be omitted. Next, we outputx
, then entire the while loop, which loops for as long as$f>x
. All this does is runx
, updatingx
on each iteration of the loop.la source
Retina 0.8.2, 46 bytes
Try it online! Explanation:
Convert to unary.
Repeat until the value stops changing.
Print the value in decimal.
If it is even, multiply by 6 and add 3.
Subtract 1 and divide by 2.
The trailing newline can be suppressed by adding a
;
before the{
.la source
Red, 70 bytes
Try it online!
la source
Racket, 75 bytes
Try it online!
Equivalent to JRowan's Common Lisp solution.
la source
C# (.NET Core), 62 bytes
Try it online!
Ungolfed:
la source
Dart, 49 bytes
Try it online!
la source
Gambit Scheme (gsi), 74 bytes
Try it online!
la source