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)}
まさに本末転倒(笑 おとなしく変数使えと