Project Euler Problems 4-8 12 Jan 2009
More Haskell, more Project Euler. Again I thought I would share my solutions to the next few problems. I should point out in advance that, for the most part, these are naive solutions. I plan on taking a second pass later to devise more clever approaches.
Problem 4
answer = maximum . filter isPalindrome $ products
where products = [ x*y | x <- [111..999], y <- [x..999] ]
isPalindrome n = n == reverse n 0
where reverse 0 r = r
reverse n r = reverse (n `div` 10) (r * 10 + n `mod` 10)
Problem 5
answer = head . filter good $ [20,40..]
where good n = not $ any (\t -> n `rem` t /= 0) [2..19]
Problem 6
answer = squareSum - sumSquare
where squareSum = (sum [1..100]) ^ 2
sumSquare = sum $ map (^2) [1..100]
Problem 7
primes :: [Integer]
primes = 2:3:primes'
where 1:p:candidates = [6*k+r | k <- [0..], r <- [1,5]]
primes' = p : filter isPrime candidates
isPrime n = all (not . divides n) $ takeWhile (\p-> p*p <= n) primes'
divides n p = n `mod` p == 0
answer = primes !! 10001
####Problem 8####
import Char
largestDigitProduct d n = maximum products
where products = [ digitProduct x digits | x <- [0..995]]
digitProduct t ds = product $ take d (drop t ds)
digits = map digitToInt (show n)
answer = largestDigitProduct 5 <number>