Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 4th, 2012  |  syntax: None  |  size: 2.51 KB  |  hits: 8  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. require File.expand_path(File.dirname(__FILE__) + '/edgecase')
  2.  
  3. # Greed is a dice game where you roll up to five dice to accumulate
  4. # points.  The following "score" function will be used calculate the
  5. # score of a single roll of the dice.
  6. #
  7. # A greed roll is scored as follows:
  8. #
  9. # * A set of three ones is 1000 points
  10. #
  11. # * A set of three numbers (other than ones) is worth 100 times the
  12. #   number. (e.g. three fives is 500 points).
  13. #
  14. # * A one (that is not part of a set of three) is worth 100 points.
  15. #
  16. # * A five (that is not part of a set of three) is worth 50 points.
  17. #
  18. # * Everything else is worth 0 points.
  19. #
  20. #
  21. # Examples:
  22. #
  23. # score([1,1,1,5,1]) => 1150 points
  24. # score([2,3,4,6,2]) => 0 points
  25. # score([3,4,5,3,3]) => 350 points
  26. # score([1,5,1,2,4]) => 250 points
  27. #
  28. # More scoring examples are given in the tests below:
  29. #
  30. # Your goal is to write the score method.
  31.  
  32. def score(dice)
  33.   score = 0
  34.   score_counts(dice).each {|pair| score += frequency_score(pair)}
  35.   score
  36. end
  37.  
  38. def frequency_score(pair)
  39.   triple_score(pair) + single_score(pair)
  40. end
  41.  
  42. def triple_score(pair)
  43.   triples = pair[1] / 3
  44.  
  45.   if triples > 0
  46.     TRIPLE_MULTIPLIERS[pair[0]] * triples
  47.   else
  48.     0
  49.   end
  50. end
  51.  
  52. def single_score(pair)
  53.   multiplier = SINGLE_MULTIPLIERS[pair[0]]
  54.  
  55.   if multiplier > 0
  56.     (pair[1] % 3) * multiplier
  57.   else
  58.     0
  59.   end
  60. end
  61.  
  62. # Offset by 1 to avoid having to constantly -1 things
  63. SINGLE_MULTIPLIERS = [nil,  100,   0,   0,   0,  50,   0]
  64. TRIPLE_MULTIPLIERS = [nil, 1000, 200, 300, 400, 500, 600]
  65.  
  66. def score_counts(dice)
  67.   scores = {}
  68.   dice.each do |die|
  69.     scores.store(die, (scores[die] || 0) + 1)
  70.   end
  71.   scores
  72. end
  73.  
  74. class AboutScoringProject < EdgeCase::Koan
  75.   def test_score_of_an_empty_list_is_zero
  76.     assert_equal 0, score([])
  77.   end
  78.  
  79.   def test_score_of_a_single_roll_of_5_is_50
  80.     assert_equal 50, score([5])
  81.   end
  82.  
  83.   def test_score_of_a_single_roll_of_1_is_100
  84.     assert_equal 100, score([1])
  85.   end
  86.  
  87.   def test_score_of_multiple_1s_and_5s_is_the_sum_of_individual_scores
  88.     assert_equal 300, score([1,5,5,1])
  89.   end
  90.  
  91.   def test_score_of_single_2s_3s_4s_and_6s_are_zero
  92.     assert_equal 0, score([2,3,4,6])
  93.   end
  94.  
  95.   def test_score_of_a_triple_1_is_1000
  96.     assert_equal 1000, score([1,1,1])
  97.   end
  98.  
  99.   def test_score_of_other_triples_is_100x
  100.     assert_equal 200, score([2,2,2])
  101.     assert_equal 300, score([3,3,3])
  102.     assert_equal 400, score([4,4,4])
  103.     assert_equal 500, score([5,5,5])
  104.     assert_equal 600, score([6,6,6])
  105.   end
  106.  
  107.   def test_score_of_mixed_is_sum
  108.     assert_equal 250, score([2,5,2,2,3])
  109.     assert_equal 550, score([5,5,5,5])
  110.   end
  111.  
  112. end