# The inverse Collatz Conjecture

I think the Collatz Conjecture is already well-known. But what if we invert the rules?

Repeat the following steps:

If n is even, multiply it by 3 and add 1.

If n is odd, subtract 1 and divide it by 2.

Stop when it reaches 0

Print the iterated numbers.

### Test cases:

 1        => 1, 0
2        => 2, 7, 3, 1, 0
3        => 3, 1, 0
10        => 10, 31, 15, 7, 3...
14        => 14, 43, 21, 10, ...


### Rules:

• This sequence does not work for a lot of numbers because it enters in an infinite loop. You do not need to handle those cases. Only printing the test cases above is enough.

• I suggested to subtract 1 and divide by two to give a valid integer to continue, but it is not required to be computed that way. You may divide by 2 and cast to integer or whatever other methods that will give the expected output.

• You need to print the initial input as well.

• The output does not need to be formatted as the test cases. It was just a suggestion. However, the iterated order must be respected.

• The smallest code wins.

• As this is your third question in as many hours, I'd recommend that you check out the Sandbox, the place where we usually post question drafts for feedback, and to make sure they aren't duplicates. Nov 4, 2018 at 20:38
• Do we have to print the 0 at the end? Nov 4, 2018 at 23:01
• You might want to expand the last two test cases, since they're not that long
– Jo King
Nov 4, 2018 at 23:07
• @JoKing I compressed it because it repeats the output from the other lines. At the point you reach 3, it has the same output of when you start from it. The same applies for 10 or any other number. Nov 5, 2018 at 2:40

# Perl 6, 30 bytes

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


Try it online!

Anonymous code block that returns a sequence.

### Explanation:

{$_,{$_%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


f 0=[]
f n=n:f(cycle[3*n+1,div n 2]!!n)


Try it online!

Now without the final 0.

# Clean, 53 bytes

import StdEnv
$0=$n=[n: $if(isOdd n)(n/2)(n*3+1)]  Try it online! # Jelly, 9 bytes :++‘ƊḂ?Ƭ2  Try it online! # Python 2, 5452 44 bytes n=input() while n:print n;n=(n*3+1,n/2)[n%2]  -2 bytes thanks to Mr. Xcoder There must certainly be a faster way. Oddly, when I tried a lambda it was the same bytecount. I'm probably hallucinating. Try it online! • -2 bytes Nov 4, 2018 at 21:48 • @Mr.Xcoder Ah, thanks. Nov 4, 2018 at 21:50 • 50 bytes – Jo King Nov 4, 2018 at 23:25 • Though the 0 is now optional, so it's shorter to get rid of the second print – Jo King Nov 5, 2018 at 2:43 • Indeed, now you can do it in 44 Nov 5, 2018 at 11:16 # Haskell, 76 69 61 56 bytes I feel like this is way too long. Here l produces an infinite list of the inverse-collatz sequence, and the anonymous function at the first line just cuts it off at the right place. Thanks for -5 bytes @ØrjanJohansen! fst.span(>0).l l r=r:[last$3*k+1:[div k 2|odd k]|k<-l r]


Try it online!

• There are no negative numbers, so (>0) should suffice. Also there's an odd function. Nov 5, 2018 at 18:25
• @ØrjanJohansen Thanks a lot! Nov 5, 2018 at 20:32

# Rust, 65 64 bytes

|mut n|{while n>0{print!("{} ",n);n=if n&1>0{n>>1}else{n*3+1};}}


Try it online!

# 05AB1E, 15 14 bytes

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


-1 byte thanks to @MagicOctopusUrn.

Try it online.

Explanation:

[             # 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
ë       #  Else:
<      #   Subtract 1
2÷    #   And integer-divide by 2

• [Ð=_#Èi3*>ë<2÷ with = instead of D,. Nov 7, 2018 at 4:20
• @MagicOctopusUrn Ah, that was pretty bad to forgot.. Thanks! :) Nov 7, 2018 at 7:37

# JAEL, 18 bytes

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


Try it online!

• Your permalink doesn't seem to be working. The program just prints the input and halts. Nov 9, 2018 at 3:30
• Yes, you're right. I'll ask "them" to pull the latest version :P Nov 9, 2018 at 15:37
• I've added JAEL to the list of golfing languages. Please let me know if I got any information wrong :-) Nov 9, 2018 at 19:39
• @ETHproductions Thank you very much :D I think I could say that the specialty is the utility package that helps the programmer to compress the code, but that's just me trying to merchandise it. Nov 12, 2018 at 0:36

# JavaScript (ES6), 31 bytes

f=n=>n&&n+' '+f(n&1?n>>1:n*3+1)


Try it online!

Or 30 bytes in reverse order.

# Pyth, 12 bytes

.u?%N2/N2h*3


Try it here as a test suite!

# Wolfram Language (Mathematica), 35 bytes

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


Try it online!

0<Echo@# && ...& is short-circuit evaluation: it prints the input #, checks if it's positive, and if so, evaluates .... In this case, ... is #0[3#+1-(5#+3)/2#~Mod~2]; since #0 (the zeroth slot) is the function itself, this is a recursive call on 3#+1-(5#+3)/2#~Mod~2, which simplifies to 3#+1 when # is even, and (#-1)/2 when # is odd.

# Common Lisp, 79 bytes

(defun x(n)(cons n(if(= n 0)nil(if(=(mod n 2)0)(x(+(* n 3)1))(x(/(- n 1)2))))))


Try it online!

# PowerShell, 53 52 bytes

+?
O
Wx,$f>x  Try it online! ## How it works First, we begin by defining a function $$\f(x)\$$, that takes a single argument, performs the inverted Collatz operation on $$\x\$$ then outputs the result. That is, $$f(x) = \begin{cases} x \: \text{is even}, & 3x+1 \\ x \: \text{is odd}, & \lfloor\frac{x}{2}\rfloor \end{cases}$$ When in function mode, Add++ uses a stack memory model, otherwise variables are used. When calculating $$\f(x)\$$, the stack initially looks like $$\S = [x]\$$. We then duplicate this value (d), to yield $$\S = [x, x]\$$. We then yield the first possible option, $$\3x + 1\$$ (3*1+), swap the top two values, then calculate $$\\lfloor\frac{x}{2}\rfloor\$$, leaving $$\S = [3x+1, \lfloor\frac{x}{2}\rfloor]\$$. Next, we push $$\x\$$ to $$\S\$$, and calculate the bit of $$\x\$$ i.e. $$\x \: \% \: 2\$$, where $$\a \: \% \: b\$$ denotes the remainder when dividing $$\a\$$ by $$\b\$$. This leaves us with $$\S = [3x+1, \lfloor\frac{x}{2}\rfloor, (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, $$\\lfloor\frac{x}{2}\rfloor\$$. 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 $$\x \neq 0\$$. 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.

• 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. Nov 4, 2018 at 21:38
• @EduardoHoefel Break line? Nov 4, 2018 at 21:38
• @cairdcoinheringaahing The newline characters, presumably.
– Lynn
Nov 4, 2018 at 22:13

# Retina 0.8.2, 46 bytes

.+
$* {*M1 ^(..)+$
$&$&$&$&$&$&111
1(.*)\1
$1  Try it online! Explanation: .+$*


Convert to unary.

{


Repeat until the value stops changing.

*M1


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 {.

# Red, 70 bytes

func[n][print n if n = 0[exit]either odd? n[f n - 1 / 2][f n * 3 + 1]]


Try it online!

# 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.

# 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)
}


# Dart, 49 bytes

f(n){for(;n>0;n=n%2>0?(n-1)>>1:(n*3)+1)print(n);}


Try it online!

# Gambit Scheme (gsi), 74 bytes

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


Try it online!