ittf_points 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2f4851982f9af2f265f5d49c1a108a624d8b70ef
4
+ data.tar.gz: 42f5ac52479781bad7c463c8a40e75421dd01b9a
5
+ SHA512:
6
+ metadata.gz: e0a4f0a4345bd2b212aff69d8d95e0de6c729aeaf63db624bf4cbd96880229e992b51d073435784ab69095227d3ba4d7fc57cef351a274706df96cfe65f60024
7
+ data.tar.gz: e6087bffa8ab46060e27a5030843c3bebe99e5efa5eac1f9767003db84f2de1f3d039886936c06233a68506863094edcaa3df18724473e662045018b9b1a40d5
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.3
4
+ script: bundle exec rspec
5
+ cache: bundler
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ittf_points.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 hachy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # IttfPoints
2
+
3
+ Calculate ITTF rating points.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'ittf_points'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install ittf_points
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ require 'ittf_points'
25
+ include IttfPoints
26
+
27
+ p1 = Player.new(rating_points: 2731, weight: :r2)
28
+ p1.win([2122, 1471, 2621]).lose(2788)
29
+ # or
30
+ # p1.win(2122).win(1471).win(2621).lose(2788)
31
+
32
+ puts p1.new_rating_points
33
+ ```
34
+
35
+ ## Contributing
36
+
37
+ Bug reports and pull requests are welcome on GitHub at https://github.com/hachy/ittf_points.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ittf_points"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/exe/ittf_points ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "ittf_points"
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ittf_points/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'ittf_points'
8
+ spec.version = IttfPoints::VERSION
9
+ spec.authors = ['hachy']
10
+ spec.email = ['pekoett@gmail.com']
11
+
12
+ spec.summary = %(Calculate rating points based on ITTF ranking system.)
13
+ spec.description = %(Calculate rating points based on ITTF ranking system.)
14
+ spec.homepage = 'https://github.com/hachy/ittf_points'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = 'exe'
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.10'
22
+ spec.add_development_dependency 'rake', '~> 10.0'
23
+ spec.add_development_dependency 'rspec'
24
+ end
@@ -0,0 +1,111 @@
1
+ module IttfPoints
2
+ class Player
3
+ attr_reader :gained_rating_points, :lost_rating_points, :points_difference
4
+ attr_accessor :weight
5
+
6
+ def initialize(rating_points: nil, weight: :r2)
7
+ @rating_points = rating_points.to_i
8
+ @weight = weight.downcase.to_sym
9
+ end
10
+
11
+ def win(*rating_points)
12
+ @winner_flag = true
13
+ rating_points.flatten.each do |points|
14
+ @opponent_rating_pts = points.to_i
15
+ expected_or_unexpected(winner: @rating_points, loser: @opponent_rating_pts)
16
+ end
17
+ self
18
+ end
19
+
20
+ def lose(*rating_points)
21
+ @winner_flag = false
22
+ rating_points.flatten.each do |points|
23
+ @opponent_rating_pts = points.to_i
24
+ expected_or_unexpected(winner: @opponent_rating_pts, loser: @rating_points)
25
+ end
26
+ self
27
+ end
28
+
29
+ def new_added_rating_points
30
+ if defined?(@gained_rating_points)
31
+ gained = @gained_rating_points.inject(:+)
32
+ else
33
+ gained = 0
34
+ end
35
+
36
+ if defined?(@lost_rating_points)
37
+ lost = @lost_rating_points.inject(:+)
38
+ else
39
+ lost = 0
40
+ end
41
+ gained - lost
42
+ end
43
+
44
+ def new_rating_points
45
+ new_added_rating_points + @rating_points
46
+ end
47
+
48
+ def weighting(weight)
49
+ @weight = weight.downcase.to_sym
50
+ self
51
+ end
52
+
53
+ private
54
+
55
+ def expected_or_unexpected(winner: nil, loser: nil)
56
+ if winner > loser
57
+ weight_ary = R.__send__("#{@weight}_expected")
58
+ @winners_pts_ary, @losers_pts_ary = weight_ary
59
+ expected
60
+ else
61
+ weight_ary = R.__send__("#{@weight}_unexpected")
62
+ @winners_pts_ary, @losers_pts_ary = weight_ary
63
+ unexpected
64
+ end
65
+ end
66
+
67
+ def expected
68
+ case pts_diff
69
+ when 0..25 then results(9)
70
+ when 26..50 then results(8)
71
+ when 51..100 then results(7)
72
+ when 101..150 then results(6)
73
+ when 151..200 then results(5)
74
+ when 201..300 then results(4)
75
+ when 301..400 then results(3)
76
+ when 401..500 then results(2)
77
+ when 501..750 then results(1)
78
+ when 751..Float::INFINITY then results(0)
79
+ end
80
+ end
81
+
82
+ def unexpected
83
+ case pts_diff
84
+ when 0..24 then results(0)
85
+ when 25..49 then results(1)
86
+ when 50..99 then results(2)
87
+ when 101..150 then results(3)
88
+ when 150..199 then results(4)
89
+ when 200..299 then results(5)
90
+ when 300..399 then results(6)
91
+ when 400..499 then results(7)
92
+ when 500..749 then results(8)
93
+ when 750..Float::INFINITY then results(9)
94
+ end
95
+ end
96
+
97
+ def pts_diff
98
+ diff = @rating_points - @opponent_rating_pts
99
+ (@points_difference ||= []) << diff.abs
100
+ diff.abs
101
+ end
102
+
103
+ def results(idx)
104
+ if @winner_flag
105
+ (@gained_rating_points ||= []) << @winners_pts_ary[idx]
106
+ else
107
+ (@lost_rating_points ||= []) << @losers_pts_ary[idx]
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,48 @@
1
+ module IttfPoints
2
+ module R
3
+ class << self
4
+ def r1_expected
5
+ win = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
6
+ lose = [*0..9]
7
+ [win, lose]
8
+ end
9
+
10
+ def r1_unexpected
11
+ win = [20, 24, 28, 32, 40, 48, 56, 64, 72, 80]
12
+ lose = [10, 12, 14, 16, 20, 24, 28, 32, 36, 40]
13
+ [win, lose]
14
+ end
15
+
16
+ def r2_expected
17
+ win = [0, 2, 3, 5, 6, 8, 9, 11, 12, 14]
18
+ lose = [0, 1, 2, 3, 3, 4, 5, 6, 6, 7]
19
+ [win, lose]
20
+ end
21
+
22
+ def r2_unexpected
23
+ win = [15, 18, 21, 24, 30, 36, 42, 48, 54, 60]
24
+ lose = [8, 9, 11, 12, 15, 18, 21, 24, 27, 30]
25
+ [win, lose]
26
+ end
27
+
28
+ def r3_expected
29
+ win = [*0..9]
30
+ lose = [0, 1, 1, 2, 2, 3, 3, 4, 4, 5]
31
+ [win, lose]
32
+ end
33
+
34
+ def r3_unexpected
35
+ win = [10, 12, 14, 16, 20, 24, 28, 32, 36, 40]
36
+ lose = [5, 6, 7, 8, 10, 12, 14, 16, 18, 20]
37
+ [win, lose]
38
+ end
39
+
40
+ alias_method :w1_expected, :r1_expected
41
+ alias_method :w1_unexpected, :r1_unexpected
42
+ alias_method :w2_expected, :r2_expected
43
+ alias_method :w2_unexpected, :r2_unexpected
44
+ alias_method :w3_expected, :r3_expected
45
+ alias_method :w3_unexpected, :r3_unexpected
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module IttfPoints
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,3 @@
1
+ require 'ittf_points/version'
2
+ require 'ittf_points/r'
3
+ require 'ittf_points/player'
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ittf_points
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - hachy
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-09-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Calculate rating points based on ITTF ranking system.
56
+ email:
57
+ - pekoett@gmail.com
58
+ executables:
59
+ - ittf_points
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - ".travis.yml"
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - bin/console
71
+ - bin/setup
72
+ - exe/ittf_points
73
+ - ittf_points.gemspec
74
+ - lib/ittf_points.rb
75
+ - lib/ittf_points/player.rb
76
+ - lib/ittf_points/r.rb
77
+ - lib/ittf_points/version.rb
78
+ homepage: https://github.com/hachy/ittf_points
79
+ licenses: []
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.4.5.1
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Calculate rating points based on ITTF ranking system.
101
+ test_files: []