Skip to content

Instantly share code, notes, and snippets.

@vaibhavsagar
Created September 8, 2016 13:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vaibhavsagar/362c72b71e5f2fad8707a460235c6c8e to your computer and use it in GitHub Desktop.
Save vaibhavsagar/362c72b71e5f2fad8707a460235c6c8e to your computer and use it in GitHub Desktop.
Code dojo solution for Week 4 with @sofiajeanne
import Control.Monad.Trans.State
import Data.Map.Strict as Map
import Data.Set as Set
triangle n = sum [1..n]
factors n = [f | f <- [1..n], n `mod` f == 0 ]
addFactors :: Int -> Int -> Map.Map Int (Set.Set Int) -> Map.Map Int (Set.Set Int)
addFactors n i factorMap
| n == i = Map.insert n (Set.fromList (factors n)) factorMap
| otherwise = case () of
_ | Map.member n factorMap -> factorMap
_ | n `rem` i /= 0 -> addFactors n (i+1) factorMap
_ | n `rem` i == 0 -> let
q = n `div` i
factorMap' = addFactors i 2 factorMap
factorMap'' = addFactors q 2 factorMap'
qFactors = factorMap'' Map.! q
qMultiples = Set.map (*i) qFactors
nFactors = Set.union qMultiples qFactors
in Map.insert n nFactors factorMap''
factor1 = Map.singleton 1 $ Set.singleton 1
factorCount n = do
knownFactors <- get
let updated = addFactors n 2 knownFactors
put updated
return $ Set.size $ updated Map.! n
main = print $ triangle . fst . head $ Prelude.filter ((>500) . snd) $
zip [10000..20000] $ evalState (mapM (factorCount . triangle) [10000..20000]) factor1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment