Guest User

Untitled

a guest
Jan 21st, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.07 KB | None | 0 0
  1. # encoding: utf-8
  2. describe "ボウリングのスコア" do
  3. subject { BowlingGame.new }
  4. [
  5. ["すべてガーターの計算ができること", [0] * 21, 0],
  6. ["すべて1ピンの計算ができること", ([1, 1] * 10).concat([0]), 20],
  7. ["始めスペアの場合の計算ができること", [7, 3, 9, 0].concat([0] * 17), 28],
  8. ["最後スペアの場合の計算ができること", ([0] * 18).concat([7, 3, 9]), 19],
  9. ["先頭ストライクの計算ができること", [10, 0, 4, 3].concat([0] * 17), 24],
  10. ["最後ストライクの計算ができること", ([0, 0] * 9).concat([10,5,5]), 20],
  11. ["最後-1ストライクの計算ができること", ([0, 0] * 8).concat([10,0,10,5,0]), 40],
  12. ["パーフェクトゲームの計算ができること", ([10, 0] * 9).concat([10, 10, 10]), 300],
  13. ["サンプルの計算が出来ること", [5,4,0,0,10,0,9,1,6,3,7,0,6,2,10,0,10,0,1,9,5], 125],
  14. ].each do |desc, rolls, expected_score|
  15. it "#{desc}: rolls:#{rolls}, score:#{expected_score}" do
  16. rolls.size.should == 21
  17. subject.score(rolls).should == expected_score
  18. end
  19. end
  20. end
  21.  
  22. class BowlingGame
  23. def score(rolls)
  24. (1..10).map { |frame_index|
  25. sub_score(rolls, frame_index)
  26. }.reduce(:+)
  27. end
  28.  
  29. def sub_score(rolls, frame_index)
  30. rolls[range(rolls, frame_index)].reduce(:+)
  31. end
  32.  
  33. private
  34. def range(rolls, frame_index)
  35. first_index = (frame_index - 1) * 2
  36. return (first_index..first_index + 4) if strike?(rolls[first_index]) and strike?(rolls[first_index + 2]) and not pre_last_frame?(frame_index)
  37. return (first_index..first_index + 3) if strike?(rolls[first_index])
  38. return (first_index..first_index + 2) if spaire?(rolls[first_index], rolls[first_index + 1])
  39. (first_index..first_index + 1)
  40. end
  41.  
  42. def spaire?(first, second)
  43. first + second == 10 and !strike?(first)
  44. end
  45.  
  46. def strike?(first)
  47. first == 10
  48. end
  49.  
  50. def pre_last_frame?(frame_index)
  51. frame_index == 9
  52. end
  53. end
Add Comment
Please, Sign In to add comment