クレオール
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 で副作用するようなひどいコードを書いているわけではない。