## Solving Project Euler Problems in Haskell

Currently i am trying to learn Haskell which i motivated to learn because of functional approach in python. Initially it was like cryptic but as i started learning , the cryptic part converted into motivation to make code as much short as possible and possibly introducing cryptic part. There is lot a tutorial on Haskell. I followed Learn Haskell for Great good , Real world Haskell and there are many more on Haskell Learning. Apart from that if you want to learn a language then apply that. I tried to solve some initial problems on project Euler. Although i am not a expert of Haskell but i am trying to learn and i am feeling that this language is cool and possible one of the best functional language( This is my second encounter of functional language after python 🙂 ). Here are some Haskell codes which i used to solve project Euler problems.

--problem 1 --sum' ::[Int]->Int --sum' (p:ps) | length (p:ps) ==1 = p -- | length (p:ps) >=2 = p + sum' ps -- | otherwise =0 plist = [x|x<-[1..999],(mod x 3) ==0 || (mod x 5) ==0] --s = sum' plist s= sum plist --problem 2 sum' :: [Integer]->Integer sum' (p_1:ps) | p_1>=4000000 && (mod p_1 2) ==0 = 0 | p_1<4000000 && (mod p_1 2) ==0 = p_1 + sum' ps | otherwise = sum' ps fib :: [Integer] fib = 1:2:zipWith (+) fib (tail fib) s_1 :: Integer s_1 = sum' fib s_2 :: Integer s_2 = sum $ filter (even) $ takeWhile (<4000000) fib --problem 3 prime ::Integer-> Bool prime n=primet n plist primet :: Integer-> [Integer]-> Bool primet n (p:ps) | n==2 = True | (n<=1) || (mod n 2) ==0 = False | p*p> n = True | ( mod n p )==0 = False | otherwise = primet n ps plist :: [Integer] plist = 2:3:filter prime [5,7..] factor :: Integer->[Integer] factor n = fact n plist fact :: Integer->[Integer]->[Integer] fact n (p:ps) | p*p> n = [n] | (mod n p) ==0 = p:fact (div n p) (p:ps) | otherwise = fact n ps --problem 4 fun_1 :: Integer->Integer fun_1 n = rev n (len' n) where rev n t | n==0 = 0 | otherwise = (mod n 10)*(10^t) + rev (div n 10) (t-1) len' n | n<10 = 0 | otherwise = 1 + len' ( div n 10) fun_2:: Integer-> Bool fun_2 n = n == fun_1 n s= maximum $ filter fun_2 [x*y | x<-[100..999],y<-[x..999]] --problem 5 s :: Integer s= foldr lcm 1 [1..20] --problem 6 fun :: Integer->Integer fun n = (div (n*n*(n+1)*(n+1)) 4) - (div (n*(n+1)*(2*n+1)) 6) s= fun 100 --problem 7 prime :: Integer-> Bool prime n = primet n plist primet :: Integer->[Integer]->Bool primet n (p:ps) | p*p>n = True -- chk upto square root | (mod n p)==0 = False | otherwise = primet n ps plist :: [Integer] plist = 2:filter prime [3,5..] s::Integer s=plist!!10000 --problem 9 s :: Integer s= head [(a*b*c)|m<-[1..],n<-[1..m-1], let a=2*m*n ,let b=(m^2 - n^2) ,let c = (m^2 + n^2), a+b+c == 1000 && (a^2 + b^2 == c^2)]

No comments yet.

## Leave a Reply