def score(pins)
sum = 0
isAfterSpare = false
isAfterStrike = false
isDouble = false
isAfterDouble = false
isStrike = false
isAfterLastFrame = false
firstPin = 0
pins.each_with_index do |pin, index|
# 前フレームの strike, spare 分のボーナス加算
if isAfterSpare || isAfterStrike then
sum += pin
end
isAfter10thFrame = index >= 2 * 10
if isAfter10thFrame then
# 10フレーム 3投目は、ボーナス加算 1回目のみで抜ける
break;
end
# doubleの分のボーナス加算
if isAfterDouble then
sum += pin
end
# 今回のフレームのピン数加算
sum += pin
# spare, strike の状態処理
if index % 2 == 0 then
# 各フレーム 1投目
if pin == 10 then
isStrike = true
isDouble = isAfterStrike
else
isStrike = false
isDouble = false
end
isAfterSpare = false
firstPin = pin
else
# 各フレーム 2投目
isAfterSpare = !isStrike && (firstPin + pin == 10)
isAfterStrike = isStrike
isAfterDouble = isDouble
end
str = index.to_s + ': pin = ' + pin.to_s + ', sum = ' + sum.to_s
str += ', spare = ' + isAfterSpare.to_s
str += ', strike = ' + isAfterStrike.to_s + '(' + isStrike.to_s + ')'
puts str
end
return sum
end