aboutsummaryrefslogtreecommitdiff
path: root/challenge-164/alexander-pankoff/haskell/ch-2.hs
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))