無駄に複雑な関数型 FizzBuzz(Ruby)

trans = ->(i) {
  if i % 15 == 0
    "FizzBuzz"
  elsif i % 3 == 0
    "Fizz"
  elsif i % 5 == 0
    "Buzz"
  else
    i.to_s
  end
}

fizzbuzz = ->(n) {
  generate = ->(i, ar) {
    return ar if i > n
    generate[i + 1, ar + [trans[i]]]
  }
  generate[1, []]
}

p fizzbuzz[50]

何でも再帰で書きたくなる病…。ちなみに、逐字的に Lisp に移植できると思います。

※参考
FizzBuzz問題(Ruby) - Camera Obscura
みんな大好き FizzBuzz(Ruby, Python) - Camera Obscura