Haskell Quiz/Weird Numbers/Solution Ninju
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
module Main where
import System.Environment
main :: IO ()
main = do args <- getArgs
let max = read (head args)
if length args == 1
then do putStrLn $ "The weird numbers up to " ++ (head args) ++ ":"
print $ takeWhile (<= max) weirdNumbers
else putStrLn "Usage: weird_numbers LIMIT"
weirdNumbers :: [Integer]
weirdNumbers = filter weird [70..]
where
weird n = sum (divisors n) > n && (not . any (==n) . map sum . subsets . divisors) n
divisors :: Integer -> [Integer]
divisors n = filter ((==0) . (mod n)) [1..(n `div` 2)]
subsets :: [a] -> [[a]]
subsets [] = [[]]
subsets (x:xs) = subsets xs ++ map (x:) (subsets xs)