# Untitled

By: a guest on May 4th, 2012  |  syntax: None  |  size: 2.51 KB  |  hits: 8  |  expires: Never
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.
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