ペアプロワークショップのその後のその後

ようやく時間がとれた・・・

過去の記事はこことかこことか。

Ruby版を書いてみました。(2011/2/6に不具合対応のため、ソースを書き換えました。)

class Bowling
   def Bowling.score(pins)
##      pins.inject(0) {|result, item| result + item}
      result = 0
      pins_size = pins.size
      pins.each_with_index { |item,idx|
         if idx < 16 then
            if idx % 2 == 0 && pins[idx] == 10 then
               result += pins[idx + 2]
               if pins[idx + 2] == 10 then
                  result += pins[idx + 4]
               else
                  result += pins[idx + 3]
               end
            elsif idx % 2 == 0 && pins[idx] + pins[idx + 1] == 10 then
               result += pins[idx + 2]
            end
         elsif idx < 18 then
            if idx % 2 == 0 && pins[idx] == 10 then
               result += pins[idx + 2] + pins[idx + 3]
            elsif idx % 2 == 0 && pins[idx] + pins[idx + 1] == 10 then
               result += pins[idx + 2]
            end
         else

         end
         result += pins[idx]
      }
      return result
   end
end

テストコードは簡単に。

$:.unshift File.join(File.dirname(__FILE__),'..','lib')

require 'test/unit'
require 'main'

class MainTest < Test::Unit::TestCase
  def test_problem1
     a = [1,4,2,8,5,0,10,0,0,4,5,5,2,0,6,1,10,0,10,5,5]
     assert_equal(109, Bowling.score(a))
  end

  def test_problem2_strike_first
     a = [10,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
     assert_equal(14, Bowling.score(a))
  end

  def test_problem2_strike_second
     a = [10,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
     assert_equal(14, Bowling.score(a))
  end
end

う〜〜ん、全然Rubyらしくないなぁ。each_with_indexを使うあたり、indexで回すというJavaの概念から抜けきれてない気がする。

今度のyokohama.rbで相談してみようかな。