-
Notifications
You must be signed in to change notification settings - Fork 0
/
euler5.hs
26 lines (23 loc) · 925 Bytes
/
euler5.hs
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
import qualified Data.Map as Map
euler5 :: Int
euler5 = powersOf(countMaxExponent(allPrimeFactorsTo 20))
where
allPrimeFactorsTo :: Int -> [[Int]]
allPrimeFactorsTo max = [primeFactors(x)|x <- [2..max]]
where
primeFactors :: Int -> [Int]
primeFactors n
| null firstPrime = [n]
| otherwise = head firstPrime:primeFactors (n `div` head firstPrime)
where
firstPrime = [x|x<-[2..n `div` 2], n `mod` x == 0]
countMaxExponent :: [[Int]] -> Map.Map Int Int
countMaxExponent xs = Map.fromList(zip [1..20] [maximum(map(countItem y) x)|x <- [xs], y <- [1..20]])
where
countItem :: Int -> [Int] -> Int
countItem y xs = length(filter(== y) xs)
powersOf :: Map.Map Int Int -> Int
powersOf xs = Map.foldWithKey f 1 xs
where
f :: Int -> Int -> Int -> Int
f k v r = r*(k^v)