ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# epequeno's solution

## to Collatz Conjecture in the Elm Track

Published at Apr 19 2021 · 0 comments
Instructions
Test suite
Solution

The Collatz Conjecture or 3x+1 problem can be summarized as follows:

Take any positive integer n. If n is even, divide n by 2 to get n / 2. If n is odd, multiply n by 3 and add 1 to get 3n + 1. Repeat the process indefinitely. The conjecture states that no matter which number you start with, you will always reach 1 eventually.

Given a number n, return the number of steps required to reach 1.

## Examples

Starting with n = 12, the steps would be as follows:

1. 12
2. 6
3. 3
4. 10
5. 5
6. 16
7. 8
8. 4
9. 2
10. 1

Resulting in 9 steps. So for input n = 12, the return value would be 9.

## Elm Installation

Refer to the Installing Elm page for information about installing elm.

## Writing the Code

The code you have to write is located inside the `src/` directory of the exercise. Elm automatically installs packages dependencies the first time you run the tests so we can start by running the tests from the exercise directory with:

``````\$ elm-test
``````

To automatically run tests again when you save changes:

``````\$ elm-test --watch
``````

As you work your way through the tests suite in the file `tests/Tests.elm`, be sure to remove the `skip <|` calls from each test until you get them all passing!

## Source

An unsolved problem in mathematics named after mathematician Lothar Collatz https://en.wikipedia.org/wiki/3x_%2B_1_problem

## Submitting Incomplete Solutions

It is possible to submit an incomplete solution so you can see how others have completed the exercise.

### Tests.elm

``````module Tests exposing (tests)

import CollatzConjecture exposing (collatz)
import Expect
import Test exposing (..)

tests : Test
tests =
describe "CollatzConjecture tests"
[ test "zero steps for one" <|
\() ->
Expect.equal (Ok 0) (collatz 1)

-- Once you get the first test passing, remove the
-- `skip <|` (just leave the comma) on the next
-- lines to continue!
, skip <|
test "divide if even" <|
\() ->
Expect.equal (Ok 4) (collatz 16)
, skip <|
test "even and odd step" <|
\() ->
Expect.equal (Ok 9) (collatz 12)
, skip <|
test "Large number of even and odd step" <|
\() ->
Expect.equal (Ok 152) (collatz 1000000)
, skip <|
test "zero is an error" <|
\() ->
Expect.equal (Err "Only positive numbers are allowed") (collatz 0)
, skip <|
test "negative values is an error" <|
\() ->
Expect.equal (Err "Only positive numbers are allowed") (collatz -15)
]``````
``````module CollatzConjecture exposing (collatz)

collatz : Int -> Result String Int
collatz start =
if start <= 0 then
Err "Only positive numbers are allowed"

else
Ok (collazPos start)

collazPos n =
if n == 1 then
0

else
1
+ (if isEven n then
collazPos (n // 2)

else
collazPos (3 * n + 1)
)

isEven n =
modBy 2 n == 0

isOdd n =
not (isEven n)``````