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}

でsubmitしたら37位〜。