FizzBuzz解いてみた。

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

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

http://slashdot.jp/it/article.pl?sid=07/05/24/2257258

rubyでやってみて大体数分で終わったのでホッと一息だが。
トライアンドエラーでやりながら30回めくらいでクリア。
その時の文は以下

 1.upto(10){|i| print (i%3==0?"Fizz ":""); print (i%5==0?"Buzz ":"");print i,"\n"}

主にprintの引数で起こられまくってたのでprint乱発でクリア。

1.upto(100){|i|print ((i%3==0?"Fizz ":"")+(i%5==0?"Buzz ":"")+i.to_s+"\n"}

それか短くしようとしたらエラーが出る。

1.upto(100){|i|print (i%3==0?"Fizz ":""),(i%5==0?"Buzz ":""),i,"\n")}
irb(main):073:0> 1.upto(100){|i|print (i%3==0?"Fizz ":""),(i%5==0?"Buzz ":""),i,"\n")}
(irb):73: warning: don't put space before argument parentheses
SyntaxError: compile error
(irb):73: syntax error, unexpected ',', expecting '}'
1.upto(100){|i|print (i%3==0?"Fizz ":""),(i%5==0?"Buzz ":""),i,"\n")}
                                         ^
(irb):73: syntax error, unexpected ',', expecting '}'
1.upto(100){|i|print (i%3==0?"Fizz ":""),(i%5==0?"Buzz ":""),i,"\n")}
                                                             ^
(irb):73: syntax error, unexpected ')', expecting tCOLON2 or '[' or '.'
1.upto(100){|i|print (i%3==0?"Fizz ":""),(i%5==0?"Buzz ":""),i,"\n")}
                                                                    ^
        from (irb):73
        from :0
irb(main):075:0> print 1,2,3
123=> nil
irb(main):076:0> print (1),(2),(3)
123=> nil
irb(main):077:0> print ((1),(2),(3))
(irb):77: warning: don't put space before argument parentheses
123=> nil
irb(main):078:0> print (1,2,3)
(irb):78: warning: don't put space before argument parentheses
123=> nil
irb(main):079:0> print(1,2,3)
123=> nil
irb(main):070:0> print((1),(2),(3))
123=> nil

このへんか…おかしくね?77で動いてるじゃん。

というわけで、着陸解は以下

1.upto(100){|i|print((i%3==0?"Fizz ":""),(i%5==0?"Buzz ":""),i,"\n")}
1.upto(100){|i|puts((i%3==0?"Fizz ":"")+(i%5==0?"Buzz ":"")+i.to_s)}

括弧が余計だ。気持ち悪。
教えて4行の人。

うーん、問題読み違えてた。倍数の時には数を出力しちゃいけないんだな。

変数を使うか、同じ条件比較を2度するかしかない。
rubyは空文字列をfalseとして扱ってくれない。

 def f(a,b);a!=""?a:b;end;1.upto(100){|i|puts f((i%3==0?"Fizz ":"")+(i%5==0?"Buzz ":""),i)}

まさに本末転倒(笑 おとなしく変数使えと