55 lines
1.7 KiB
Ruby
Executable file
55 lines
1.7 KiB
Ruby
Executable file
#!/usr/bin/ruby
|
||
|
||
score = ARGV[0]
|
||
scores = score.split(',')
|
||
shots = []
|
||
scores.each do |s|
|
||
if s == 'X'
|
||
shots << 10
|
||
shots << 0
|
||
else
|
||
shots << s.to_i
|
||
end
|
||
end
|
||
|
||
frames = []
|
||
shots.each_slice(2) do |s|
|
||
frames << s
|
||
end
|
||
|
||
point = 0
|
||
|
||
frames[0..7].each_with_index do |frame, index|
|
||
point += frame.sum
|
||
# ストライクかつ次もストライクの場合
|
||
point += frames[index + 2].first if frame == [10, 0] && frames[index + 1].first == 10
|
||
if frame == [10, 0] # ストライク1回のみの場合
|
||
point += frames[index + 1].sum # 次のフレームの合計値が得点となる
|
||
end
|
||
if frame.sum == 10 && frame != [10, 0] # スペアの場合
|
||
point += frames[index + 1].first # 次のフレームの一投目が得点となる
|
||
end
|
||
puts "#{index + 1}フレーム目の得点: #{point}"
|
||
end
|
||
|
||
frames[8..11].each_with_index do |frame, index| # 例外処理のためにループを分割する
|
||
point += frame.sum
|
||
if frame == [10, 0]
|
||
point += frames[index + 9].sum
|
||
print frames[index + 8]
|
||
end
|
||
if frame.sum == 10 && frame != [10, 0]
|
||
point += frames[index + 9].first
|
||
end
|
||
puts "#{index + 9}フレーム目の得点: #{point}"
|
||
end
|
||
|
||
point -= frames[10].sum if frames[10] # 計算結果から余剰加点を除外
|
||
point -= frames[11].first if frames[11] == [10, 0] # 計算結果から余剰加点を除外
|
||
|
||
print frames
|
||
puts point
|
||
|
||
# ストライクは次の「2投の合計値」が得点となる!!!
|
||
# つまりストライクを仮に1フレーム目で取り、2フレーム目もストライクだった場合、1フレーム目の得点には3フレーム目の初回分までが加算される!!!!
|
||
# 10フレーム目の3投目だけはスペアの加算対象としてはならない!
|