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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/agb_handicap.rb +124 -0
  3. 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
@@ -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: []