いちおうプログラマですから

7分ほどかかってしまいましたすいません。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。

どうしてプログラマに・・・プログラムが書けないのか? via とりあえず素直に書き下してみた - ヤドカリデンキ商会(ブログ版)

全体を末尾再帰するとなんか面倒そうなんで、1〜100までのリストを作ってmap。

(let ((% (lambda (x y) (= 0 (remainder x y)))))
  (map
   (lambda (x) (cond
		((% x 15) 'FizzBuzz)
		((% x 5) 'Buzz)
		((% x 3) 'Fizz)
		(#t x)))
   (let loop((i 100) (ret ()))
     (if (< i 1) ret (loop (- i 1) (cons i ret))))))


追記

srfi-42なんて便利なものがあるんですねー → http://d.hatena.ne.jp/yuki_neko_nyan/20070508/1178624545

(use srfi-42)
(map
 (lambda (x)
   (let1 % (lambda(y)(= 0 (remainder x y)))
     (cond ((% 15) 'FizzBuzz)
	   ((% 5) 'Buzz)
	   ((% 3) 'Fizz)
	   (#t x))))
 (list-ec (: i 100) (+ i 1)))

ワンライナー

(use srfi-42)(map(lambda(x)(let1 % (lambda(y)(= 0 (remainder x y)))(cond((% 15)'FizzBuzz)((% 5)'Buzz)((% 3)'Fizz)(0 x))))(list-ec(: i 100)(+ i 1)))

バイト数を減らすために、cond節のelseを0にしてみたり。


Ruby、じゃなくてウビ*1でも書いてみた。

for i in 1..100
  modx = lambda{|x| i % x == 0}
  if modx.call(15)
    puts :FizzBuzz
  elsif modx.call(5)
    puts :Buzz
  elsif modx.call(3)
    puts :Fizz
  else
    puts i
  end
end

1.upto(100){|x|
  modx = proc{|y| x % y == 0}
  if modx.call(15)
    puts :FxzzBuzz
  elsif modx.call(5)
    puts :Buzz
  elsif modx.call(3)
    puts :Fxzz
  else
    puts x
  end
}