aboutsummaryrefslogtreecommitdiff
path: root/challenge-054/ulrich-rieke/haskell/ch-2.hs
blob: 2d1fac401676648f7e69bc03b87cbce91324fe9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
module Collatz
  where
import Control.Monad.State.Lazy
import Data.List( sortBy )

findSequence :: State ( Int , [Int] ) [Int]
findSequence = do
  ( n, sequence ) <- get
  if n == 1
      then return (sequence )
  else do
      put (nextNum n , sequence ++ [nextNum n])
      findSequence


nextNum :: Int -> Int
nextNum n
  |even n = div n 2
  |odd n = n * 3 + 1

numbersequence :: Int -> [Int]
numbersequence n = evalState findSequence ( n , [] )

solution :: [(Int, Int)]
solution = take 20 $ sortBy mySorter $ map (\i -> (i , length $ numbersequence i) ) [1..1000000]
  where
      mySorter :: (Int, Int ) -> (Int , Int ) -> Ordering
      mySorter p1 p2
    |snd p1 > snd p2 = LT
    |snd p1 == snd p2 = EQ
    |snd p1 < snd p2 = GT