agb_handicap 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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: []