strategy_bag 0.0.1

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: 5014b352fc4555ffdf03a6f7f0029c1a00431171
4
+ data.tar.gz: 67d8898ae9fa37d35f5f01a9da1e005d89234345
5
+ SHA512:
6
+ metadata.gz: 68c7e55d8a3b9ece8b46ccaeba96240ca818cd676f70bfb50c90183081aa74fe8f1548b47bf05586f7281b8df1ce075c3aec3ca4423eb1c853869d70ba70eefc
7
+ data.tar.gz: e52ddb18b55700d52c5a655fcac9bb5d5ca740276baa9c342dc3618c239e296c3cb7841e567d21d302e7477473abb142e3a73222418e274dd61cd38f0c210683
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in strategy_bag.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Levente Bagi
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,132 @@
1
+ # StrategyBag
2
+
3
+ Ruby DSL for making conditionals more readable by defining a set of strategies. Each strategy has a set of conditions and an action. The runner will select a strategy that meets the conditions and executes it.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'strategy_bag'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install strategy_bag
18
+
19
+ ## Example
20
+
21
+ Before:
22
+
23
+ ```ruby
24
+ module Calc
25
+ extend self
26
+
27
+ def calc(a, b, c)
28
+ if a > 10
29
+ if b > 10
30
+ if c > 10
31
+ a + b - 2 * c
32
+ else
33
+ a + b + c
34
+ end
35
+ else
36
+ if c > 20
37
+ a + b - c
38
+ else
39
+ a + b + c
40
+ end
41
+ end
42
+ else
43
+ if b + c > 10
44
+ b + c - a
45
+ end
46
+ end
47
+ end
48
+ end
49
+ ```
50
+
51
+ After:
52
+
53
+ ```ruby
54
+ require 'strategy_bag'
55
+
56
+ module StrategicCalc
57
+ extend self
58
+
59
+ def calc(a, b, c)
60
+ Solver.new(a, b, c).run
61
+ end
62
+
63
+ class Solver < StrategyBag
64
+ params :a, :b, :c
65
+
66
+ condition(:a_high?, :a_low?) { a > 10 }
67
+ condition(:b_high?, :b_low?) { b > 10 }
68
+ condition(:c_high?, :c_low?) { c > 10 }
69
+ condition(:c_max?, :c_not_max?) { c > 20 }
70
+ condition(:bc_high?, :bc_low?) { b + c > 10 }
71
+
72
+ strategy do
73
+ condition :a_high?
74
+ condition :b_high?
75
+ condition :c_high?
76
+ action do
77
+ a + b - 2 * c
78
+ end
79
+ end
80
+
81
+ strategy do
82
+ condition :a_high?
83
+ condition :b_high?
84
+ condition :c_low?
85
+ action do
86
+ a + b + c
87
+ end
88
+ end
89
+
90
+ strategy do
91
+ condition :a_high?
92
+ condition :b_low?
93
+ condition :c_max?
94
+ action do
95
+ a + b - c
96
+ end
97
+ end
98
+
99
+ strategy do
100
+ condition :a_high?
101
+ condition :b_low?
102
+ condition :c_not_max?
103
+ action do
104
+ a + b + c
105
+ end
106
+ end
107
+
108
+ strategy do
109
+ condition :a_low?
110
+ condition :bc_high?
111
+ action do
112
+ b + c - a
113
+ end
114
+ end
115
+
116
+ default do
117
+ nil
118
+ end
119
+
120
+ end
121
+ end
122
+ ```
123
+
124
+
125
+ ## Contributing
126
+
127
+ 1. Fork it ( http://github.com/bagilevi/strategy_bag/fork )
128
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
129
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
130
+ 4. Push to the branch (`git push origin my-new-feature`)
131
+ 5. Create new Pull Request
132
+
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
@@ -0,0 +1,108 @@
1
+ class StrategyBag
2
+
3
+ def initialize(*args)
4
+ @evaluator = Evaluator.new
5
+ self.class.param_names.each_with_index do |name, index|
6
+ @evaluator.define_value name, args[index]
7
+ end
8
+ end
9
+
10
+ def run
11
+ self.class.conditions.each do |positive_name, negative_name, p|
12
+ @evaluator.define_func positive_name, p
13
+ @evaluator.define_negative negative_name, positive_name
14
+ end
15
+ satisfied_strategies = self.class.strategies.select { |strategy|
16
+ @evaluator.conditions_met?(strategy.conditions)
17
+ }
18
+ selected_strategy = satisfied_strategies.first
19
+ if selected_strategy
20
+ @evaluator.instance_eval(&selected_strategy.action)
21
+ else
22
+ @evaluator.instance_eval(&(self.class.default_strategy))
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+
29
+ class Evaluator
30
+ def initialize
31
+ @table = {}
32
+ end
33
+
34
+ def define_value(name, value)
35
+ #puts "E: #{name}: #{value.inspect}"
36
+ @table[name.to_sym] = value
37
+ end
38
+
39
+ def define_func(name, p)
40
+ v = instance_eval(&p)
41
+ define_value(name, v)
42
+ end
43
+
44
+ def define_negative(name, positive_name)
45
+ define_value(name, ! send(positive_name))
46
+ end
47
+
48
+ def conditions_met?(a)
49
+ a.all? { |c| send(c) }
50
+ end
51
+
52
+ def method_missing(m, *args, &proc)
53
+ #puts "missing: #{m}"
54
+ if @table.has_key?(m.to_sym) && args.empty?
55
+ @table[m.to_sym]
56
+ else
57
+ super
58
+ end
59
+ end
60
+ end
61
+
62
+ module ClassDSL
63
+ attr_accessor :param_names, :conditions, :strategies, :default_strategy
64
+
65
+ def params(*param_names)
66
+ self.param_names = param_names
67
+ end
68
+
69
+ def condition(positive_name, negative_name, &p)
70
+ #puts "DSL: condition: #{positive_name}"
71
+ self.conditions ||= []
72
+ self.conditions << [positive_name, negative_name, p]
73
+ end
74
+
75
+ def strategy(&block)
76
+ self.strategies ||= []
77
+ strategy = Strategy.new
78
+ strategy.instance_eval(&block)
79
+ self.strategies << strategy
80
+ end
81
+
82
+ def default(&block)
83
+ self.default_strategy = block
84
+ end
85
+ end
86
+
87
+ extend ClassDSL
88
+
89
+ class Strategy
90
+ attr_accessor :conditions, :action
91
+
92
+ def initialize
93
+ @conditions = []
94
+ end
95
+
96
+ def condition(name)
97
+ @conditions << name
98
+ end
99
+
100
+ def action(&block)
101
+ if block_given?
102
+ @action = block
103
+ else
104
+ @action
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,3 @@
1
+ module StrategyBag
2
+ VERSION = "0.0.1"
3
+ end
data/spec/calc.rb ADDED
@@ -0,0 +1,40 @@
1
+ module Calc
2
+ extend self
3
+
4
+ def calc(a, b, c)
5
+ if a > 10
6
+ if b > 10
7
+ if c > 10
8
+ a + b - 2 * c
9
+ else
10
+ a + b + c
11
+ end
12
+ else
13
+ if c > 20
14
+ a + b - c
15
+ else
16
+ a + b + c
17
+ end
18
+ end
19
+ else
20
+ if b + c > 10
21
+ b + c - a
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ =begin
28
+ # generate examples for shared_examples_for_calc:
29
+
30
+ param_list = 1000.times.to_enum.map do
31
+ [rand(20), rand(30), rand(30)]
32
+ end
33
+ param_list.sort!
34
+ param_list.uniq!
35
+
36
+ param_list.each do |a, b, c|
37
+ puts "expect(calc(#{a}, #{b}, #{c})).to eq(#{calc(a, b, c).inspect})"
38
+ end
39
+
40
+ =end
data/spec/calc_spec.rb ADDED
@@ -0,0 +1,8 @@
1
+ require_relative 'calc'
2
+ require_relative 'shared_examples_for_calc'
3
+
4
+ describe Calc do
5
+ include Calc
6
+
7
+ it_should_behave_like "calc"
8
+ end
@@ -0,0 +1,985 @@
1
+ shared_examples_for "calc" do
2
+ it "works as expected" do
3
+ expect(calc(0, 0, 15)).to eq(15)
4
+ expect(calc(0, 0, 27)).to eq(27)
5
+ expect(calc(0, 2, 0)).to eq(nil)
6
+ expect(calc(0, 2, 16)).to eq(18)
7
+ expect(calc(0, 3, 9)).to eq(12)
8
+ expect(calc(0, 3, 12)).to eq(15)
9
+ expect(calc(0, 3, 15)).to eq(18)
10
+ expect(calc(0, 3, 16)).to eq(19)
11
+ expect(calc(0, 3, 20)).to eq(23)
12
+ expect(calc(0, 4, 12)).to eq(16)
13
+ expect(calc(0, 5, 16)).to eq(21)
14
+ expect(calc(0, 5, 18)).to eq(23)
15
+ expect(calc(0, 7, 6)).to eq(13)
16
+ expect(calc(0, 8, 15)).to eq(23)
17
+ expect(calc(0, 8, 25)).to eq(33)
18
+ expect(calc(0, 9, 2)).to eq(11)
19
+ expect(calc(0, 9, 3)).to eq(12)
20
+ expect(calc(0, 9, 28)).to eq(37)
21
+ expect(calc(0, 10, 7)).to eq(17)
22
+ expect(calc(0, 10, 11)).to eq(21)
23
+ expect(calc(0, 10, 17)).to eq(27)
24
+ expect(calc(0, 11, 2)).to eq(13)
25
+ expect(calc(0, 11, 26)).to eq(37)
26
+ expect(calc(0, 12, 8)).to eq(20)
27
+ expect(calc(0, 12, 11)).to eq(23)
28
+ expect(calc(0, 12, 24)).to eq(36)
29
+ expect(calc(0, 13, 15)).to eq(28)
30
+ expect(calc(0, 14, 26)).to eq(40)
31
+ expect(calc(0, 14, 27)).to eq(41)
32
+ expect(calc(0, 15, 26)).to eq(41)
33
+ expect(calc(0, 15, 27)).to eq(42)
34
+ expect(calc(0, 16, 14)).to eq(30)
35
+ expect(calc(0, 17, 17)).to eq(34)
36
+ expect(calc(0, 20, 21)).to eq(41)
37
+ expect(calc(0, 21, 20)).to eq(41)
38
+ expect(calc(0, 21, 28)).to eq(49)
39
+ expect(calc(0, 22, 15)).to eq(37)
40
+ expect(calc(0, 23, 11)).to eq(34)
41
+ expect(calc(0, 24, 0)).to eq(24)
42
+ expect(calc(0, 24, 8)).to eq(32)
43
+ expect(calc(0, 24, 16)).to eq(40)
44
+ expect(calc(0, 25, 4)).to eq(29)
45
+ expect(calc(0, 25, 6)).to eq(31)
46
+ expect(calc(0, 25, 12)).to eq(37)
47
+ expect(calc(0, 27, 7)).to eq(34)
48
+ expect(calc(0, 27, 16)).to eq(43)
49
+ expect(calc(0, 28, 27)).to eq(55)
50
+ expect(calc(0, 29, 1)).to eq(30)
51
+ expect(calc(1, 0, 3)).to eq(nil)
52
+ expect(calc(1, 1, 5)).to eq(nil)
53
+ expect(calc(1, 1, 29)).to eq(29)
54
+ expect(calc(1, 2, 16)).to eq(17)
55
+ expect(calc(1, 2, 17)).to eq(18)
56
+ expect(calc(1, 2, 22)).to eq(23)
57
+ expect(calc(1, 4, 13)).to eq(16)
58
+ expect(calc(1, 4, 15)).to eq(18)
59
+ expect(calc(1, 4, 16)).to eq(19)
60
+ expect(calc(1, 5, 2)).to eq(nil)
61
+ expect(calc(1, 5, 13)).to eq(17)
62
+ expect(calc(1, 5, 16)).to eq(20)
63
+ expect(calc(1, 6, 4)).to eq(nil)
64
+ expect(calc(1, 6, 23)).to eq(28)
65
+ expect(calc(1, 8, 19)).to eq(26)
66
+ expect(calc(1, 10, 5)).to eq(14)
67
+ expect(calc(1, 10, 10)).to eq(19)
68
+ expect(calc(1, 11, 12)).to eq(22)
69
+ expect(calc(1, 12, 0)).to eq(11)
70
+ expect(calc(1, 12, 18)).to eq(29)
71
+ expect(calc(1, 12, 27)).to eq(38)
72
+ expect(calc(1, 13, 8)).to eq(20)
73
+ expect(calc(1, 15, 6)).to eq(20)
74
+ expect(calc(1, 15, 9)).to eq(23)
75
+ expect(calc(1, 15, 14)).to eq(28)
76
+ expect(calc(1, 16, 19)).to eq(34)
77
+ expect(calc(1, 17, 13)).to eq(29)
78
+ expect(calc(1, 17, 19)).to eq(35)
79
+ expect(calc(1, 19, 1)).to eq(19)
80
+ expect(calc(1, 19, 21)).to eq(39)
81
+ expect(calc(1, 20, 6)).to eq(25)
82
+ expect(calc(1, 20, 12)).to eq(31)
83
+ expect(calc(1, 20, 15)).to eq(34)
84
+ expect(calc(1, 20, 25)).to eq(44)
85
+ expect(calc(1, 24, 12)).to eq(35)
86
+ expect(calc(1, 25, 12)).to eq(36)
87
+ expect(calc(1, 25, 24)).to eq(48)
88
+ expect(calc(1, 26, 12)).to eq(37)
89
+ expect(calc(1, 26, 17)).to eq(42)
90
+ expect(calc(1, 26, 19)).to eq(44)
91
+ expect(calc(1, 27, 5)).to eq(31)
92
+ expect(calc(1, 27, 9)).to eq(35)
93
+ expect(calc(1, 27, 16)).to eq(42)
94
+ expect(calc(1, 28, 17)).to eq(44)
95
+ expect(calc(1, 29, 17)).to eq(45)
96
+ expect(calc(1, 29, 19)).to eq(47)
97
+ expect(calc(1, 29, 24)).to eq(52)
98
+ expect(calc(2, 0, 9)).to eq(nil)
99
+ expect(calc(2, 0, 21)).to eq(19)
100
+ expect(calc(2, 0, 22)).to eq(20)
101
+ expect(calc(2, 1, 28)).to eq(27)
102
+ expect(calc(2, 2, 8)).to eq(nil)
103
+ expect(calc(2, 2, 27)).to eq(27)
104
+ expect(calc(2, 3, 16)).to eq(17)
105
+ expect(calc(2, 4, 25)).to eq(27)
106
+ expect(calc(2, 5, 2)).to eq(nil)
107
+ expect(calc(2, 6, 21)).to eq(25)
108
+ expect(calc(2, 6, 25)).to eq(29)
109
+ expect(calc(2, 6, 29)).to eq(33)
110
+ expect(calc(2, 7, 2)).to eq(nil)
111
+ expect(calc(2, 7, 21)).to eq(26)
112
+ expect(calc(2, 7, 25)).to eq(30)
113
+ expect(calc(2, 8, 24)).to eq(30)
114
+ expect(calc(2, 8, 26)).to eq(32)
115
+ expect(calc(2, 9, 10)).to eq(17)
116
+ expect(calc(2, 11, 9)).to eq(18)
117
+ expect(calc(2, 11, 10)).to eq(19)
118
+ expect(calc(2, 11, 25)).to eq(34)
119
+ expect(calc(2, 12, 6)).to eq(16)
120
+ expect(calc(2, 12, 9)).to eq(19)
121
+ expect(calc(2, 12, 11)).to eq(21)
122
+ expect(calc(2, 12, 29)).to eq(39)
123
+ expect(calc(2, 13, 28)).to eq(39)
124
+ expect(calc(2, 13, 29)).to eq(40)
125
+ expect(calc(2, 14, 11)).to eq(23)
126
+ expect(calc(2, 14, 14)).to eq(26)
127
+ expect(calc(2, 14, 25)).to eq(37)
128
+ expect(calc(2, 15, 1)).to eq(14)
129
+ expect(calc(2, 15, 23)).to eq(36)
130
+ expect(calc(2, 16, 2)).to eq(16)
131
+ expect(calc(2, 16, 8)).to eq(22)
132
+ expect(calc(2, 16, 15)).to eq(29)
133
+ expect(calc(2, 16, 28)).to eq(42)
134
+ expect(calc(2, 17, 11)).to eq(26)
135
+ expect(calc(2, 18, 19)).to eq(35)
136
+ expect(calc(2, 18, 25)).to eq(41)
137
+ expect(calc(2, 19, 28)).to eq(45)
138
+ expect(calc(2, 20, 3)).to eq(21)
139
+ expect(calc(2, 20, 12)).to eq(30)
140
+ expect(calc(2, 21, 9)).to eq(28)
141
+ expect(calc(2, 21, 26)).to eq(45)
142
+ expect(calc(2, 22, 6)).to eq(26)
143
+ expect(calc(2, 22, 11)).to eq(31)
144
+ expect(calc(2, 22, 22)).to eq(42)
145
+ expect(calc(2, 24, 15)).to eq(37)
146
+ expect(calc(2, 27, 10)).to eq(35)
147
+ expect(calc(2, 27, 12)).to eq(37)
148
+ expect(calc(3, 0, 3)).to eq(nil)
149
+ expect(calc(3, 0, 23)).to eq(20)
150
+ expect(calc(3, 0, 26)).to eq(23)
151
+ expect(calc(3, 0, 29)).to eq(26)
152
+ expect(calc(3, 1, 25)).to eq(23)
153
+ expect(calc(3, 2, 7)).to eq(nil)
154
+ expect(calc(3, 2, 13)).to eq(12)
155
+ expect(calc(3, 3, 5)).to eq(nil)
156
+ expect(calc(3, 3, 29)).to eq(29)
157
+ expect(calc(3, 4, 17)).to eq(18)
158
+ expect(calc(3, 4, 29)).to eq(30)
159
+ expect(calc(3, 5, 19)).to eq(21)
160
+ expect(calc(3, 6, 0)).to eq(nil)
161
+ expect(calc(3, 6, 19)).to eq(22)
162
+ expect(calc(3, 7, 1)).to eq(nil)
163
+ expect(calc(3, 8, 1)).to eq(nil)
164
+ expect(calc(3, 8, 19)).to eq(24)
165
+ expect(calc(3, 8, 21)).to eq(26)
166
+ expect(calc(3, 8, 25)).to eq(30)
167
+ expect(calc(3, 9, 4)).to eq(10)
168
+ expect(calc(3, 9, 11)).to eq(17)
169
+ expect(calc(3, 10, 3)).to eq(10)
170
+ expect(calc(3, 10, 9)).to eq(16)
171
+ expect(calc(3, 13, 29)).to eq(39)
172
+ expect(calc(3, 14, 15)).to eq(26)
173
+ expect(calc(3, 15, 19)).to eq(31)
174
+ expect(calc(3, 15, 27)).to eq(39)
175
+ expect(calc(3, 16, 7)).to eq(20)
176
+ expect(calc(3, 16, 8)).to eq(21)
177
+ expect(calc(3, 17, 9)).to eq(23)
178
+ expect(calc(3, 17, 15)).to eq(29)
179
+ expect(calc(3, 18, 22)).to eq(37)
180
+ expect(calc(3, 18, 24)).to eq(39)
181
+ expect(calc(3, 18, 27)).to eq(42)
182
+ expect(calc(3, 18, 29)).to eq(44)
183
+ expect(calc(3, 20, 6)).to eq(23)
184
+ expect(calc(3, 20, 8)).to eq(25)
185
+ expect(calc(3, 20, 11)).to eq(28)
186
+ expect(calc(3, 20, 13)).to eq(30)
187
+ expect(calc(3, 21, 6)).to eq(24)
188
+ expect(calc(3, 21, 18)).to eq(36)
189
+ expect(calc(3, 22, 1)).to eq(20)
190
+ expect(calc(3, 22, 27)).to eq(46)
191
+ expect(calc(3, 23, 13)).to eq(33)
192
+ expect(calc(3, 23, 22)).to eq(42)
193
+ expect(calc(3, 23, 25)).to eq(45)
194
+ expect(calc(3, 24, 2)).to eq(23)
195
+ expect(calc(3, 24, 8)).to eq(29)
196
+ expect(calc(3, 24, 23)).to eq(44)
197
+ expect(calc(3, 25, 3)).to eq(25)
198
+ expect(calc(3, 25, 16)).to eq(38)
199
+ expect(calc(3, 26, 9)).to eq(32)
200
+ expect(calc(3, 26, 26)).to eq(49)
201
+ expect(calc(3, 28, 26)).to eq(51)
202
+ expect(calc(3, 29, 7)).to eq(33)
203
+ expect(calc(3, 29, 8)).to eq(34)
204
+ expect(calc(3, 29, 13)).to eq(39)
205
+ expect(calc(3, 29, 17)).to eq(43)
206
+ expect(calc(4, 0, 1)).to eq(nil)
207
+ expect(calc(4, 0, 6)).to eq(nil)
208
+ expect(calc(4, 0, 15)).to eq(11)
209
+ expect(calc(4, 1, 12)).to eq(9)
210
+ expect(calc(4, 1, 13)).to eq(10)
211
+ expect(calc(4, 2, 2)).to eq(nil)
212
+ expect(calc(4, 3, 0)).to eq(nil)
213
+ expect(calc(4, 3, 26)).to eq(25)
214
+ expect(calc(4, 4, 4)).to eq(nil)
215
+ expect(calc(4, 5, 6)).to eq(7)
216
+ expect(calc(4, 5, 19)).to eq(20)
217
+ expect(calc(4, 7, 15)).to eq(18)
218
+ expect(calc(4, 7, 26)).to eq(29)
219
+ expect(calc(4, 8, 14)).to eq(18)
220
+ expect(calc(4, 9, 13)).to eq(18)
221
+ expect(calc(4, 11, 14)).to eq(21)
222
+ expect(calc(4, 11, 23)).to eq(30)
223
+ expect(calc(4, 12, 4)).to eq(12)
224
+ expect(calc(4, 12, 10)).to eq(18)
225
+ expect(calc(4, 14, 16)).to eq(26)
226
+ expect(calc(4, 14, 19)).to eq(29)
227
+ expect(calc(4, 14, 22)).to eq(32)
228
+ expect(calc(4, 15, 8)).to eq(19)
229
+ expect(calc(4, 15, 28)).to eq(39)
230
+ expect(calc(4, 16, 10)).to eq(22)
231
+ expect(calc(4, 16, 24)).to eq(36)
232
+ expect(calc(4, 18, 15)).to eq(29)
233
+ expect(calc(4, 18, 27)).to eq(41)
234
+ expect(calc(4, 20, 26)).to eq(42)
235
+ expect(calc(4, 21, 14)).to eq(31)
236
+ expect(calc(4, 22, 4)).to eq(22)
237
+ expect(calc(4, 23, 13)).to eq(32)
238
+ expect(calc(4, 27, 9)).to eq(32)
239
+ expect(calc(4, 28, 22)).to eq(46)
240
+ expect(calc(4, 29, 1)).to eq(26)
241
+ expect(calc(4, 29, 8)).to eq(33)
242
+ expect(calc(5, 0, 9)).to eq(nil)
243
+ expect(calc(5, 0, 12)).to eq(7)
244
+ expect(calc(5, 1, 15)).to eq(11)
245
+ expect(calc(5, 2, 14)).to eq(11)
246
+ expect(calc(5, 2, 22)).to eq(19)
247
+ expect(calc(5, 3, 20)).to eq(18)
248
+ expect(calc(5, 4, 8)).to eq(7)
249
+ expect(calc(5, 4, 15)).to eq(14)
250
+ expect(calc(5, 4, 16)).to eq(15)
251
+ expect(calc(5, 4, 17)).to eq(16)
252
+ expect(calc(5, 5, 18)).to eq(18)
253
+ expect(calc(5, 5, 23)).to eq(23)
254
+ expect(calc(5, 5, 26)).to eq(26)
255
+ expect(calc(5, 7, 14)).to eq(16)
256
+ expect(calc(5, 9, 25)).to eq(29)
257
+ expect(calc(5, 10, 3)).to eq(8)
258
+ expect(calc(5, 10, 27)).to eq(32)
259
+ expect(calc(5, 10, 28)).to eq(33)
260
+ expect(calc(5, 11, 5)).to eq(11)
261
+ expect(calc(5, 12, 3)).to eq(10)
262
+ expect(calc(5, 13, 15)).to eq(23)
263
+ expect(calc(5, 13, 25)).to eq(33)
264
+ expect(calc(5, 14, 10)).to eq(19)
265
+ expect(calc(5, 14, 17)).to eq(26)
266
+ expect(calc(5, 14, 18)).to eq(27)
267
+ expect(calc(5, 14, 24)).to eq(33)
268
+ expect(calc(5, 15, 22)).to eq(32)
269
+ expect(calc(5, 15, 29)).to eq(39)
270
+ expect(calc(5, 16, 4)).to eq(15)
271
+ expect(calc(5, 16, 8)).to eq(19)
272
+ expect(calc(5, 16, 25)).to eq(36)
273
+ expect(calc(5, 17, 1)).to eq(13)
274
+ expect(calc(5, 17, 8)).to eq(20)
275
+ expect(calc(5, 18, 4)).to eq(17)
276
+ expect(calc(5, 18, 27)).to eq(40)
277
+ expect(calc(5, 18, 28)).to eq(41)
278
+ expect(calc(5, 26, 28)).to eq(49)
279
+ expect(calc(5, 28, 0)).to eq(23)
280
+ expect(calc(5, 28, 7)).to eq(30)
281
+ expect(calc(5, 29, 18)).to eq(42)
282
+ expect(calc(6, 0, 10)).to eq(nil)
283
+ expect(calc(6, 1, 12)).to eq(7)
284
+ expect(calc(6, 1, 21)).to eq(16)
285
+ expect(calc(6, 2, 17)).to eq(13)
286
+ expect(calc(6, 2, 21)).to eq(17)
287
+ expect(calc(6, 3, 15)).to eq(12)
288
+ expect(calc(6, 4, 8)).to eq(6)
289
+ expect(calc(6, 4, 28)).to eq(26)
290
+ expect(calc(6, 6, 3)).to eq(nil)
291
+ expect(calc(6, 6, 4)).to eq(nil)
292
+ expect(calc(6, 6, 14)).to eq(14)
293
+ expect(calc(6, 6, 15)).to eq(15)
294
+ expect(calc(6, 6, 20)).to eq(20)
295
+ expect(calc(6, 7, 10)).to eq(11)
296
+ expect(calc(6, 8, 10)).to eq(12)
297
+ expect(calc(6, 9, 1)).to eq(nil)
298
+ expect(calc(6, 9, 16)).to eq(19)
299
+ expect(calc(6, 10, 7)).to eq(11)
300
+ expect(calc(6, 11, 23)).to eq(28)
301
+ expect(calc(6, 12, 11)).to eq(17)
302
+ expect(calc(6, 13, 3)).to eq(10)
303
+ expect(calc(6, 14, 1)).to eq(9)
304
+ expect(calc(6, 14, 13)).to eq(21)
305
+ expect(calc(6, 14, 17)).to eq(25)
306
+ expect(calc(6, 15, 20)).to eq(29)
307
+ expect(calc(6, 16, 0)).to eq(10)
308
+ expect(calc(6, 16, 22)).to eq(32)
309
+ expect(calc(6, 17, 3)).to eq(14)
310
+ expect(calc(6, 18, 6)).to eq(18)
311
+ expect(calc(6, 20, 26)).to eq(40)
312
+ expect(calc(6, 21, 29)).to eq(44)
313
+ expect(calc(6, 22, 20)).to eq(36)
314
+ expect(calc(6, 23, 23)).to eq(40)
315
+ expect(calc(6, 25, 26)).to eq(45)
316
+ expect(calc(6, 26, 3)).to eq(23)
317
+ expect(calc(6, 26, 13)).to eq(33)
318
+ expect(calc(6, 27, 6)).to eq(27)
319
+ expect(calc(6, 27, 7)).to eq(28)
320
+ expect(calc(6, 28, 28)).to eq(50)
321
+ expect(calc(6, 29, 10)).to eq(33)
322
+ expect(calc(6, 29, 23)).to eq(46)
323
+ expect(calc(7, 1, 11)).to eq(5)
324
+ expect(calc(7, 2, 20)).to eq(15)
325
+ expect(calc(7, 3, 16)).to eq(12)
326
+ expect(calc(7, 3, 25)).to eq(21)
327
+ expect(calc(7, 3, 28)).to eq(24)
328
+ expect(calc(7, 6, 8)).to eq(7)
329
+ expect(calc(7, 6, 14)).to eq(13)
330
+ expect(calc(7, 6, 16)).to eq(15)
331
+ expect(calc(7, 8, 10)).to eq(11)
332
+ expect(calc(7, 8, 29)).to eq(30)
333
+ expect(calc(7, 9, 22)).to eq(24)
334
+ expect(calc(7, 9, 24)).to eq(26)
335
+ expect(calc(7, 10, 2)).to eq(5)
336
+ expect(calc(7, 10, 28)).to eq(31)
337
+ expect(calc(7, 11, 14)).to eq(18)
338
+ expect(calc(7, 12, 9)).to eq(14)
339
+ expect(calc(7, 12, 19)).to eq(24)
340
+ expect(calc(7, 12, 28)).to eq(33)
341
+ expect(calc(7, 13, 4)).to eq(10)
342
+ expect(calc(7, 13, 18)).to eq(24)
343
+ expect(calc(7, 14, 4)).to eq(11)
344
+ expect(calc(7, 14, 7)).to eq(14)
345
+ expect(calc(7, 14, 14)).to eq(21)
346
+ expect(calc(7, 15, 27)).to eq(35)
347
+ expect(calc(7, 16, 7)).to eq(16)
348
+ expect(calc(7, 16, 9)).to eq(18)
349
+ expect(calc(7, 16, 10)).to eq(19)
350
+ expect(calc(7, 17, 29)).to eq(39)
351
+ expect(calc(7, 18, 1)).to eq(12)
352
+ expect(calc(7, 18, 29)).to eq(40)
353
+ expect(calc(7, 19, 3)).to eq(15)
354
+ expect(calc(7, 19, 7)).to eq(19)
355
+ expect(calc(7, 19, 18)).to eq(30)
356
+ expect(calc(7, 19, 19)).to eq(31)
357
+ expect(calc(7, 20, 0)).to eq(13)
358
+ expect(calc(7, 20, 22)).to eq(35)
359
+ expect(calc(7, 22, 25)).to eq(40)
360
+ expect(calc(7, 23, 4)).to eq(20)
361
+ expect(calc(7, 23, 8)).to eq(24)
362
+ expect(calc(7, 23, 11)).to eq(27)
363
+ expect(calc(7, 23, 16)).to eq(32)
364
+ expect(calc(7, 24, 12)).to eq(29)
365
+ expect(calc(7, 24, 24)).to eq(41)
366
+ expect(calc(7, 24, 27)).to eq(44)
367
+ expect(calc(7, 25, 2)).to eq(20)
368
+ expect(calc(7, 25, 13)).to eq(31)
369
+ expect(calc(7, 26, 23)).to eq(42)
370
+ expect(calc(7, 27, 3)).to eq(23)
371
+ expect(calc(7, 27, 5)).to eq(25)
372
+ expect(calc(7, 28, 2)).to eq(23)
373
+ expect(calc(7, 28, 20)).to eq(41)
374
+ expect(calc(8, 0, 24)).to eq(16)
375
+ expect(calc(8, 0, 26)).to eq(18)
376
+ expect(calc(8, 1, 13)).to eq(6)
377
+ expect(calc(8, 2, 4)).to eq(nil)
378
+ expect(calc(8, 2, 10)).to eq(4)
379
+ expect(calc(8, 2, 19)).to eq(13)
380
+ expect(calc(8, 3, 1)).to eq(nil)
381
+ expect(calc(8, 3, 3)).to eq(nil)
382
+ expect(calc(8, 3, 15)).to eq(10)
383
+ expect(calc(8, 3, 18)).to eq(13)
384
+ expect(calc(8, 3, 25)).to eq(20)
385
+ expect(calc(8, 4, 12)).to eq(8)
386
+ expect(calc(8, 4, 16)).to eq(12)
387
+ expect(calc(8, 5, 3)).to eq(nil)
388
+ expect(calc(8, 5, 9)).to eq(6)
389
+ expect(calc(8, 5, 10)).to eq(7)
390
+ expect(calc(8, 6, 2)).to eq(nil)
391
+ expect(calc(8, 6, 3)).to eq(nil)
392
+ expect(calc(8, 6, 10)).to eq(8)
393
+ expect(calc(8, 7, 5)).to eq(4)
394
+ expect(calc(8, 8, 5)).to eq(5)
395
+ expect(calc(8, 9, 17)).to eq(18)
396
+ expect(calc(8, 9, 23)).to eq(24)
397
+ expect(calc(8, 10, 1)).to eq(3)
398
+ expect(calc(8, 10, 3)).to eq(5)
399
+ expect(calc(8, 10, 22)).to eq(24)
400
+ expect(calc(8, 11, 7)).to eq(10)
401
+ expect(calc(8, 11, 28)).to eq(31)
402
+ expect(calc(8, 13, 6)).to eq(11)
403
+ expect(calc(8, 13, 17)).to eq(22)
404
+ expect(calc(8, 13, 26)).to eq(31)
405
+ expect(calc(8, 14, 19)).to eq(25)
406
+ expect(calc(8, 15, 2)).to eq(9)
407
+ expect(calc(8, 15, 12)).to eq(19)
408
+ expect(calc(8, 15, 18)).to eq(25)
409
+ expect(calc(8, 15, 24)).to eq(31)
410
+ expect(calc(8, 16, 4)).to eq(12)
411
+ expect(calc(8, 16, 10)).to eq(18)
412
+ expect(calc(8, 17, 10)).to eq(19)
413
+ expect(calc(8, 17, 27)).to eq(36)
414
+ expect(calc(8, 18, 17)).to eq(27)
415
+ expect(calc(8, 19, 28)).to eq(39)
416
+ expect(calc(8, 20, 7)).to eq(19)
417
+ expect(calc(8, 20, 24)).to eq(36)
418
+ expect(calc(8, 20, 29)).to eq(41)
419
+ expect(calc(8, 21, 14)).to eq(27)
420
+ expect(calc(8, 21, 16)).to eq(29)
421
+ expect(calc(8, 21, 23)).to eq(36)
422
+ expect(calc(8, 21, 25)).to eq(38)
423
+ expect(calc(8, 22, 19)).to eq(33)
424
+ expect(calc(8, 23, 1)).to eq(16)
425
+ expect(calc(8, 24, 12)).to eq(28)
426
+ expect(calc(8, 24, 22)).to eq(38)
427
+ expect(calc(8, 24, 24)).to eq(40)
428
+ expect(calc(8, 25, 8)).to eq(25)
429
+ expect(calc(8, 25, 16)).to eq(33)
430
+ expect(calc(8, 25, 20)).to eq(37)
431
+ expect(calc(8, 27, 1)).to eq(20)
432
+ expect(calc(8, 27, 4)).to eq(23)
433
+ expect(calc(8, 27, 21)).to eq(40)
434
+ expect(calc(8, 28, 16)).to eq(36)
435
+ expect(calc(8, 28, 18)).to eq(38)
436
+ expect(calc(8, 29, 8)).to eq(29)
437
+ expect(calc(8, 29, 9)).to eq(30)
438
+ expect(calc(9, 0, 12)).to eq(3)
439
+ expect(calc(9, 4, 3)).to eq(nil)
440
+ expect(calc(9, 5, 29)).to eq(25)
441
+ expect(calc(9, 6, 16)).to eq(13)
442
+ expect(calc(9, 6, 24)).to eq(21)
443
+ expect(calc(9, 7, 11)).to eq(9)
444
+ expect(calc(9, 7, 22)).to eq(20)
445
+ expect(calc(9, 7, 24)).to eq(22)
446
+ expect(calc(9, 7, 25)).to eq(23)
447
+ expect(calc(9, 8, 2)).to eq(nil)
448
+ expect(calc(9, 8, 3)).to eq(2)
449
+ expect(calc(9, 8, 8)).to eq(7)
450
+ expect(calc(9, 8, 14)).to eq(13)
451
+ expect(calc(9, 8, 15)).to eq(14)
452
+ expect(calc(9, 9, 1)).to eq(nil)
453
+ expect(calc(9, 9, 28)).to eq(28)
454
+ expect(calc(9, 10, 19)).to eq(20)
455
+ expect(calc(9, 10, 21)).to eq(22)
456
+ expect(calc(9, 12, 25)).to eq(28)
457
+ expect(calc(9, 13, 17)).to eq(21)
458
+ expect(calc(9, 13, 18)).to eq(22)
459
+ expect(calc(9, 14, 11)).to eq(16)
460
+ expect(calc(9, 14, 22)).to eq(27)
461
+ expect(calc(9, 15, 19)).to eq(25)
462
+ expect(calc(9, 16, 11)).to eq(18)
463
+ expect(calc(9, 16, 19)).to eq(26)
464
+ expect(calc(9, 16, 23)).to eq(30)
465
+ expect(calc(9, 17, 4)).to eq(12)
466
+ expect(calc(9, 17, 26)).to eq(34)
467
+ expect(calc(9, 18, 3)).to eq(12)
468
+ expect(calc(9, 18, 10)).to eq(19)
469
+ expect(calc(9, 18, 19)).to eq(28)
470
+ expect(calc(9, 18, 29)).to eq(38)
471
+ expect(calc(9, 19, 21)).to eq(31)
472
+ expect(calc(9, 19, 24)).to eq(34)
473
+ expect(calc(9, 20, 9)).to eq(20)
474
+ expect(calc(9, 20, 19)).to eq(30)
475
+ expect(calc(9, 20, 28)).to eq(39)
476
+ expect(calc(9, 21, 29)).to eq(41)
477
+ expect(calc(9, 22, 5)).to eq(18)
478
+ expect(calc(9, 23, 5)).to eq(19)
479
+ expect(calc(9, 23, 26)).to eq(40)
480
+ expect(calc(9, 23, 27)).to eq(41)
481
+ expect(calc(9, 24, 12)).to eq(27)
482
+ expect(calc(9, 24, 17)).to eq(32)
483
+ expect(calc(9, 25, 27)).to eq(43)
484
+ expect(calc(9, 27, 0)).to eq(18)
485
+ expect(calc(9, 27, 3)).to eq(21)
486
+ expect(calc(9, 27, 5)).to eq(23)
487
+ expect(calc(9, 27, 11)).to eq(29)
488
+ expect(calc(9, 27, 15)).to eq(33)
489
+ expect(calc(9, 27, 24)).to eq(42)
490
+ expect(calc(9, 28, 10)).to eq(29)
491
+ expect(calc(9, 28, 23)).to eq(42)
492
+ expect(calc(9, 29, 7)).to eq(27)
493
+ expect(calc(10, 0, 29)).to eq(19)
494
+ expect(calc(10, 1, 23)).to eq(14)
495
+ expect(calc(10, 2, 28)).to eq(20)
496
+ expect(calc(10, 3, 8)).to eq(1)
497
+ expect(calc(10, 3, 23)).to eq(16)
498
+ expect(calc(10, 6, 0)).to eq(nil)
499
+ expect(calc(10, 6, 14)).to eq(10)
500
+ expect(calc(10, 6, 19)).to eq(15)
501
+ expect(calc(10, 6, 25)).to eq(21)
502
+ expect(calc(10, 6, 29)).to eq(25)
503
+ expect(calc(10, 7, 1)).to eq(nil)
504
+ expect(calc(10, 8, 20)).to eq(18)
505
+ expect(calc(10, 9, 14)).to eq(13)
506
+ expect(calc(10, 9, 28)).to eq(27)
507
+ expect(calc(10, 10, 3)).to eq(3)
508
+ expect(calc(10, 10, 27)).to eq(27)
509
+ expect(calc(10, 11, 20)).to eq(21)
510
+ expect(calc(10, 11, 21)).to eq(22)
511
+ expect(calc(10, 11, 22)).to eq(23)
512
+ expect(calc(10, 12, 24)).to eq(26)
513
+ expect(calc(10, 17, 29)).to eq(36)
514
+ expect(calc(10, 18, 14)).to eq(22)
515
+ expect(calc(10, 18, 23)).to eq(31)
516
+ expect(calc(10, 18, 25)).to eq(33)
517
+ expect(calc(10, 20, 0)).to eq(10)
518
+ expect(calc(10, 21, 27)).to eq(38)
519
+ expect(calc(10, 23, 13)).to eq(26)
520
+ expect(calc(10, 23, 25)).to eq(38)
521
+ expect(calc(10, 24, 4)).to eq(18)
522
+ expect(calc(10, 24, 15)).to eq(29)
523
+ expect(calc(10, 24, 23)).to eq(37)
524
+ expect(calc(10, 25, 1)).to eq(16)
525
+ expect(calc(10, 25, 17)).to eq(32)
526
+ expect(calc(10, 25, 26)).to eq(41)
527
+ expect(calc(10, 27, 12)).to eq(29)
528
+ expect(calc(10, 27, 17)).to eq(34)
529
+ expect(calc(10, 27, 26)).to eq(43)
530
+ expect(calc(10, 28, 2)).to eq(20)
531
+ expect(calc(10, 29, 3)).to eq(22)
532
+ expect(calc(10, 29, 7)).to eq(26)
533
+ expect(calc(10, 29, 8)).to eq(27)
534
+ expect(calc(10, 29, 14)).to eq(33)
535
+ expect(calc(10, 29, 27)).to eq(46)
536
+ expect(calc(11, 0, 19)).to eq(30)
537
+ expect(calc(11, 0, 22)).to eq(-11)
538
+ expect(calc(11, 1, 1)).to eq(13)
539
+ expect(calc(11, 1, 20)).to eq(32)
540
+ expect(calc(11, 2, 11)).to eq(24)
541
+ expect(calc(11, 2, 27)).to eq(-14)
542
+ expect(calc(11, 3, 18)).to eq(32)
543
+ expect(calc(11, 3, 19)).to eq(33)
544
+ expect(calc(11, 3, 27)).to eq(-13)
545
+ expect(calc(11, 4, 11)).to eq(26)
546
+ expect(calc(11, 4, 19)).to eq(34)
547
+ expect(calc(11, 4, 22)).to eq(-7)
548
+ expect(calc(11, 5, 0)).to eq(16)
549
+ expect(calc(11, 6, 0)).to eq(17)
550
+ expect(calc(11, 7, 6)).to eq(24)
551
+ expect(calc(11, 7, 9)).to eq(27)
552
+ expect(calc(11, 7, 21)).to eq(-3)
553
+ expect(calc(11, 7, 25)).to eq(-7)
554
+ expect(calc(11, 8, 25)).to eq(-6)
555
+ expect(calc(11, 9, 10)).to eq(30)
556
+ expect(calc(11, 9, 25)).to eq(-5)
557
+ expect(calc(11, 10, 5)).to eq(26)
558
+ expect(calc(11, 11, 0)).to eq(22)
559
+ expect(calc(11, 11, 8)).to eq(30)
560
+ expect(calc(11, 11, 9)).to eq(31)
561
+ expect(calc(11, 11, 15)).to eq(-8)
562
+ expect(calc(11, 11, 24)).to eq(-26)
563
+ expect(calc(11, 11, 27)).to eq(-32)
564
+ expect(calc(11, 12, 18)).to eq(-13)
565
+ expect(calc(11, 13, 6)).to eq(30)
566
+ expect(calc(11, 13, 9)).to eq(33)
567
+ expect(calc(11, 13, 26)).to eq(-28)
568
+ expect(calc(11, 14, 11)).to eq(3)
569
+ expect(calc(11, 15, 0)).to eq(26)
570
+ expect(calc(11, 15, 17)).to eq(-8)
571
+ expect(calc(11, 15, 20)).to eq(-14)
572
+ expect(calc(11, 15, 27)).to eq(-28)
573
+ expect(calc(11, 15, 29)).to eq(-32)
574
+ expect(calc(11, 16, 1)).to eq(28)
575
+ expect(calc(11, 17, 15)).to eq(-2)
576
+ expect(calc(11, 17, 22)).to eq(-16)
577
+ expect(calc(11, 18, 3)).to eq(32)
578
+ expect(calc(11, 18, 15)).to eq(-1)
579
+ expect(calc(11, 19, 3)).to eq(33)
580
+ expect(calc(11, 21, 12)).to eq(8)
581
+ expect(calc(11, 21, 17)).to eq(-2)
582
+ expect(calc(11, 21, 19)).to eq(-6)
583
+ expect(calc(11, 23, 15)).to eq(4)
584
+ expect(calc(11, 23, 22)).to eq(-10)
585
+ expect(calc(11, 23, 27)).to eq(-20)
586
+ expect(calc(11, 24, 7)).to eq(42)
587
+ expect(calc(11, 25, 5)).to eq(41)
588
+ expect(calc(11, 25, 9)).to eq(45)
589
+ expect(calc(11, 25, 13)).to eq(10)
590
+ expect(calc(11, 26, 1)).to eq(38)
591
+ expect(calc(11, 29, 20)).to eq(0)
592
+ expect(calc(12, 0, 5)).to eq(17)
593
+ expect(calc(12, 0, 18)).to eq(30)
594
+ expect(calc(12, 1, 8)).to eq(21)
595
+ expect(calc(12, 1, 24)).to eq(-11)
596
+ expect(calc(12, 2, 2)).to eq(16)
597
+ expect(calc(12, 3, 4)).to eq(19)
598
+ expect(calc(12, 3, 5)).to eq(20)
599
+ expect(calc(12, 5, 1)).to eq(18)
600
+ expect(calc(12, 6, 0)).to eq(18)
601
+ expect(calc(12, 6, 3)).to eq(21)
602
+ expect(calc(12, 7, 6)).to eq(25)
603
+ expect(calc(12, 7, 27)).to eq(-8)
604
+ expect(calc(12, 8, 3)).to eq(23)
605
+ expect(calc(12, 8, 5)).to eq(25)
606
+ expect(calc(12, 8, 27)).to eq(-7)
607
+ expect(calc(12, 9, 9)).to eq(30)
608
+ expect(calc(12, 10, 21)).to eq(1)
609
+ expect(calc(12, 11, 5)).to eq(28)
610
+ expect(calc(12, 12, 18)).to eq(-12)
611
+ expect(calc(12, 12, 19)).to eq(-14)
612
+ expect(calc(12, 12, 28)).to eq(-32)
613
+ expect(calc(12, 12, 29)).to eq(-34)
614
+ expect(calc(12, 13, 1)).to eq(26)
615
+ expect(calc(12, 13, 23)).to eq(-21)
616
+ expect(calc(12, 13, 27)).to eq(-29)
617
+ expect(calc(12, 14, 2)).to eq(28)
618
+ expect(calc(12, 14, 15)).to eq(-4)
619
+ expect(calc(12, 14, 17)).to eq(-8)
620
+ expect(calc(12, 15, 11)).to eq(5)
621
+ expect(calc(12, 15, 29)).to eq(-31)
622
+ expect(calc(12, 16, 9)).to eq(37)
623
+ expect(calc(12, 16, 11)).to eq(6)
624
+ expect(calc(12, 16, 12)).to eq(4)
625
+ expect(calc(12, 16, 26)).to eq(-24)
626
+ expect(calc(12, 17, 21)).to eq(-13)
627
+ expect(calc(12, 18, 27)).to eq(-24)
628
+ expect(calc(12, 19, 3)).to eq(34)
629
+ expect(calc(12, 20, 9)).to eq(41)
630
+ expect(calc(12, 21, 16)).to eq(1)
631
+ expect(calc(12, 22, 17)).to eq(0)
632
+ expect(calc(12, 22, 27)).to eq(-20)
633
+ expect(calc(12, 23, 3)).to eq(38)
634
+ expect(calc(12, 24, 11)).to eq(14)
635
+ expect(calc(12, 25, 3)).to eq(40)
636
+ expect(calc(12, 25, 15)).to eq(7)
637
+ expect(calc(12, 25, 16)).to eq(5)
638
+ expect(calc(12, 25, 17)).to eq(3)
639
+ expect(calc(12, 25, 21)).to eq(-5)
640
+ expect(calc(12, 26, 11)).to eq(16)
641
+ expect(calc(12, 26, 19)).to eq(0)
642
+ expect(calc(12, 27, 0)).to eq(39)
643
+ expect(calc(12, 27, 5)).to eq(44)
644
+ expect(calc(12, 27, 11)).to eq(17)
645
+ expect(calc(12, 27, 21)).to eq(-3)
646
+ expect(calc(12, 28, 18)).to eq(4)
647
+ expect(calc(12, 28, 20)).to eq(0)
648
+ expect(calc(12, 29, 29)).to eq(-17)
649
+ expect(calc(13, 0, 1)).to eq(14)
650
+ expect(calc(13, 1, 18)).to eq(32)
651
+ expect(calc(13, 2, 16)).to eq(31)
652
+ expect(calc(13, 3, 7)).to eq(23)
653
+ expect(calc(13, 3, 19)).to eq(35)
654
+ expect(calc(13, 3, 22)).to eq(-6)
655
+ expect(calc(13, 4, 4)).to eq(21)
656
+ expect(calc(13, 7, 5)).to eq(25)
657
+ expect(calc(13, 7, 8)).to eq(28)
658
+ expect(calc(13, 7, 10)).to eq(30)
659
+ expect(calc(13, 7, 18)).to eq(38)
660
+ expect(calc(13, 7, 20)).to eq(40)
661
+ expect(calc(13, 7, 22)).to eq(-2)
662
+ expect(calc(13, 8, 11)).to eq(32)
663
+ expect(calc(13, 8, 21)).to eq(0)
664
+ expect(calc(13, 12, 10)).to eq(35)
665
+ expect(calc(13, 12, 14)).to eq(-3)
666
+ expect(calc(13, 12, 15)).to eq(-5)
667
+ expect(calc(13, 13, 7)).to eq(33)
668
+ expect(calc(13, 14, 4)).to eq(31)
669
+ expect(calc(13, 14, 10)).to eq(37)
670
+ expect(calc(13, 14, 11)).to eq(5)
671
+ expect(calc(13, 16, 26)).to eq(-23)
672
+ expect(calc(13, 17, 2)).to eq(32)
673
+ expect(calc(13, 17, 8)).to eq(38)
674
+ expect(calc(13, 17, 26)).to eq(-22)
675
+ expect(calc(13, 18, 11)).to eq(9)
676
+ expect(calc(13, 18, 23)).to eq(-15)
677
+ expect(calc(13, 19, 1)).to eq(33)
678
+ expect(calc(13, 20, 11)).to eq(11)
679
+ expect(calc(13, 20, 16)).to eq(1)
680
+ expect(calc(13, 21, 9)).to eq(43)
681
+ expect(calc(13, 22, 14)).to eq(7)
682
+ expect(calc(13, 22, 19)).to eq(-3)
683
+ expect(calc(13, 22, 29)).to eq(-23)
684
+ expect(calc(13, 23, 23)).to eq(-10)
685
+ expect(calc(13, 24, 8)).to eq(45)
686
+ expect(calc(13, 24, 15)).to eq(7)
687
+ expect(calc(13, 24, 23)).to eq(-9)
688
+ expect(calc(13, 27, 28)).to eq(-16)
689
+ expect(calc(13, 28, 28)).to eq(-15)
690
+ expect(calc(13, 29, 11)).to eq(20)
691
+ expect(calc(13, 29, 18)).to eq(6)
692
+ expect(calc(14, 0, 27)).to eq(-13)
693
+ expect(calc(14, 1, 15)).to eq(30)
694
+ expect(calc(14, 1, 25)).to eq(-10)
695
+ expect(calc(14, 3, 13)).to eq(30)
696
+ expect(calc(14, 6, 10)).to eq(30)
697
+ expect(calc(14, 7, 19)).to eq(40)
698
+ expect(calc(14, 8, 1)).to eq(23)
699
+ expect(calc(14, 8, 5)).to eq(27)
700
+ expect(calc(14, 8, 23)).to eq(-1)
701
+ expect(calc(14, 8, 25)).to eq(-3)
702
+ expect(calc(14, 8, 26)).to eq(-4)
703
+ expect(calc(14, 10, 19)).to eq(43)
704
+ expect(calc(14, 11, 11)).to eq(3)
705
+ expect(calc(14, 11, 23)).to eq(-21)
706
+ expect(calc(14, 12, 13)).to eq(0)
707
+ expect(calc(14, 12, 22)).to eq(-18)
708
+ expect(calc(14, 13, 0)).to eq(27)
709
+ expect(calc(14, 13, 11)).to eq(5)
710
+ expect(calc(14, 13, 17)).to eq(-7)
711
+ expect(calc(14, 13, 23)).to eq(-19)
712
+ expect(calc(14, 13, 24)).to eq(-21)
713
+ expect(calc(14, 15, 9)).to eq(38)
714
+ expect(calc(14, 16, 4)).to eq(34)
715
+ expect(calc(14, 16, 10)).to eq(40)
716
+ expect(calc(14, 16, 20)).to eq(-10)
717
+ expect(calc(14, 16, 26)).to eq(-22)
718
+ expect(calc(14, 17, 4)).to eq(35)
719
+ expect(calc(14, 17, 9)).to eq(40)
720
+ expect(calc(14, 17, 23)).to eq(-15)
721
+ expect(calc(14, 17, 26)).to eq(-21)
722
+ expect(calc(14, 18, 26)).to eq(-20)
723
+ expect(calc(14, 19, 1)).to eq(34)
724
+ expect(calc(14, 19, 5)).to eq(38)
725
+ expect(calc(14, 19, 7)).to eq(40)
726
+ expect(calc(14, 19, 20)).to eq(-7)
727
+ expect(calc(14, 20, 29)).to eq(-24)
728
+ expect(calc(14, 23, 19)).to eq(-1)
729
+ expect(calc(14, 24, 6)).to eq(44)
730
+ expect(calc(14, 25, 22)).to eq(-5)
731
+ expect(calc(14, 26, 15)).to eq(10)
732
+ expect(calc(14, 26, 17)).to eq(6)
733
+ expect(calc(14, 27, 25)).to eq(-9)
734
+ expect(calc(14, 29, 2)).to eq(45)
735
+ expect(calc(14, 29, 3)).to eq(46)
736
+ expect(calc(14, 29, 4)).to eq(47)
737
+ expect(calc(14, 29, 21)).to eq(1)
738
+ expect(calc(14, 29, 22)).to eq(-1)
739
+ expect(calc(15, 5, 16)).to eq(36)
740
+ expect(calc(15, 5, 20)).to eq(40)
741
+ expect(calc(15, 6, 22)).to eq(-1)
742
+ expect(calc(15, 6, 27)).to eq(-6)
743
+ expect(calc(15, 7, 9)).to eq(31)
744
+ expect(calc(15, 8, 18)).to eq(41)
745
+ expect(calc(15, 9, 0)).to eq(24)
746
+ expect(calc(15, 9, 3)).to eq(27)
747
+ expect(calc(15, 9, 10)).to eq(34)
748
+ expect(calc(15, 10, 20)).to eq(45)
749
+ expect(calc(15, 10, 24)).to eq(1)
750
+ expect(calc(15, 10, 26)).to eq(-1)
751
+ expect(calc(15, 11, 5)).to eq(31)
752
+ expect(calc(15, 11, 22)).to eq(-18)
753
+ expect(calc(15, 11, 24)).to eq(-22)
754
+ expect(calc(15, 12, 29)).to eq(-31)
755
+ expect(calc(15, 13, 16)).to eq(-4)
756
+ expect(calc(15, 13, 25)).to eq(-22)
757
+ expect(calc(15, 14, 11)).to eq(7)
758
+ expect(calc(15, 14, 26)).to eq(-23)
759
+ expect(calc(15, 15, 0)).to eq(30)
760
+ expect(calc(15, 16, 6)).to eq(37)
761
+ expect(calc(15, 16, 8)).to eq(39)
762
+ expect(calc(15, 16, 16)).to eq(-1)
763
+ expect(calc(15, 16, 28)).to eq(-25)
764
+ expect(calc(15, 16, 29)).to eq(-27)
765
+ expect(calc(15, 17, 3)).to eq(35)
766
+ expect(calc(15, 17, 10)).to eq(42)
767
+ expect(calc(15, 17, 28)).to eq(-24)
768
+ expect(calc(15, 18, 11)).to eq(11)
769
+ expect(calc(15, 18, 26)).to eq(-19)
770
+ expect(calc(15, 18, 27)).to eq(-21)
771
+ expect(calc(15, 19, 9)).to eq(43)
772
+ expect(calc(15, 19, 12)).to eq(10)
773
+ expect(calc(15, 19, 24)).to eq(-14)
774
+ expect(calc(15, 19, 29)).to eq(-24)
775
+ expect(calc(15, 20, 15)).to eq(5)
776
+ expect(calc(15, 23, 12)).to eq(14)
777
+ expect(calc(15, 24, 26)).to eq(-13)
778
+ expect(calc(15, 25, 20)).to eq(0)
779
+ expect(calc(15, 25, 28)).to eq(-16)
780
+ expect(calc(15, 27, 20)).to eq(2)
781
+ expect(calc(15, 27, 25)).to eq(-8)
782
+ expect(calc(15, 28, 22)).to eq(-1)
783
+ expect(calc(15, 28, 25)).to eq(-7)
784
+ expect(calc(15, 29, 29)).to eq(-14)
785
+ expect(calc(16, 0, 13)).to eq(29)
786
+ expect(calc(16, 1, 10)).to eq(27)
787
+ expect(calc(16, 1, 22)).to eq(-5)
788
+ expect(calc(16, 2, 2)).to eq(20)
789
+ expect(calc(16, 2, 10)).to eq(28)
790
+ expect(calc(16, 2, 12)).to eq(30)
791
+ expect(calc(16, 2, 15)).to eq(33)
792
+ expect(calc(16, 3, 18)).to eq(37)
793
+ expect(calc(16, 3, 20)).to eq(39)
794
+ expect(calc(16, 4, 6)).to eq(26)
795
+ expect(calc(16, 6, 10)).to eq(32)
796
+ expect(calc(16, 6, 12)).to eq(34)
797
+ expect(calc(16, 7, 1)).to eq(24)
798
+ expect(calc(16, 7, 15)).to eq(38)
799
+ expect(calc(16, 8, 5)).to eq(29)
800
+ expect(calc(16, 9, 12)).to eq(37)
801
+ expect(calc(16, 10, 19)).to eq(45)
802
+ expect(calc(16, 10, 25)).to eq(1)
803
+ expect(calc(16, 11, 26)).to eq(-25)
804
+ expect(calc(16, 11, 29)).to eq(-31)
805
+ expect(calc(16, 12, 3)).to eq(31)
806
+ expect(calc(16, 12, 13)).to eq(2)
807
+ expect(calc(16, 12, 15)).to eq(-2)
808
+ expect(calc(16, 13, 7)).to eq(36)
809
+ expect(calc(16, 13, 13)).to eq(3)
810
+ expect(calc(16, 14, 17)).to eq(-4)
811
+ expect(calc(16, 15, 1)).to eq(32)
812
+ expect(calc(16, 16, 15)).to eq(2)
813
+ expect(calc(16, 17, 4)).to eq(37)
814
+ expect(calc(16, 17, 5)).to eq(38)
815
+ expect(calc(16, 18, 1)).to eq(35)
816
+ expect(calc(16, 18, 4)).to eq(38)
817
+ expect(calc(16, 18, 11)).to eq(12)
818
+ expect(calc(16, 19, 4)).to eq(39)
819
+ expect(calc(16, 19, 17)).to eq(1)
820
+ expect(calc(16, 20, 20)).to eq(-4)
821
+ expect(calc(16, 20, 24)).to eq(-12)
822
+ expect(calc(16, 20, 25)).to eq(-14)
823
+ expect(calc(16, 20, 27)).to eq(-18)
824
+ expect(calc(16, 21, 22)).to eq(-7)
825
+ expect(calc(16, 22, 25)).to eq(-12)
826
+ expect(calc(16, 22, 28)).to eq(-18)
827
+ expect(calc(16, 23, 11)).to eq(17)
828
+ expect(calc(16, 23, 16)).to eq(7)
829
+ expect(calc(16, 23, 18)).to eq(3)
830
+ expect(calc(16, 24, 2)).to eq(42)
831
+ expect(calc(16, 24, 19)).to eq(2)
832
+ expect(calc(16, 25, 5)).to eq(46)
833
+ expect(calc(16, 25, 14)).to eq(13)
834
+ expect(calc(16, 26, 2)).to eq(44)
835
+ expect(calc(16, 26, 8)).to eq(50)
836
+ expect(calc(16, 26, 24)).to eq(-6)
837
+ expect(calc(16, 27, 18)).to eq(7)
838
+ expect(calc(16, 27, 27)).to eq(-11)
839
+ expect(calc(16, 28, 13)).to eq(18)
840
+ expect(calc(16, 28, 14)).to eq(16)
841
+ expect(calc(16, 29, 16)).to eq(13)
842
+ expect(calc(17, 0, 6)).to eq(23)
843
+ expect(calc(17, 0, 8)).to eq(25)
844
+ expect(calc(17, 1, 27)).to eq(-9)
845
+ expect(calc(17, 2, 3)).to eq(22)
846
+ expect(calc(17, 2, 8)).to eq(27)
847
+ expect(calc(17, 3, 18)).to eq(38)
848
+ expect(calc(17, 4, 2)).to eq(23)
849
+ expect(calc(17, 5, 8)).to eq(30)
850
+ expect(calc(17, 5, 14)).to eq(36)
851
+ expect(calc(17, 5, 17)).to eq(39)
852
+ expect(calc(17, 6, 1)).to eq(24)
853
+ expect(calc(17, 6, 2)).to eq(25)
854
+ expect(calc(17, 8, 2)).to eq(27)
855
+ expect(calc(17, 8, 3)).to eq(28)
856
+ expect(calc(17, 8, 15)).to eq(40)
857
+ expect(calc(17, 11, 28)).to eq(-28)
858
+ expect(calc(17, 12, 2)).to eq(31)
859
+ expect(calc(17, 13, 18)).to eq(-6)
860
+ expect(calc(17, 13, 27)).to eq(-24)
861
+ expect(calc(17, 14, 10)).to eq(41)
862
+ expect(calc(17, 14, 16)).to eq(-1)
863
+ expect(calc(17, 14, 24)).to eq(-17)
864
+ expect(calc(17, 14, 28)).to eq(-25)
865
+ expect(calc(17, 15, 23)).to eq(-14)
866
+ expect(calc(17, 16, 19)).to eq(-5)
867
+ expect(calc(17, 16, 23)).to eq(-13)
868
+ expect(calc(17, 17, 16)).to eq(2)
869
+ expect(calc(17, 17, 19)).to eq(-4)
870
+ expect(calc(17, 18, 10)).to eq(45)
871
+ expect(calc(17, 18, 17)).to eq(1)
872
+ expect(calc(17, 20, 1)).to eq(38)
873
+ expect(calc(17, 21, 1)).to eq(39)
874
+ expect(calc(17, 21, 11)).to eq(16)
875
+ expect(calc(17, 22, 7)).to eq(46)
876
+ expect(calc(17, 23, 26)).to eq(-12)
877
+ expect(calc(17, 25, 2)).to eq(44)
878
+ expect(calc(17, 25, 6)).to eq(48)
879
+ expect(calc(17, 25, 10)).to eq(52)
880
+ expect(calc(17, 26, 14)).to eq(15)
881
+ expect(calc(17, 27, 2)).to eq(46)
882
+ expect(calc(17, 27, 4)).to eq(48)
883
+ expect(calc(17, 27, 6)).to eq(50)
884
+ expect(calc(17, 27, 14)).to eq(16)
885
+ expect(calc(17, 28, 7)).to eq(52)
886
+ expect(calc(17, 29, 14)).to eq(18)
887
+ expect(calc(18, 0, 3)).to eq(21)
888
+ expect(calc(18, 0, 9)).to eq(27)
889
+ expect(calc(18, 1, 15)).to eq(34)
890
+ expect(calc(18, 2, 9)).to eq(29)
891
+ expect(calc(18, 3, 3)).to eq(24)
892
+ expect(calc(18, 3, 6)).to eq(27)
893
+ expect(calc(18, 3, 11)).to eq(32)
894
+ expect(calc(18, 4, 10)).to eq(32)
895
+ expect(calc(18, 6, 29)).to eq(-5)
896
+ expect(calc(18, 7, 7)).to eq(32)
897
+ expect(calc(18, 8, 9)).to eq(35)
898
+ expect(calc(18, 8, 19)).to eq(45)
899
+ expect(calc(18, 9, 21)).to eq(6)
900
+ expect(calc(18, 9, 23)).to eq(4)
901
+ expect(calc(18, 10, 1)).to eq(29)
902
+ expect(calc(18, 10, 24)).to eq(4)
903
+ expect(calc(18, 12, 29)).to eq(-28)
904
+ expect(calc(18, 13, 1)).to eq(32)
905
+ expect(calc(18, 14, 3)).to eq(35)
906
+ expect(calc(18, 14, 8)).to eq(40)
907
+ expect(calc(18, 14, 24)).to eq(-16)
908
+ expect(calc(18, 14, 26)).to eq(-20)
909
+ expect(calc(18, 16, 6)).to eq(40)
910
+ expect(calc(18, 16, 9)).to eq(43)
911
+ expect(calc(18, 16, 13)).to eq(8)
912
+ expect(calc(18, 17, 18)).to eq(-1)
913
+ expect(calc(18, 17, 22)).to eq(-9)
914
+ expect(calc(18, 17, 28)).to eq(-21)
915
+ expect(calc(18, 18, 25)).to eq(-14)
916
+ expect(calc(18, 21, 3)).to eq(42)
917
+ expect(calc(18, 21, 21)).to eq(-3)
918
+ expect(calc(18, 22, 12)).to eq(16)
919
+ expect(calc(18, 22, 24)).to eq(-8)
920
+ expect(calc(18, 23, 12)).to eq(17)
921
+ expect(calc(18, 24, 21)).to eq(0)
922
+ expect(calc(18, 25, 21)).to eq(1)
923
+ expect(calc(18, 26, 15)).to eq(14)
924
+ expect(calc(18, 26, 24)).to eq(-4)
925
+ expect(calc(18, 26, 26)).to eq(-8)
926
+ expect(calc(18, 27, 14)).to eq(17)
927
+ expect(calc(18, 27, 17)).to eq(11)
928
+ expect(calc(18, 28, 24)).to eq(-2)
929
+ expect(calc(18, 29, 13)).to eq(21)
930
+ expect(calc(19, 3, 5)).to eq(27)
931
+ expect(calc(19, 3, 21)).to eq(1)
932
+ expect(calc(19, 4, 18)).to eq(41)
933
+ expect(calc(19, 5, 9)).to eq(33)
934
+ expect(calc(19, 6, 25)).to eq(0)
935
+ expect(calc(19, 6, 27)).to eq(-2)
936
+ expect(calc(19, 7, 21)).to eq(5)
937
+ expect(calc(19, 8, 17)).to eq(44)
938
+ expect(calc(19, 8, 20)).to eq(47)
939
+ expect(calc(19, 9, 15)).to eq(43)
940
+ expect(calc(19, 9, 25)).to eq(3)
941
+ expect(calc(19, 9, 27)).to eq(1)
942
+ expect(calc(19, 9, 28)).to eq(0)
943
+ expect(calc(19, 10, 4)).to eq(33)
944
+ expect(calc(19, 10, 5)).to eq(34)
945
+ expect(calc(19, 10, 15)).to eq(44)
946
+ expect(calc(19, 10, 26)).to eq(3)
947
+ expect(calc(19, 10, 28)).to eq(1)
948
+ expect(calc(19, 11, 5)).to eq(35)
949
+ expect(calc(19, 11, 19)).to eq(-8)
950
+ expect(calc(19, 13, 15)).to eq(2)
951
+ expect(calc(19, 13, 16)).to eq(0)
952
+ expect(calc(19, 13, 20)).to eq(-8)
953
+ expect(calc(19, 13, 27)).to eq(-22)
954
+ expect(calc(19, 14, 13)).to eq(7)
955
+ expect(calc(19, 16, 2)).to eq(37)
956
+ expect(calc(19, 16, 13)).to eq(9)
957
+ expect(calc(19, 16, 29)).to eq(-23)
958
+ expect(calc(19, 17, 10)).to eq(46)
959
+ expect(calc(19, 17, 28)).to eq(-20)
960
+ expect(calc(19, 18, 22)).to eq(-7)
961
+ expect(calc(19, 19, 12)).to eq(14)
962
+ expect(calc(19, 20, 2)).to eq(41)
963
+ expect(calc(19, 20, 14)).to eq(11)
964
+ expect(calc(19, 20, 24)).to eq(-9)
965
+ expect(calc(19, 21, 12)).to eq(16)
966
+ expect(calc(19, 21, 26)).to eq(-12)
967
+ expect(calc(19, 22, 20)).to eq(1)
968
+ expect(calc(19, 22, 22)).to eq(-3)
969
+ expect(calc(19, 23, 18)).to eq(6)
970
+ expect(calc(19, 24, 18)).to eq(7)
971
+ expect(calc(19, 25, 15)).to eq(14)
972
+ expect(calc(19, 25, 26)).to eq(-8)
973
+ expect(calc(19, 26, 7)).to eq(52)
974
+ expect(calc(19, 26, 21)).to eq(3)
975
+ expect(calc(19, 27, 7)).to eq(53)
976
+ expect(calc(19, 27, 15)).to eq(16)
977
+ expect(calc(19, 28, 7)).to eq(54)
978
+ expect(calc(19, 28, 21)).to eq(5)
979
+ expect(calc(19, 28, 23)).to eq(1)
980
+ expect(calc(19, 28, 27)).to eq(-7)
981
+ expect(calc(19, 29, 10)).to eq(58)
982
+ expect(calc(19, 29, 11)).to eq(26)
983
+ expect(calc(19, 29, 25)).to eq(-2)
984
+ end
985
+ end