ようやく時間がとれた・・・
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で相談してみようかな。