Skip to content

Instantly share code, notes, and snippets.

@cmoore
Created June 8, 2009 19:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cmoore/126021 to your computer and use it in GitHub Desktop.
Save cmoore/126021 to your computer and use it in GitHub Desktop.
module Euler where
import List
import Control.Parallel
import Char
is_by_5 x = x `mod` 5 == 0
is_by_3 x = x `mod` 3 == 0
div_by :: Int -> Int -> Bool
div_by i x =
case i `mod` x of
0 -> False
_ -> True
sa [] = 0
--sa [x] = x
sa (x:xs) = x + sa xs
problem_one = sa $ nub $ filter is_by_3 [ 1..999 ] ++ filter is_by_5 [ 1..999 ]
--
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
test_fib x
| x < 4000000 = True
| otherwise = False
parfib n
| n < 11 = fib n
| otherwise = f1 `par` ( f2 `pseq` (f1 + f2))
where
f1 = parfib ( n-1 )
f2 = parfib ( n-2 )
cnl_clink :: Int -> [ Int ]
cnl_clink x =
let lx = fib x
in
if lx > 4000000 then
[]
else
[lx] ++ cnl_clink (x + 1)
problem_two = do
sa $ filter even $ cnl_clink 1
--
gpfsearch f x | x == f = x
| divides x f = gpfsearch f ( div x f )
| otherwise = gpfsearch ( f + 1 ) x
where divides x y = mod x y == 0
--
nx = [ 100 .. 999 ]
is_pal :: Int -> Int
is_pal x =
case ( show x ) == ( reverse $ show x ) of
True ->
x
_ -> 0
fix :: Int -> Int -> Int
fix x y =
is_pal $ x * y
problem_four =
sort $ filter (>0) $ concat $ map (\x ->
map( \y ->
fix x y ) nx
) nx
--
c_s x = nub $ map ( x `mod` ) [ 1..20 ]
f_x x = case ( length $ c_s x ) of
1 ->
x
_ -> f_x (x + 1)
--
problem_six =
let sum_of_squares = sa $ map (\x -> x * x ) [ 1..100]
sum_of_numbers = sa [1..100]
in
( sum_of_numbers * sum_of_numbers ) - sum_of_squares
--
isprime :: Int -> Bool
isprime x | x < 2 = False
| x == 2 || x == 3 = True
| mod x 2 == 0 = False
| divisibleByOdd x 3 == False = True
| otherwise = False
divisibleByOdd x y | mod x y == 0 = True
| y * y <= x = divisibleByOdd x ( y + 2 )
| otherwise = False
tk :: Int -> [ Int ] -> [ Int ]
tk x y = case ( length y ) < 10001 of
True ->
case isprime x of
True ->
tk ( x + 1 ) ( [x] ++ y )
False ->
tk ( x + 1 ) y
False ->
y
fst :: [x] -> x
fst (x:xs) = x
problem_seven :: Int
problem_seven =
Euler.fst $ tk 1 []
--
p8 = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"
tx :: String -> [ Int ]
tx [x] = [digitToInt x]
tx (x:xs) =
[ digitToInt x ] ++ tx xs
lfix :: [Int] -> [Int]
lfix (a:b:c:d:e:xs) = [ a * b * c * d * e ] ++ (lfix $ [b,c,d,e] ++ xs )
lfix (a:b:c:d:xs) = [ a * b * c * d ] ++ ( lfix $ [ b, c, d ] ++ xs )
lfix (a:b:c:xs) = [ a * b * c ] ++ ( lfix $ [b,c] ++ xs )
lfix (a:b:xs) = [ a * b ] ++ ( lfix $ [b] ++ xs )
lfix (a:_) = [ a ]
lfix _ = [0]
problem_eight = Euler.fst $ reverse $ sort $ lfix $ tx p8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment