tennis 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 92920cd754c3ac7a92528a35692060e8ed472dbe
4
- data.tar.gz: 8e91f9f5b0a4c2f4902b4eba2b1bc53204cb50bb
3
+ metadata.gz: ab97c6b1bdde123d2b06a05e91db465b8d55dd35
4
+ data.tar.gz: 4fae93c7c709ee1dcf9a38bae35585a93caff9a5
5
5
  SHA512:
6
- metadata.gz: 0eaffb4274e0b704fe739ef00127b8084ae5b8f7dacdd31f3f38eae002b42b64c6a9036d0c1039ed47f7da715e36fe9157a70c4502f8137af33a785c21dc02a1
7
- data.tar.gz: 0ecc8a77bf85c347177ade9930aa863882c4f11a14dadee09b013ad60663da176d841c5c0c529c3c6a7c3959d27d3a46cabb35cfb24304cbc3ba074f5ae4b283
6
+ metadata.gz: 98b611d18f1758c632f6686d092d4f42d9845875cfa25c731b47339bc7c592141f45101ffcce3cd946251a01031eef7ed4a11335c18766c90a45b8424259db97
7
+ data.tar.gz: fb611bd4896d45f25290f857f55afeea4f3b85c284c80df1363d0aba782822865027e28ad6c9172521381b2fd53557cf66b8fa4f66f0aa3f670b0fdb25da8832
data/.gitignore CHANGED
@@ -13,3 +13,4 @@
13
13
  *.a
14
14
  mkmf.log
15
15
  *.gem
16
+ .idea
@@ -1,3 +1,3 @@
1
1
  class Tennis
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
data/lib/tennis.rb CHANGED
@@ -1,23 +1,24 @@
1
1
  require "tennis/version"
2
2
 
3
3
  class Tennis
4
+ # player 1 is the home player(0) , player 2 is the away player(1)
5
+ # winner is either 0 or 1
6
+ # points is an array: [points for 0 , points for 1]
7
+ # set_count is an array: [sets won by 0, sets won by 1]
8
+ # game_count is an array: [games won by 0, games won by 1]
9
+
10
+ attr_reader :winner, :points, :set_count, :game_count
11
+
4
12
  def initialize(scores)
5
- @scores = scores != 'default-1' && scores != 'default-2' ? scores.split(/[-,,]/).map(&:to_i) : scores
6
- @result = (1 if scores == 'default-1') || (2 if scores == 'default-2') || :default
7
- if @result == :default
8
- # check blank input ''
9
- @result = :error if @scores.any? { |score| score.nil? }
10
- # to check if score for only 1 set has been input
11
- validation_1 = @scores.length == 2
12
- # to check if any input > 7
13
- validation_2 = @scores.any? { |score| score > 7 }
14
- # to check if one of the input is 7 and the other is not 6
15
- # bad tie break input
16
- validation_3 = false
17
- @scores.each_slice(2).each {|r| validation_3 = true if r.any? {|score| score == 7} && !r.any? {|score| score == 6} }
18
- @result = :error if validation_1 || validation_2 || validation_3
19
- # if set score is not complete eg: 4-6,7-6,4-1
20
- @scores.each_slice(2).each {|r| @result = :incomplete_match if r[0] < 6 && r[1] < 6 } if @result != :error
13
+ # dfh -> default win for home player(0)
14
+ # dfa -> default win for away player(1)
15
+ @winner = :default
16
+ @scores = validate_score(scores)
17
+ @winner = match_winner if @winner == :default
18
+ @points = match_points
19
+ unless @scores.is_a? String
20
+ @set_count = sets_won
21
+ @game_count = games_won
21
22
  end
22
23
  end
23
24
 
@@ -33,38 +34,81 @@ class Tennis
33
34
  (0...@scores.length).step(2).map{ |i| [@scores[i+1], @scores[i]].join('-') }.join(', ')
34
35
  end
35
36
 
37
+ private
38
+
39
+ # helper method: to check score validation
40
+ def validate_score(scores_string)
41
+ set_scores = scores_string.split(/[-,,]/).map(&:to_i)
42
+ if set_scores == [0]
43
+ # checks bad default string value reported
44
+ @winner = (0 if scores == 'dfh') || (1 if scores == 'dfa') || :error
45
+ scores_string
46
+ else
47
+ # check blank input ''
48
+ validation_1 = set_scores.any? {|score| score.nil?}
49
+ # to check if score for only 1 set has been input
50
+ validation_2 = set_scores.length == 2
51
+ # to check if any input > 7
52
+ validation_3 = set_scores.any? {|score| score > 7}
53
+ # to check if one of the input is 7 and the other is not 6
54
+ # bad tie break input
55
+ validation_4 = false
56
+ set_scores.each_slice(2).each {|r| validation_4 = true if r.any? {|score| score == 7} && !r.any? {|score| score == 6} }
57
+ @winner = :error if validation_1 || validation_2 || validation_3 || validation_4
58
+ # if set score is not complete eg: 4-6,7-6,4-1
59
+ set_scores.each_slice(2).each {|r| @winner = :incomplete_match if r[0] < 6 && r[1] < 6 } unless @winner == :error
60
+ set_scores
61
+ end
62
+ end
63
+
36
64
  # returns who won the match
37
65
  # :incomplete_match (bad input/incomplete match)
38
66
  # :error (bad input for sure)
39
- # 1 (player-1 won)
40
- # 2 (player-2 won)
41
- def winner
42
- return @result if @result != :default
43
- @result = (@scores.length == 4) ? two_sets : three_sets
67
+ # 0 (player-1 won)
68
+ # 1 (player-2 won)
69
+ def match_winner
70
+ @scores.length == 4 ? two_sets : three_sets
44
71
  end
45
72
 
46
73
  # returns an array of points
47
74
  # returns (points_player_1 , points_player_2)
48
75
  # returns (0,0) for bad input
49
- def points
50
- @result = winner
51
- (return [0, 0]) if @result == :error
52
- (complete_match_points if @result == 1 || @result == 2) || incomplete_match_points
76
+ def match_points
77
+ return [0, 0] if @winner == :error
78
+ return [@scores == 'dfh' ? 12 : 0 , @scores == 'dfa' ? 12 : 0] if @scores.is_a? String
79
+ @winner == 0 || @winner == 1 ? complete_match_points : incomplete_match_points
53
80
  end
54
81
 
55
- private
82
+ # returns the number of sets won by the given player (0 or 1)
83
+ def sets_won
84
+ sets = [0, 0]
85
+ (0...@scores.length).step(2).each do |i|
86
+ @scores[0 + i] > @scores[1 + i] ? sets[0] += 1 : sets[1] += 1
87
+ end
88
+ sets
89
+ end
90
+
91
+ # returns the number of won by the given player (0 or 1)
92
+ def games_won
93
+ games = [0, 0]
94
+ (0...@scores.length).step(2).each do |i|
95
+ games[0] += @scores[0 + i]
96
+ games[1] += @scores[1 + i]
97
+ end
98
+ games
99
+ end
56
100
 
57
101
  # helper method: called by RESULT method for valid matches with 2 sets
58
102
  def two_sets
59
103
  set_results = []
60
104
  (0...@scores.length).step(2).each do |i|
61
105
  # tie breaker (assuming a 7 point tie breaker) or a 7-5 scores
62
- if @scores[i] == 7 || @scores[i+1] == 7
63
- set_results << (@scores[i] == 7 ? 1 : 2)
106
+ if @scores[i] == 7 || @scores[i + 1] == 7
107
+ set_results << (@scores[i] == 7 ? 0 : 1)
64
108
  # regular set victory - 6 games with a margin of 2
65
109
  else
66
110
  return :incomplete_match if ( @scores[i] - @scores[i + 1] ).abs < 2
67
- set_results << (@scores[i] == 6 ? 1 : 2)
111
+ set_results << (@scores[i] == 6 ? 0 : 1)
68
112
  end
69
113
  end
70
114
  # incomplete match e.g: 6-4,5-3
@@ -77,35 +121,34 @@ class Tennis
77
121
  (0...@scores.length).step(2).each do |i|
78
122
  # tie breaker (assuming a 7 point tie breaker) or a 7-5 score
79
123
  if @scores[i] == 7 || @scores[i + 1] == 7
80
- set_results << (@scores[i] == 7 ? 1 : 2)
124
+ set_results << (@scores[i] == 7 ? 0 : 1)
81
125
  # regular set victory - 6 games with a margin of 2
82
126
  else
83
127
  return :incomplete_match if (@scores[i] - @scores[i + 1]).abs < 2
84
- set_results << (@scores[i] == 6 ? 1 : 2)
128
+ set_results << (@scores[i] == 6 ? 0 : 1)
85
129
  end
86
130
  end
87
131
  # checks if the result has been decided in the first 2 sets
88
132
  # but the 3rd set is also present in the input
89
133
  return :error if set_results[0] == set_results[1]
90
- set_results.count(1) == 2 ? 1 : 2
134
+ set_results.count(0) == 2 ? 0 : 1
91
135
  end
92
136
 
93
137
  # helper method: called by POINTS for complete matches
94
138
  def complete_match_points
95
139
  points = [0, 0]
96
- @result = winner
97
- points[@result - 1] = (@scores.length == 6) ? 12 : 14
98
- runner_up = (@result == 1) ? 2 : 1
140
+ points[@winner] = (@scores.length == 6) ? 12 : 14
141
+ runner_up = 1 - @winner
99
142
  runner_up_points = player_points(runner_up)
100
- points[runner_up - 1] = runner_up_points < 8 ? runner_up_points : 8
143
+ points[runner_up] = runner_up_points < 8 ? runner_up_points : 8
101
144
  points
102
145
  end
103
146
 
104
147
  # helper method: called by POINTS for incomplete matches
105
148
  def incomplete_match_points
106
149
  points = [0, 0]
107
- player_1_points = player_points(1)
108
- player_2_points = player_points(2)
150
+ player_1_points = player_points(0)
151
+ player_2_points = player_points(1)
109
152
  points[0] = player_1_points < 10 ? player_1_points : 10
110
153
  points[1] = player_2_points < 10 ? player_2_points : 10
111
154
  points
@@ -114,7 +157,7 @@ class Tennis
114
157
  # helper method: returns the POINTS of a player given the player number
115
158
  def player_points(player)
116
159
  player_scores = []
117
- @scores.each_with_index { |score, index| (player_scores << score; player +=2) if index == (player - 1) }
160
+ @scores.each_with_index { |score, index| (player_scores << score; player += 2) if index == (player) }
118
161
  player_scores = player_scores.sort! { |x, y| y <=> x }
119
162
  player_scores[0] + player_scores[1]
120
163
  end
data/spec/tennis_spec.rb CHANGED
@@ -9,22 +9,22 @@ end
9
9
  describe Tennis, "#scores" do
10
10
  it "finds the winner properly in two sets" do
11
11
  score = Tennis.new("6-4, 6-4")
12
- expect(score.winner).to eq 1
12
+ expect(score.winner).to eq 0
13
13
  end
14
14
 
15
15
  it "finds the winner properly in three sets" do
16
16
  score = Tennis.new("4-6, 6-2, 3-6")
17
- expect(score.winner).to eq 2
17
+ expect(score.winner).to eq 1
18
18
  end
19
19
 
20
20
  it "finds the winner properly in two sets with tie break" do
21
21
  score = Tennis.new("6-4, 7-6")
22
- expect(score.winner).to eq 1
22
+ expect(score.winner).to eq 0
23
23
  end
24
24
 
25
25
  it "finds the winner properly in three sets with tie break" do
26
26
  score = Tennis.new("6-4, 6-7, 7-6")
27
- expect(score.winner).to eq 1
27
+ expect(score.winner).to eq 0
28
28
  end
29
29
 
30
30
  it "reports incomplete match score (set 1-1)" do
@@ -126,3 +126,23 @@ describe Tennis, "#flipped" do
126
126
  end
127
127
  end
128
128
  end
129
+
130
+ describe Tennis, "#set_count" do
131
+ it "returns the sets won by each player" do
132
+ scores = [["6-4, 4-6, 6-4", [2,1]],["6-2,6-1", [2,0]], ["7-6,4-6,6-4", [2,1]], ["6-4", [1,0]]]
133
+ scores.each do |s|
134
+ ts = Tennis.new(s[0])
135
+ expect(ts.set_count).to eq s[1]
136
+ end
137
+ end
138
+ end
139
+
140
+ describe Tennis, "#game_count" do
141
+ it "returns the games won by each player" do
142
+ scores = [["6-4, 4-6, 6-4", [16,14]],["6-2,6-1", [12,3]], ["7-6,4-6,6-4", [17,16]], ["6-4", [6,4]]]
143
+ scores.each do |s|
144
+ ts = Tennis.new(s[0])
145
+ expect(ts.game_count).to eq s[1]
146
+ end
147
+ end
148
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tennis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rohan Katyal
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-08 00:00:00.000000000 Z
12
+ date: 2015-02-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler