92問目
http://projecteuler.net/index.php?section=problems&id=92
ある数の各桁の数字を二乗して和をとるという操作を繰り返すとき、どのような数から始めても、1 または 89 を必ず含む無限ループとなる。一千万未満の数のうち、89 を含む無限ループに陥るものがどれだけあるか求める。
import Data.Array import Data.Char main = print $ euler092 10000000 euler092 :: Int -> Int euler092 m = length $ filter (== 89) $ take m $ arrive arrive :: [Int] arrive = 0 : map arriveAt [1..] arriveAt :: Int -> Int arriveAt 1 = 1 arriveAt 89 = 89 arriveAt n = (arrive !!) $ sum $ map (squares !) $ show n squares :: Array Char Int squares = array ('0', '9') [ (intToDigit x, x^2) | x <- [0..9] ]