blob: 15d2f5a769ec05315d940b0019354819fe645261 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
module Main where
import Control.Monad (liftM2)
import Data.Bool (bool)
import qualified Data.IntSet as Set
import Data.List (unfoldr)
import Data.Tuple (swap)
main :: IO ()
main = print $ take 8 $ filter isHappyNumber [1 ..]
isHappyNumber :: Int -> Bool
isHappyNumber = go mempty
where
go _ 1 = True
go tested x =
not (x `Set.member` tested)
&& go (Set.insert x tested) (sum $ map (^ 2) $ digits x)
digits :: Integral a => a -> [a]
digits = reverse . unfoldr ((bool Nothing . (Just . swap . flip divMod 10)) <*> (/= 0))
|