FizzBuzzが話題になっていたので、Rubyで書いてみた。

FizzBuzzをエンジニアの採用試験で出題したら半数が問題文を理解できなかったので公開します というエントリが発端なのかな?

1.upto(100) do |n|
  s = ''
  s = 'Fizz' if (n % 3).zero?
  s << 'Buzz' if (n % 5).zero?
  puts s.size.zero? ? n : s
end

奇をてらわず、ごく普通に書いたらこんな感じになった。工夫した点は15の倍数は3と5の倍数でもあるため、その場合の判定を省いたぐらい。

おもしろみはないが、Rubyを知らない人でもなんとなく読めるのではないだろうか。

h = {3=>'Fizz', 5=>'Buzz'}
1.upto(100) do |n| 
  s = h.select {|k,v| (n % k).zero?}.values.join
  puts s.size.zero? ? n : s
end

Hash#selectやArray#joinを使ったもの。考え方はひとつめもものと同じ。

Golf

FizzBuzzを対象としたコードゴルフがあり、anarchy golf - FizzBuzzを見ると、1位は驚愕の30バイトであった。

h={3=>'Fizz',5=>'Buzz'};1.upto(100){|n|s=h.select{|k,v|(n%k).zero?}.values.join;puts s.size.zero? ? n:s}

2つ目のコードを詰め詰めにして105バイト。この1/3以下で実装できるのか。コードを見てみたいな。

(1..100).map{|i|puts i%15==0?"FizzBuzz":i%5==0?"Buzz":i%3==0?"Fizz":i}

最後はChatGPTに考えてもらったもの。Array#mapと三項演算子のネストを組み合わせるのは良いアイデアだな。これで71バイト。