Sequence: smallest number greater than previous term with exactly n divisors: Difference between revisions

Content added Content deleted
Line 300: Line 300:
=={{header|Haskell}}==
=={{header|Haskell}}==
<lang haskell>import Text.Printf (printf)
<lang haskell>import Text.Printf (printf)
import Control.Monad (guard)


sequence_A069654 :: [(Int,Int)]
sequence_A069654 :: [(Int,Int)]
sequence_A069654 = go 1 $ (,) <*> length . divisors <$> [1..]
sequence_A069654 = go 1 $ (,) <*> countDivs <$> [1..]
where
where
divisors n = [1..floor (sqrt $ realToFrac n)] >>= \x -> do
countDivs n = foldr f 0 [1..floor (sqrt $ realToFrac n)]
where
guard (n `mod` x == 0)
let y = n `div` x
f d r | n `mod` d == 0 = let y = n `div` d in if d == y then succ r else r+2
if x == y then [x] else [x,y]
| otherwise = r
go t ((n,d):xs) | d == t = (t,n):go (succ t) xs
go t ((n,d):xs) | d == t = (t,n):go (succ t) xs
| otherwise = go t xs
| otherwise = go t xs


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