Sum multiples of 3 and 5: Difference between revisions

Content added Content deleted
(→‎{{header|Haskell}}: Slightly decluttered test expression, added type signatures , generalised map to fmap, applied hindent, hlint)
Line 1,181: Line 1,181:
<lang haskell>import Data.List (nub)
<lang haskell>import Data.List (nub)


sum35 :: Integral a => a -> a
sumMul n f = f * n1 * (n1 + 1) `div` 2 where n1 = (n - 1) `div` f
sum35 n = sumMul n 3 + sumMul n 5 - sumMul n 15
sum35 n = sumMul n 3 + sumMul n 5 - sumMul n 15


sumMul :: Integral a => a -> a -> a
-- below are for variable length inputs
sumMul n f = f * n1 * (n1 + 1) `div` 2
where
n1 = (n - 1) `div` f

-- Functions below are for variable length inputs

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


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


main = do
main :: IO ()
main =
print $ sum35 1000
mapM_
print $ sum35 100000000000000000000000000000000
print $ sumMulS 1000 [3,5]
print
[ sum35 1000
print $ sumMulS 10000000 [2,3,5,7,11,13]</lang>
, sum35 100000000000000000000000000000000
, sumMulS 1000 [3, 5]
, sumMulS 10000000 [2, 3, 5, 7, 11, 13]
]</lang>
{{out}}
{{out}}
<pre>233168
<pre>233168