いちおうプログラマですから
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にしてみたり。
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 }