Skip to content

Instantly share code, notes, and snippets.

@cloudhead
Created September 14, 2009 04:58
Show Gist options
  • Save cloudhead/186510 to your computer and use it in GitHub Desktop.
Save cloudhead/186510 to your computer and use it in GitHub Desktop.
-- Project Euler in Haskell --
-- by cloudhead --
-- "there's some real nasty code in here"
import Char
-- Some useful functions
--
prime :: Integer -> Bool
prime n = if null [ x | x <- [2..(ceiling $ sqrt (fromInteger n))], n `mod` x == 0 ]
then True
else False
factorial :: (Integral a) => a -> a
factorial 0 = 1
factorial n = n * factorial (n - 1)
--
euler1 :: Int
euler1 = sum [ x | x <- [0 .. 999], mod x 3 == 0 || mod x 5 == 0 ]
euler2 :: Int
euler2 = sum [ x | x <- (take 40 fib), (mod x 2) == 0, x < 4000000 ]
where fib = 0 : 1 : zipWith (+) fib (tail fib)
euler3 :: Integer -> Integer
euler3 x = head [ y | y <- [r, r - 1 .. 2], x `mod` y == 0, prime y ]
where r = ceiling $ sqrt (fromInteger x)
euler4 :: Integer
euler4 = maximum [ x * y
| x <- [1..999]
, y <- [x..999]
, palindromic (x * y)
] where
palindromic x = (show x) == reverse (show x)
euler5 :: Integer
euler5 = f 1
where f 20 = 20
f x = lcm x (f (x + 1))
euler6 :: Integer
euler6 = sum [ x | x <- [1..100] ] ^ 2 - sum [ x ^ 2 | x <- [1..100] ]
euler7 :: Integer
euler7 = last $ take 10001 [ x | x <- [1..], prime x ]
euler8 :: Integer
euler8 = maximum [ product (digitize xs) | xs <- take5 number ]
where take5 :: String -> [String]
take5 xs
| length xs <= 5 = [xs]
| otherwise = take 5 xs : take5 (tail xs)
digitize :: String -> [Integer]
digitize xs = [ toInteger (digitToInt x) | x <- xs ]
number = "7316717653133062" -- actual number is *way* longer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment