La conjecture inverse de Collatz

13

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.

Eduardo Hoefel
la source
9
Comme il s'agit de votre troisième question en autant d'heures, je vous recommande de consulter le bac à sable , l'endroit où nous publions généralement des brouillons de questions pour obtenir des commentaires, et pour vous assurer qu'ils ne sont pas en double.
caird coinheringaahing
Merci @cairdcoinheringaahing. Je ne connaissais pas cette page.
Eduardo Hoefel
Faut-il imprimer le 0à la fin?
flawr
2
Vous voudrez peut-être étendre les deux derniers cas de test, car ils ne sont pas si longs
Jo King
3
@JoKing Je l'ai compressé car il répète la sortie des autres lignes. Au point où vous atteignez 3 , il a la même sortie que lorsque vous en partez. Il en va de même pour 10 ou tout autre numéro.
Eduardo Hoefel

Réponses:

5

Perl 6 , 30 octets

{$_,{$_%2??$_+>1!!$_*3+1}...0}

Essayez-le en ligne!

Bloc de code anonyme qui renvoie une séquence.

Explication:

{$_,{$_%2??$_+>1!!$_*3+1}...0}
{                            }   # Anonymous code block
   ,                     ...     # Define a sequence
 $_                              # That starts with the given value
    {                   }        # With each element being
     $_%2??     !!               # Is the previous element odd?
           $_+>1                 # Return the previous element bitshifted right by 1
                  $_*3+1         # Else the previous element multiplied by 3 plus 1
                            0    # Until the element is 0
Jo King
la source
2

Python 2, 54 52 44 octets

n=input()
while n:print n;n=(n*3+1,n/2)[n%2]

-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!

Quintec
la source
-2 octets
M. Xcoder
@ Mr.Xcoder Ah, merci.
Quintec
1
50 octets
Jo King
Bien que le 0soit désormais facultatif, il est donc plus court de se débarrasser du secondprint
Jo King
En effet, maintenant vous pouvez le faire en 44
M. Xcoder
2

Haskell , 76 69 61 56 octets

J'ai l'impression que c'est beaucoup trop long. Ici lproduit 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!

fst.span(>0).l
l r=r:[last$3*k+1:[div k 2|odd k]|k<-l r]

Essayez-le en ligne!

flawr
la source
Il n'y a pas de nombres négatifs, cela (>0)devrait donc suffire. Il y a aussi une oddfonction.
Ørjan Johansen
@ ØrjanJohansen Merci beaucoup!
flawr
2

05AB1E , 15 14 octets

[Ð=_#Èi3*>ë<2÷

-1 octet grâce à @MagicOctopusUrn .

Essayez-le en ligne.

Explication:

[             # Start an infinite loop
 Ð            #  Duplicate the top value on the stack three times
              #  (Which will be the (implicit) input in the first iteration)
  =           #  Output it with trailing newline (without popping the value)
   _#         #  If it's exactly 0: stop the infinite loop
     Èi       #  If it's even:
       3*     #   Multiply by 3
         >    #   And add 1
      ë       #  Else:
       <      #   Subtract 1
        2÷    #   And integer-divide by 2
Kevin Cruijssen
la source
[Ð=_#Èi3*>ë<2÷avec =au lieu de D,.
Urne de poulpe magique
@MagicOctopusUrn Ah, c'était assez mauvais à oublier .. Merci! :)
Kevin Cruijssen
2

JAEL , 18 octets

![ؼw>î?èÛ|õÀ

Essayez-le en ligne!

Eduardo Hoefel
la source
1
Votre permalien ne semble pas fonctionner. Le programme imprime simplement l'entrée et s'arrête.
Dennis
Oui tu as raison. Je vais demander à "eux" de tirer la dernière version: P
Eduardo Hoefel
J'ai ajouté JAEL à la liste des langues de golf . Veuillez me faire savoir si j'ai obtenu des informations erronées :-)
ETHproductions
@ETHproductions Merci beaucoup: DI pense que je pourrais dire que la spécialité est le package utilitaire qui aide le programmeur à compresser le code, mais c'est juste moi qui essaie de le commercialiser.
Eduardo Hoefel
1

Wolfram Language (Mathematica) , 35 octets

0<Echo@#&&#0[3#+1-(5#+3)/2#~Mod~2]&

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écursif 3#+1-(5#+3)/2#~Mod~2, ce qui simplifie 3#+1quand #est pair et (#-1)/2quand #est impair.

Misha Lavrov
la source
1

PowerShell, 53 52 octets

param($i)for(;$i){$i;$i=(($i*3+1),($i-shr1))[$i%2]}0

Essayez-le en ligne!

Edit:
-1 octet grâce à @mazzy

J. Bergmann
la source
vous pouvez essayer à la for(;$i)placewhile($i)
mazzy
1

Emojicode 0,5 , 141 octets

🐖🎅🏿🍇🍮a🐕😀🔡a 10🔁▶️a 0🍇🍊😛🚮a 2 1🍇🍮a➗a 2🍉🍓🍇🍮a➕✖️a 3 1🍉😀🔡a 10🍉🍉

Essayez-le en ligne!

🐖🎅🏿🍇
🍮a🐕      👴 input integer variable 'a'
😀🔡a 10      👴 print input int
🔁▶️a 0🍇      👴 loop while number isn’t 0
🍊😛🚮a 2 1🍇     👴 if number is odd
🍮a➗a 2       👴 divide number by 2
🍉
🍓🍇      👴 else
🍮a➕✖️a 3 1   👴 multiply by 3 and add 1
🍉
😀🔡a 10     👴 print iteration
🍉🍉
X1M4L
la source
1

MathGolf , 12 octets

{o_¥¿½É3*)}∟

Essayez-le en ligne!

Explication

{             Start block of arbitrary length
 o            Output the number
  _           Duplicate
   ¥          Modulo 2
    ¿         If-else with the next two blocks. Implicit blocks consist of 1 operator
     ½        Halve the number to integer (effectively subtracting 1 before)
      É       Start block of 3 bytes
       3*)    Multiply by 3 and add 1
          }∟  End block and make it do-while-true
maxb
la source
J'ai ajouté MathGolf à la liste des langues de golf - n'hésitez pas à me corriger si je me trompe :-)
ETHproductions
Merci de l'avoir ajouté! Tout me semble juste.
maxb
1

code machine x86, 39 octets

00000000: 9150 6800 0000 00e8 fcff ffff 5958 a901  .Ph.........YX..
00000010: 0000 0074 04d1 e8eb 066a 035a f7e2 4009  ...t.....j.Z..@.
00000020: c075 dec3 2564 20                        .u..%d 

Assemblage (syntaxe NASM):

section .text
	global func
	extern printf
func:					;the function uses fastcall conventions
	xchg eax, ecx			;load function arg into eax
	loop:
		push eax
		push fmt
		call printf	;print eax
		pop ecx
		pop eax
		test eax, 1	;if even zf=1
		jz even		;if eax is even jmp to even
		odd:		;eax=eax/2
			shr eax, 1
			jmp skip
		even:		;eax=eax*3+1
			push 3
			pop edx
			mul edx
			inc eax
		skip:
		or eax, eax
		jne loop	;if eax!=0, keep looping
	ret			;return eax
section .data
	fmt db '%d '

Essayez-le en ligne!

Logern
la source
1

R , 66 61 octets

-5 octets grâce à Robert S. pour consolider ifelse dans ifet supprimer les crochets, et x! = 0 à x> 0

print(x<-scan());while(x>0)print(x<-`if`(x%%2,(x-1)/2,x*3+1))

au lieu de

print(x<-scan());while(x!=0){print(x<-ifelse(x%%2,(x-1)/2,x*3+1))}

Essayez-le en ligne!

Sumner18
la source
1
61 octets
Robert S.
0

perl -Minteger -nlE, 39 octets

{say;$_=$_%2?$_/2:3*$_+1 and redo}say 0

la source
0

Ajouter ++ , 38 35 33 octets

D,f,@:,d3*1+$2/iA2%D
+?
O
Wx,$f>x

Essayez-le en ligne!

Comment ça fonctionne

Tout d'abord, nous commençons par définir une fonction F(X), qui prend un seul argument, effectue l'opération Collatz inversée sur Xsort ensuite le résultat. C'est,

F(X)={Xest même,3X+1Xest impair,X2

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 ( d), pour donnerS=[X,X]. Nous donnons ensuite la première option possible,3X+1( 3*1+), permutez les deux premières valeurs, puis calculezX2, en quittant S=[3X+1,X2].

Ensuite, nous poussons X à Set calculez le peu de X c'est à dire X%2, où a%b denotes the remainder when dividing a by b. This leaves us with S=[3x+1,x2,(x%2)]. Finally, we use D to select the element at the index specified by (x%2). If that's 0, we return the first element i.e. 3x+1, otherwise we return the second element, x2.

That completes the definition of f(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, +? is identical to x+?, and assigns the input to x, but as x is the active variable, it can be omitted. Next, we output x, then entire the while loop, which loops for as long as x0. The loop is very simple, consisting of a single statement: $f>x. All this does is run f(x), then assign that to x, updating x on each iteration of the loop.

caird coinheringaahing
la source
Just to understand: Is the break line part of the code? Or is it just for better explanation? I don't really know this language.
Eduardo Hoefel
@EduardoHoefel Break line?
caird coinheringaahing
@cairdcoinheringaahing The newline characters, presumably.
Lynn
0

Retina 0.8.2, 46 bytes

.+
$*
{*M`1
^(..)+$
$&$&$&$&$&$&111
1(.*)\1
$1

Try it online! Explanation:

.+
$*

Convert to unary.

{

Repeat until the value stops changing.

*M`1

Print the value in decimal.

^(..)+$
$&$&$&$&$&$&111

If it is even, multiply by 6 and add 3.

1(.*)\1
$1

Subtract 1 and divide by 2.

The trailing newline can be suppressed by adding a ; before the {.

Neil
la source
0

Racket, 75 bytes

(define(f n)(cons n(if(= n 0)'()(if(odd? n)(f(/(- n 1)2))(f(+(* 3 n)1))))))

Try it online!

Equivalent to JRowan's Common Lisp solution.

Galen Ivanov
la source
0

C# (.NET Core), 62 bytes

a=>{for(;a>0;a=a%2<1?a*3+1:a/2)Console.Write(a+" ");return a;}

Try it online!

Ungolfed:

a => {
    for(; a > 0;                // until a equals 0
        a = a % 2 < 1 ?             // set a depending on if a is odd or even
                a * 3 + 1 :             // even
                a / 2                   // odd (minus one unnecessary because of int casting)
    )
        Console.Write(a + " "); // writes the current a to the console
    return a;                   // writes a to the console (always 0)
}
Meerkat
la source