From ad0acc15c9ed044f120aaf24fb707ae27ad60c37 Mon Sep 17 00:00:00 2001 From: Amneesh Singh Date: Thu, 27 Oct 2022 08:54:11 +0530 Subject: [PATCH] haskell: add [p4, p10] Signed-off-by: Amneesh Singh --- haskell/Lib.hs | 10 ++++++++-- haskell/p10.hs | 7 +++++++ haskell/p4.hs | 5 +++++ haskell/p5.hs | 5 +++++ haskell/p6.hs | 11 +++++++++++ haskell/p7.hs | 4 ++++ haskell/p8.hs | 35 +++++++++++++++++++++++++++++++++++ haskell/p9.hs | 6 ++++++ 8 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 haskell/p10.hs create mode 100644 haskell/p4.hs create mode 100644 haskell/p5.hs create mode 100644 haskell/p6.hs create mode 100644 haskell/p7.hs create mode 100644 haskell/p8.hs create mode 100644 haskell/p9.hs diff --git a/haskell/Lib.hs b/haskell/Lib.hs index ceab2bc..61e279f 100644 --- a/haskell/Lib.hs +++ b/haskell/Lib.hs @@ -1,13 +1,19 @@ -module Lib (fib, primeFactors) where +module Lib (fib, primes, primeFactors) where fib :: [Integer] fib = 1 : 2 : zipWith (+) fib (tail fib) +isPrime :: Integer -> Bool +isPrime n = n > 1 && null [[] | k <- [2 .. (floor $ sqrt $ fromIntegral n)], mod n k == 0] + +primes :: [Integer] +primes = 2 : filter isPrime [3, 4 ..] + primeFactors :: Integer -> [Integer] primeFactors n = genPrimeFactors n 2 where genPrimeFactors :: Integer -> Integer -> [Integer] genPrimeFactors n c - | c == n = [n] + | c * c > n = [n] | mod n c /= 0 = genPrimeFactors n (c + 1) | otherwise = c : genPrimeFactors (div n c) c diff --git a/haskell/p10.hs b/haskell/p10.hs new file mode 100644 index 0000000..4c28416 --- /dev/null +++ b/haskell/p10.hs @@ -0,0 +1,7 @@ +import Lib (primes) + +main :: IO () +main = putStr $ show solve + +solve :: Integer +solve = sum $ takeWhile (< 2000000) primes diff --git a/haskell/p4.hs b/haskell/p4.hs new file mode 100644 index 0000000..d9ea9c2 --- /dev/null +++ b/haskell/p4.hs @@ -0,0 +1,5 @@ +main :: IO () +main = putStr $ show solve + +solve :: Integer +solve = maximum [a * b | a <- [100 .. 999], b <- [a .. 999], let s = show $ a * b, s == reverse s] diff --git a/haskell/p5.hs b/haskell/p5.hs new file mode 100644 index 0000000..2dace3c --- /dev/null +++ b/haskell/p5.hs @@ -0,0 +1,5 @@ +main :: IO () +main = putStr $ show solve + +solve :: Integer +solve = foldl1 lcm [1 .. 20] diff --git a/haskell/p6.hs b/haskell/p6.hs new file mode 100644 index 0000000..abad48c --- /dev/null +++ b/haskell/p6.hs @@ -0,0 +1,11 @@ +main :: IO () +main = putStr $ show $ solve 100 + +solve :: Integer -> Integer +solve n = squareOfSum n - sumOfSquares n + where + squareOfSum :: Integer -> Integer + squareOfSum n = sum [1 .. n] ^ 2 + + sumOfSquares :: Integer -> Integer + sumOfSquares n = sum $ map (^ 2) [1 .. n] diff --git a/haskell/p7.hs b/haskell/p7.hs new file mode 100644 index 0000000..4f03585 --- /dev/null +++ b/haskell/p7.hs @@ -0,0 +1,4 @@ +import Lib (primes) + +main :: IO () +main = putStr $ show $ primes !! 10001 diff --git a/haskell/p8.hs b/haskell/p8.hs new file mode 100644 index 0000000..066fecb --- /dev/null +++ b/haskell/p8.hs @@ -0,0 +1,35 @@ +import Data.Char (digitToInt) + +main :: IO () +main = putStr $ show solve + +solve :: Int +solve = maximum $ map (product . map digitToInt) (substrings input 13) + where + substrings :: String -> Int -> [String] + substrings s n + | length s < n = [] + | otherwise = take n s : substrings (tail s) n + +input :: String +input = + "73167176531330624919225119674426574742355349194934\ + \96983520312774506326239578318016984801869478851843\ + \85861560789112949495459501737958331952853208805511\ + \12540698747158523863050715693290963295227443043557\ + \66896648950445244523161731856403098711121722383113\ + \62229893423380308135336276614282806444486645238749\ + \30358907296290491560440772390713810515859307960866\ + \70172427121883998797908792274921901699720888093776\ + \65727333001053367881220235421809751254540594752243\ + \52584907711670556013604839586446706324415722155397\ + \53697817977846174064955149290862569321978468622482\ + \83972241375657056057490261407972968652414535100474\ + \82166370484403199890008895243450658541227588666881\ + \16427171479924442928230863465674813919123162824586\ + \17866458359124566529476545682848912883142607690042\ + \24219022671055626321111109370544217506941658960408\ + \07198403850962455444362981230987879927244284909188\ + \84580156166097919133875499200524063689912560717606\ + \05886116467109405077541002256983155200055935729725\ + \71636269561882670428252483600823257530420752963450" diff --git a/haskell/p9.hs b/haskell/p9.hs new file mode 100644 index 0000000..4d40e84 --- /dev/null +++ b/haskell/p9.hs @@ -0,0 +1,6 @@ +main :: IO () +main = putStr $ show $ solve 1000 + +-- Brute search because don't care 🧌 +solve :: Integer -> Integer +solve p = head [a * b * c | a <- [1 .. p], b <- [a + 1 .. p], let c = p - a - b, c > 0 && c ^ 2 == a ^ 2 + b ^ 2]