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]}