1
0
Fork 0

Finished Problem 74; added alternate solution without Map just to compare runtimes

This commit is contained in:
Jonathan Chan 2017-07-13 11:52:55 -07:00
parent 5cb3ece8bb
commit 68f0bc6cb8
7 changed files with 41 additions and 2 deletions

BIN
74

Binary file not shown.

4
74.hs
View File

@ -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

BIN
74.o

Binary file not shown.

BIN
74_alt Executable file

Binary file not shown.

BIN
74_alt.hi Normal file

Binary file not shown.

39
74_alt.hs Normal file
View File

@ -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

BIN
74_alt.o Normal file

Binary file not shown.