agb_handicap 0.0.3
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 +7 -0
- data/lib/agb_handicap.rb +124 -0
- metadata +87 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a4c2c93231be30f61e8d6ae17c297502fa5810bf
|
4
|
+
data.tar.gz: 2f3d28728e20cbef016fc3ec75cdaa16b04911b5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: '09098458b0291c00031a5bc139fa2dfe7c913d3b8019c2c0c6e3ef81c882eafb564903fed7016184cbb0fc51b1a31f6bb14de5077ce5866c78ae6898f764fdc1'
|
7
|
+
data.tar.gz: abc4983c6cb9790608c161719a6c1d8a0f06b58877c6542cc970ab475e18a62aad699de4f360e280143cdfce3ea4646e9a7640653dbd4a472ed237c88a5f4edb
|
data/lib/agb_handicap.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
module AgbHandicap
|
2
|
+
|
3
|
+
SCORING_SCHEMES = {
|
4
|
+
'METRIC' => 'Standard WA target face 10 -1',
|
5
|
+
'IMPERIAL' => 'Standard WA target face 9 - 1',
|
6
|
+
'INNER_TEN' => 'Standard WA target face 10-1 with x-ring counting as 10, eg compound scoring',
|
7
|
+
'TRIPLE' => 'Standard 3-spot 5-zone WA target face, eg WA18m round',
|
8
|
+
'TRIPLE_INNER_TEN' => 'Standard 3-spot 5-zone WA target face with x-ring counting as 10, eg compound WA18m round',
|
9
|
+
'ONE_TO_FIVE' => '5-zone scoring, eg Worcester, NFAA Indoor',
|
10
|
+
'SIX_ZONE' => '6-zone WA target face, eg compound 50m'
|
11
|
+
}
|
12
|
+
|
13
|
+
class << self
|
14
|
+
|
15
|
+
# score = integer
|
16
|
+
# distances = array
|
17
|
+
def calculate(score, distances, rounded = true)
|
18
|
+
result = agbhandicap(score, distances)
|
19
|
+
if rounded
|
20
|
+
result = result.ceil.to_i
|
21
|
+
end
|
22
|
+
result
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def agbhandicap(score, distances)
|
28
|
+
rtrange = 32.0
|
29
|
+
hc = 50.0
|
30
|
+
|
31
|
+
while (rtrange > 0.01)
|
32
|
+
nextscore = agbscore(hc, distances)
|
33
|
+
|
34
|
+
if (score < nextscore)
|
35
|
+
hc = hc + rtrange
|
36
|
+
end
|
37
|
+
|
38
|
+
if (score > nextscore)
|
39
|
+
hc = hc - rtrange
|
40
|
+
end
|
41
|
+
|
42
|
+
rtrange = rtrange / 2
|
43
|
+
end
|
44
|
+
|
45
|
+
hc = 0 if (hc < 0)
|
46
|
+
hc = 100 if (hc > 100)
|
47
|
+
|
48
|
+
return hc.to_f.round(1)
|
49
|
+
end
|
50
|
+
|
51
|
+
def agbscore(h, distances)
|
52
|
+
score = 0.0
|
53
|
+
distances.each do | d |
|
54
|
+
score = score + calculate_distance_score(d, h)
|
55
|
+
end
|
56
|
+
score
|
57
|
+
end
|
58
|
+
|
59
|
+
def calculate_distance_score(distance, h)
|
60
|
+
range = distance['range_in_meters'].to_f
|
61
|
+
shots = distance['total_shots'].to_f
|
62
|
+
diameter = distance['target_diameter_cm'].to_f
|
63
|
+
scoring = distance['scoring_scheme']
|
64
|
+
|
65
|
+
score = 0
|
66
|
+
sr = score_range(h, range)
|
67
|
+
|
68
|
+
case scoring
|
69
|
+
when 'METRIC'
|
70
|
+
score = 10
|
71
|
+
(1..10).each do | n |
|
72
|
+
score = score - solution( (n.to_f * diameter / 20.0 + 0.357), sr.to_f)
|
73
|
+
end
|
74
|
+
when 'IMPERIAL'
|
75
|
+
score = 9
|
76
|
+
(1..4).each do | n |
|
77
|
+
score = score - (2.0 * solution( (n.to_f * diameter / 10.0 + 0.357), sr.to_f ))
|
78
|
+
end
|
79
|
+
score = score - solution( (diameter / 2 + 0.357), sr.to_f )
|
80
|
+
when 'ONE_TO_FIVE' # could be worcester or NFAA round etc
|
81
|
+
score = 5
|
82
|
+
(1..5).each do | n |
|
83
|
+
score = score - solution( (n.to_f * diameter / 10.0 + 0.357), sr.to_f )
|
84
|
+
end
|
85
|
+
when 'INNER_TEN'
|
86
|
+
score = 10
|
87
|
+
score = score - solution( (diameter / 40 + 0.357), sr.to_f )
|
88
|
+
(2..10).each do | n |
|
89
|
+
score = score - solution( (n.to_f * diameter / 20 + 0.357), sr.to_f )
|
90
|
+
end
|
91
|
+
when 'TRIPLE'
|
92
|
+
score = 10
|
93
|
+
(1..4).each do | n |
|
94
|
+
score = score - solution( (n.to_f * diameter / 20 + 0.357), sr.to_f )
|
95
|
+
end
|
96
|
+
score = score - (6 * solution( (5 * diameter / 20 + 0.357), sr.to_f ))
|
97
|
+
when 'TRIPLE_INNER_TEN'
|
98
|
+
score = 10
|
99
|
+
score = score - solution( (diameter / 40 + 0.357), sr.to_f )
|
100
|
+
(2..4).each do | n |
|
101
|
+
score = score - solution( (n.to_f * diameter / 20 + 0.357), sr.to_f )
|
102
|
+
end
|
103
|
+
score = score - (6 * solution( (5 * diameter / 20 + 0.357), sr.to_f ))
|
104
|
+
when 'SIX_ZONE' # WA 50M Compound
|
105
|
+
score = 10
|
106
|
+
(1..5).each do | n |
|
107
|
+
score = score - solution( (n.to_f * diameter / 20 + 0.357), sr.to_f )
|
108
|
+
end
|
109
|
+
score = score - (5 * solution( (6 * diameter / 20 + 0.357), sr.to_f ))
|
110
|
+
end
|
111
|
+
|
112
|
+
(score.to_f * shots.to_f).to_f
|
113
|
+
end
|
114
|
+
|
115
|
+
def score_range(h, range)
|
116
|
+
100 * range * (1.036 ** (h.to_f + 12.9)) * 5e-4 * (1 + 1.429e-6 * (1.07 ** (h.to_f + 4.3)) * (range * range))
|
117
|
+
end
|
118
|
+
|
119
|
+
def solution(operator, score_range)
|
120
|
+
return Math.exp( -(operator / score_range) ** 2 )
|
121
|
+
end
|
122
|
+
|
123
|
+
end # end class
|
124
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: agb_handicap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tim Davies
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-02-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest-reporters
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: guard
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: guard-minitest
|
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 Archery GB/GNAS handicaps for standard target rounds. Based
|
56
|
+
on David Lane's original algorithm
|
57
|
+
email: eljetico@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- lib/agb_handicap.rb
|
63
|
+
homepage:
|
64
|
+
licenses:
|
65
|
+
- MIT
|
66
|
+
metadata: {}
|
67
|
+
post_install_message:
|
68
|
+
rdoc_options: []
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
requirements: []
|
82
|
+
rubyforge_project:
|
83
|
+
rubygems_version: 2.5.2
|
84
|
+
signing_key:
|
85
|
+
specification_version: 4
|
86
|
+
summary: AGB Handicap Calculator
|
87
|
+
test_files: []
|