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)