Skip to content

Instantly share code, notes, and snippets.

@eagletmt
Created July 19, 2010 09:38
Show Gist options
  • Save eagletmt/481205 to your computer and use it in GitHub Desktop.
Save eagletmt/481205 to your computer and use it in GitHub Desktop.
-- http://projecteuler.net/index.php?section=problems&id=14
{-# OPTIONS_GHC -O2 #-}
import Data.List (maximumBy)
import Data.Ord (comparing)
import Control.Applicative ((<$>))
import Control.Monad (forM_)
import Data.Array.Unboxed (UArray, assocs)
import Data.Array.ST (runSTUArray, newArray, readArray, writeArray)
collatz :: Integer -> Integer
collatz n
| even n = n `div` 2
| otherwise = 3*n + 1
collatzLens :: Int -> UArray Int Int
collatzLens n = runSTUArray $ do
memo <- newArray (0,n) 0
writeArray memo 1 1
forM_ [2 .. toInteger n] $
let go i
| i > toInteger n = (+1) <$> go (collatz i)
| otherwise = do
v <- readArray memo (fromIntegral i)
if v /= 0
then return v
else do
w <- (+1) <$> go (collatz i)
writeArray memo (fromIntegral i) w
return w
in go
return memo
main = print . solve $ 1000000
where
solve = fst . maximumBy (comparing snd) . assocs . collatzLens
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment