RubyでFizzBuzzコードゴルフ

東京Ruby会議10応募した時は90バイトを超えていたのだけど今朝ふと思いついて
改めて書いてからリファクタリングしてみた。

# 85 Bytes
(gets..gets).map(&:to_i).each{|x|puts (a="#{['fizz'][x%3]}#{['buzz'][x%5]}")==''?x:a}

必要なときにto_iしたほうがコードが短くなる

# 83 Bytes
(gets..gets).each{|x|puts (a="#{['fizz'][x.to_i%3]}#{['buzz'][x.to_i%5]}")==''?x:a}

String#uptoを使うとeachが要らない

# 81 Bytes
gets.upto(gets){|x|puts (a="#{['fizz'][x.to_i%3]}#{['buzz'][x.to_i%5]}")==''?x:a}

少しずつ縮めて81バイト...
でもトップは67バイトとのことで、まだまだ....



【23:35追記】出力用データはStringじゃなくてシンボルでも良いことに気づいた。これでもう2バイト減らせる。

# 79 Bytes
gets.upto(gets){|x|puts (a="#{[:fizz][x.to_i%3]}#{[:buzz][x.to_i%5]}")==''?x:a}

やっと80バイトを切った。次は2個あるto_iを何とかしたい気分。


【翌0:50追記】剰余をインデクスとすることで76バイトまで縮めることができた。

# 76 Bytes
gets.upto(gets){|x|puts [x,:fizz,:buzz,:fizzbuzz][0x1241843>>x.to_i%15*2&3]}

眠いのでもう寝る。

【翌1:05追記】インデクスのデータを10進表記にしたら1バイト少なくて済むことに気づいた。これで75バイト。今度こそ寝るw

# 75 Bytes
gets.upto(gets){|x|puts [x,:fizz,:buzz,:fizzbuzz][19142723>>x.to_i%15*2&3]}