Skip to content

Instantly share code, notes, and snippets.

@dancardella
Created July 23, 2012 11:10
Show Gist options
  • Save dancardella/3163121 to your computer and use it in GitHub Desktop.
Save dancardella/3163121 to your computer and use it in GitHub Desktop.
bowling_scores
require 'test/unit'
def score(*frame)
@scores = []
# Calculations based upon earlier frame outcome [see below]
frame.length.times do |i|
if @frame == "strike"
frame[i][1] ? @scores << 2*(frame[i][0]+frame[i][1]) : @scores << 2*frame[i][0]
elsif @frame == "spare"
frame[i][1] ? @scores << (2*frame[i][0]+frame[i][1]) : @scores << 2*frame[i][0]
else
frame[i][1] ? @scores << frame[i][0]+frame[i][1] : @scores << frame[i][0]
end
# Determines what form present frame takes in order to employ in next frame calcs
if frame[i][0] == 10
@frame = "strike"
elsif frame[i][0]+frame[i][1] == 10
@frame = "spare"
else @frame = "off"
end
# Consecutive Strikes Calc
if frame[i-1][0] == 10 && frame[i-2][0] == 10 && i> 1
@scores << frame[i][0]
else
end
# Checks for last frame and adds in if present
if frame[i][2]
@scores << frame[i][2]
end
end
total = @scores.flatten.inject {|sum, roll| sum+roll}
return total
end
class BowlingTest < Test::Unit::TestCase
def test_1
assert_equal 9, score([5, 4])
end
def test_2
assert_equal 10, score([5, 4], [1, 0])
end
def test_spare
assert_equal 25, score([5, 5], [6, 3])
end
def test_strike
assert_equal 28, score([10], [6, 3])
end
#
def test_double_strike
assert_equal 60, score([3, 3], [10], [10], [6, 3])
end
#
def test_max_rolls
assert_equal 30, score(*(1..9).map{[0,0]}+[[10,10,10]])
end
def test_almost_perfect
assert_equal 279, score(*(1..9).map{[10]}+[[9,1,10]])
end
def test_perfect
assert_equal 300, score(*(1..9).map{[10]}+[[10,10,10]])
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment