Finished Problem 74; added alternate solution without Map just to compare runtimes
This commit is contained in:
parent
5cb3ece8bb
commit
68f0bc6cb8
4
74.hs
4
74.hs
|
@ -18,7 +18,7 @@ type ChainMap = Map.Map Integer Integer
|
||||||
initialMap :: ChainMap
|
initialMap :: ChainMap
|
||||||
initialMap = Map.fromList [(169, 3), (363601, 3), (1454, 3),
|
initialMap = Map.fromList [(169, 3), (363601, 3), (1454, 3),
|
||||||
(871, 2), (872, 2), (45361, 2), (45362, 2),
|
(871, 2), (872, 2), (45361, 2), (45362, 2),
|
||||||
(1, 1), (2, 1), (145, 1)]
|
(1, 1), (2, 1), (145, 1), (40585, 1)]
|
||||||
|
|
||||||
sumOfFactorialOfDigits :: Integer -> Integer
|
sumOfFactorialOfDigits :: Integer -> Integer
|
||||||
sumOfFactorialOfDigits n = sum $ map (digitFactorial . fromIntegral . digitToInt) $ show n
|
sumOfFactorialOfDigits n = sum $ map (digitFactorial . fromIntegral . digitToInt) $ show n
|
||||||
|
@ -35,5 +35,5 @@ numOfLoops :: Integer -> Integer -> (Integer, ChainMap)
|
||||||
numOfLoops bound length = foldr (\n (num, oldMap) -> let (chainLength, newMap) = getChainLength n oldMap
|
numOfLoops bound length = foldr (\n (num, oldMap) -> let (chainLength, newMap) = getChainLength n oldMap
|
||||||
in (num + if chainLength == length then 1 else 0, newMap)) (0, initialMap) [3..bound]
|
in (num + if chainLength == length then 1 else 0, newMap)) (0, initialMap) [3..bound]
|
||||||
|
|
||||||
main = print $ let (length, sizeMap) = numOfLoops 10000 60
|
main = print $ let (length, sizeMap) = numOfLoops 1000000 60
|
||||||
in length
|
in length
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
import Data.Char (digitToInt)
|
||||||
|
|
||||||
|
digitFactorial :: Integer -> Integer
|
||||||
|
digitFactorial n = case n of
|
||||||
|
0 -> 1
|
||||||
|
1 -> 1
|
||||||
|
2 -> 2
|
||||||
|
3 -> 6
|
||||||
|
4 -> 24
|
||||||
|
5 -> 120
|
||||||
|
6 -> 720
|
||||||
|
7 -> 5040
|
||||||
|
8 -> 40320
|
||||||
|
9 -> 362880
|
||||||
|
|
||||||
|
loops :: Integer -> Maybe Integer
|
||||||
|
loops n
|
||||||
|
| n `elem` [169, 363601, 1454] = Just 3
|
||||||
|
| n `elem` [871, 872, 45361, 45362] = Just 2
|
||||||
|
| n `elem` [1, 2, 145, 40585] = Just 1
|
||||||
|
| otherwise = Nothing
|
||||||
|
|
||||||
|
sumOfFactorialOfDigits :: Integer -> Integer
|
||||||
|
sumOfFactorialOfDigits n = sum $ map (digitFactorial . fromIntegral . digitToInt) $ show n
|
||||||
|
|
||||||
|
getChainLength :: Integer -> Integer
|
||||||
|
getChainLength n = getChainLengthRec n 1
|
||||||
|
|
||||||
|
getChainLengthRec :: Integer -> Integer -> Integer
|
||||||
|
getChainLengthRec n length =
|
||||||
|
let next = sumOfFactorialOfDigits n
|
||||||
|
in case loops next of
|
||||||
|
Just x -> length + x
|
||||||
|
Nothing -> getChainLengthRec next (length + 1)
|
||||||
|
|
||||||
|
numOfLoops :: Integer -> Integer -> Integer
|
||||||
|
numOfLoops bound length = foldr (\n num -> num + if getChainLength n == length then 1 else 0) 0 [3..bound]
|
||||||
|
|
||||||
|
main = print $ numOfLoops 1000000 60
|
Loading…
Reference in New Issue