最近FizzBuzzをよく見かける季節になってきたので
おそらく高速なFizzBuzzを
def fizzbuzz(max)
fb_count, rest = max.divmod 15
last_fb = fb_count * 15
r = 1.step(last_fb, 15).reduce(''){|memo, n|
memo += <<~StrFizzBuzz
#{n}
#{n+1}
Fizz
#{n+3}
Buzz
Fizz
#{n+6}
#{n+7}
Fizz
Buzz
#{n+10}
Fizz
#{n+12}
#{n+13}
FizzBuzz
StrFizzBuzz
}
rest_start = last_fb + 1
rest_array = Array.new(rest){|i| rest_start + i}
3.step(rest, 3){|n| rest_array[n-1] = 'Fizz' }
5.step(rest, 5){|n| rest_array[n-1] = 'Buzz' }
r + rest_array.join("\n")
end
puts fizzbuzz(100)
工夫した点
- FizzBuzzは15要素ずつ変換する事ができるので一気に
- 後半の余り部分も
step
だけで乗り切る
ベンチマークは
後でやる