tennis 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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