開発 -テスト require_relative '../fizz_buzz.rb' describe :FizzBuzz do before :all do dir = File.expand_path(File.dirname(__FILE__)) @_read = ->(fn){ File.open(fn).map{ |r| r.chomp }} @answer = @_read[File.join(dir, 'fizz_buzz.answer')] end it 'should be eauql to anser' do fn = 'fizz_buzz.result' fizzbuzz(100, fn) expect(@_read[fn]).to match_array @answer end end 20 / 28
開発 -実装(初回: 文字列結合) def fizzbuzz(n, fn) File.open(fn,'w') do |f| 1.upto(n) do |i| out = '' i % 3 == 0 and out << 'Fizz' i % 5 == 0 and out << 'Buzz' f.puts out.empty?? i : out end end end 文字列を結合 22 / 28
開発 -実装(場合分け) def fizzbuzz(n, fn) File.open(fn,'w') do |f| 1.upto(n) do |i| f.puts case when i % 15 == 0 then 'FizzBuzz' when i % 3 == 0 then 'Fizz' when i % 5 == 0 then 'Buzz' else i end end end end 文字列演算が重いので、 場合分けに変更 23 / 28
開発 -実装(ハッシュを使う) class FizzBuzz CONDITION = { 0 => 'FizzBuzz' } { 3 => 'Fizz', 5 => 'Buzz', }.each do |no, key| no.step(14,no){ |i| CONDITION[i] = key } end def fizzbuzz(n, fn) FizzBuzz.fizzbuzz(n, fn) end class << self public def fizzbuzz(n, fn) File.open(fn,'w') do |f| 1.upto(n) do |i| f.puts CONDITION[i % 15] || i end end end end end 24 / 28
開発 -評価(実行速度の計測: 結果) user system total real no 1 5.810000 0.160000 5.970000 ( 6.045857) no 2 5.120000 0.150000 5.270000 ( 5.311798) no 3 4.850000 0.130000 4.980000 ( 4.990330) ハッシュ版が一番速かった!! 26 / 28