🎉 Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io 🎉 # nicolemon's solution

## to Collatz Conjecture in the Haskell Track

Published at Jul 28 2018 · 0 comments
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

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.

## Getting Started

For installation and learning resources, refer to the exercism help page.

## Running the tests

To run the test suite, execute the following command:

``````stack test
``````

#### If you get an error message like this...

``````No .cabal file found in directory
``````

You are probably running an old stack version and need to upgrade it.

#### Otherwise, if you get an error message like this...

``````No compiler found, expected minor version match with...
Try running "stack setup" to install the correct GHC...
``````

Just do as it says and it will download and install the correct compiler version:

``````stack setup
``````

## Running GHCi

If you want to play with your solution in GHCi, just run the command:

``````stack ghci
``````

## Feedback, Issues, Pull Requests

The exercism/haskell repository on GitHub is the home for all of the Haskell exercises.

If you have feedback about an exercise, or want to help implementing a new one, head over there and create an issue. We'll do our best to help you!

## Source

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

## Submitting Incomplete Solutions

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

### Tests.hs

``````{-# OPTIONS_GHC -fno-warn-type-defaults #-}
{-# LANGUAGE RecordWildCards #-}

import Data.Foldable     (for_)
import Test.Hspec        (Spec, describe, it, shouldBe)
import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith)

import CollatzConjecture (collatz)

main :: IO ()
main = hspecWith defaultConfig {configFastFail = True} specs

specs :: Spec
specs = describe "collatz" \$ for_ cases test
where

test Case{..} = it description assertion
where
assertion = collatz number `shouldBe` expected

data Case = Case { description :: String
, number      :: Integer
, expected    :: Maybe Integer
}

cases :: [Case]
cases = [ Case { description = "zero steps for one"
, number      = 1
, expected    = Just 0
}
, Case { description = "divide if even"
, number      = 16
, expected    = Just 4
}
, Case { description = "even and odd steps"
, number      = 12
, expected    = Just 9
}
, Case { description = "Large number of even and odd steps"
, number      = 1000000
, expected    = Just 152
}
, Case { description = "zero is an error"
, number      = 0
, expected    = Nothing
}
, Case { description = "negative value is an error"
, number      = -15
, expected    = Nothing
}
]``````
``````module CollatzConjecture (collatz) where

collatz :: Integer -> Maybe Integer
collatz n
| n <= 0    = Nothing
| otherwise = Just (collatz' n)

collatz' :: Integer -> Integer
collatz' 1 = 0
collatz' n
| even n = 1 + collatz' (div n 2)
| odd n = 1 + collatz' (3 * n + 1)``````