FizzBuzz, short code
short codeへの入り口
anarchy golf
id:tattyu氏にショートコードのランキングサイトがあることを教えてもらった。ここにはたくさんの問題とそれに対してのショートコードのランキングが載せられる。
ログイン認証などもなく、Code Golfほどシリアスではないのでカジュアルに楽しめそう。
anarchy golf - FizzBuzz
試しに前述のコードを短くしてアップしてみた。
(1..100).each{|i|s='';s='Fizz'if i%3==0;s+='Buzz'if i%5==0;s=i.to_s if s=='';print s+"\n"}
ファイルサイズを小さくするのが優先なので、CR+LFの改行を外し、セミコロンに置き換えて90byte。
ちなみに、改行を入れたら以下のようになる。
(1..100).each{|i| s='' s='Fizz'if i%3==0 s+='Buzz'if i%5==0 s=i.to_s if s=='' print s+"\n" }
これで45位・・。
うーん、何を短くすればいいのか?アルゴリズムを改良か?
あ、やべ・・。
これ、ハマるわ・・。
step 2
ふと気づいたのが出力方法。
print だと改行コードも足さないといけない。しかし p ではダブルクォーテーションで括られてしまう。他になかったっけ?と思って思い出したのが、puts。
プログラミング言語 Ruby リファレンスマニュアル .. putsの説明
これでマイナス6byte!
(1..100).each{|i|s='';s='Fizz'if i%3==0;s+='Buzz'if i%5==0;s=i.to_s if s=='';puts s}
submitしてみたら、84byteで39位!
仕事が、仕事が、と言いながらもこんなことやってちゃダメだ、俺!
続きは明日!
と書いてしまえば大丈夫かな。
step 3
ちょっと仕事の区切りが付いたので、自分へのご褒美としてshort coding time!
三項演算子を使う仕組みに変えて書いてみたらサクッと減った!
(1..100).each{|i|puts i%3==0?i%5==0?"FizzBuzz":"Fizz":i%5==0?"Buzz":i.to_s}