クレオール

Problem 20 - 毛のはえたようなもの
Problem 25 - 毛のはえたようなもの
をみて、書きたいコードがあまりにも違って面白かったので。


Project Euler は半分弱 Haskell で解いたこともあり思いつくアルゴリズムから Haskell の香りが漂う。

100! の各桁の数字の和を求めよ。

#project euler 20
p (1..100).to_a.inject(1){|a,b|a*b}.to_s.scan(/[0-9]/).map{|a|a.to_i}.inject(0){|a,b|a+b}

これはどう考えても

main = putStrLn $ show $ sum $ map (read.(:[])) $ show $ product [1..100]

の影響。

はじめに1000桁になるフィボナッチ数列の項の数

#project euler 25
c=[[1,1]]
p c.inject(0){|i,(n,f)| if f <10**999 then c << [n+1,i+f];f else n end}

こっちは

main = putStrLn $ show (let fib = 1: 1: zipWith(+) fib (tail fib) in fst $ head $ dropWhile ((<10^999).snd) $ zip [1..] fib)

を髣髴とさせるでしょう。


もうひとつ思いついたこっちは Lisp っぽいかな。

#project euler 25
def f(n,a,b)
  if a < 10**999
    f(n+1,b,a+b)
  else
    n
  end
end
f(1,1,1)
main = putStrLn $ show $ f 1 1 1
  where
    f n a b
      | a < 10^999 = f (n+1) b (a+b)
      | otherwise   = n

いつも inject で副作用するようなひどいコードを書いているわけではない。