Life Goes On

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

104問目

http://projecteuler.net/index.php?section=problems&id=104
最初の 9 桁にも最後の 9 桁にも 1 から 9 の数字が 1 回ずつ現れるようなフィボナッチ数で、最小のものを求める。
最初の 9 桁と最後の 9 桁だけ抜き出して計算しています。ただし最初の 9 桁を計算するときは、誤差があるので倍の 18 桁抜き出しています。

import Data.List

main = print $ euler104

euler104 :: Int
euler104 = head $ findIndices cond fibs

cond :: [Integer] -> Bool
cond = all ((== "123456789") . sort . take 9 . show)

fibs :: [[Integer]]
fibs = map head $ iterate next [[0, 0], [1, 1]] 

next :: [[Integer]] -> [[Integer]]
next [[f0, l0], [f1, l1]] = if (length' f0 > 2*m && length' f1 > 2*m)
    then [[head' f1, l1], [head' f2, last' l2]]
    else [[f1, l1], [f2, last' l2]]
    where m = 9
          f2 = f1 + f0
          l2 = l1 + l0
          length' = length . show
          head' = read . take (2*m) . show
          last' n = mod n (10^m)