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
|