Life Goes On

まあまあだけど楽しんでる方です

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] ]