Sum multiples of 3 and 5: Difference between revisions

Content added Content deleted
(→‎JS ES6: Tidied code, added formatting for output.)
Line 1,505: Line 1,505:
<lang haskell>import Data.List (nub)
<lang haskell>import Data.List (nub)


sum35 :: Integral a => a -> a
sum35 :: Integer -> Integer
sum35 n =
sum35 n = sumMul n 3 + sumMul n 5 - sumMul n 15
let f = sumMul n
in f 3 + f 5 - f 15


sumMul :: Integral a => a -> a -> a
sumMul :: Integer -> Integer -> Integer
sumMul n f = f * n1 * (n1 + 1) `div` 2
sumMul n f =
let n1 = (n - 1) `div` f
where
n1 = (n - 1) `div` f
in f * n1 * (n1 + 1) `div` 2


-- Functions below are for variable length inputs
-- For variable length inputs:
pairLCM :: [Integer] -> [Integer]

pairLCM :: Integral a => [a] -> [a]
pairLCM [] = []
pairLCM [] = []
pairLCM (x:xs) = (lcm x <$> xs) ++ pairLCM xs
pairLCM (x:xs) = (lcm x <$> xs) ++ pairLCM xs


sumMulS :: Integral a => a -> [a] -> a
sumMulS :: Integer -> [Integer] -> Integer
sumMulS _ [] = 0
sumMulS _ [] = 0
sumMulS n s = sum (sumMul n <$> ss) - sumMulS n (pairLCM ss)
sumMulS n s = (((-) . sum . fmap (sumMul n)) <*> (sumMulS n . pairLCM)) (nub s)
where
ss = nub s


main :: IO ()
main :: IO ()