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>