Project Eulerを始めてみた

Project Eulerを始めてみました。
Haskellの練習を兼ねています。
(むしろ、そちらが主目的かも)


とりあえず、Problems ID 1..5をクリア。
どこまでいけるやら。

ID 1

import List

uniq (x:[]) = [x]
uniq (x:xs) 
	| x == head xs = uniq xs
	| otherwise = (x:uniq xs)

multOf n = map ((*) n) [1..]

prog001 = sum $ uniq $ sort $ multOf3 ++ multOf5
	where
		multOf3 = takeWhile ((>) 1000) $ multOf 3
		multOf5 = takeWhile ((>) 1000) $ multOf 5

main = putStrLn $ show $ prog001

ID 2

import List

fibs n0 n1 = map fib [0..]
	where
		fib 0 = n0
		fib 1 = n1
		fib n = fib (n - 2) + fib (n - 1)

prog002 = sum $ takeWhile ((>) 4000000) $ filter even $ fibs 1 2

main = putStrLn $ show $ prog002

ID 3

import List

primes = [2] ++ sieve [3,5..]
	where sieve (p:ns) = [p] ++ (sieve $ filter (\n -> rem n p /= 0) ns)

factor 1 _ = []
factor m (n:ns)
	| rem m n == 0 = (n:factor (quot m n) (n:ns))
	| otherwise = factor m ns

primeFactors n = factor n primes

prog003 = last $ sort $ primeFactors 600851475143

main = putStrLn $ show $ prog003

ID 4

import List

isPalindromic n = (show n) == (reverse $ show n)

directProducts [] = [[]]
directProducts (l:ls) = [(x:xs) | x <- l, xs <- directProducts ls]

prog004 = last $ sort $ filter isPalindromic sq3digits
	where sq3digits = map product $ directProducts [[100..999],[100..999]]

main = putStrLn $ show $ prog004

ID 5

import List

prog005 = foldr lcm 1 [1..20]

main = putStrLn $ show $ prog005