fizzbuzzer 1.0.0 → 1.1.0
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 +4 -4
- data/Manifest.txt +1 -0
- data/README.md +113 -41
- data/lib/fizzbuzzer.rb +38 -41
- data/lib/fizzbuzzer/version.rb +1 -1
- data/test/test_driven.rb +61 -0
- data/test/test_fizzbuzz.rb +3 -11
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 257500b27fdf676a85d3671553510fcde0ec2fa3
|
4
|
+
data.tar.gz: 69812a749e44213e790167fb8b925391ea85317f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3eeb4670da60daa491e639286d11804329eee875f11847ee11d94a95a897ea2dffc2c01e625517bbca732e0f0896375e667f0b08daf04a38619d1176feb1a86d
|
7
|
+
data.tar.gz: 6116a56553ef18c25dda8ef1cd0903bf8206fc340dac31f5fea980824ac1e4e02138a6f91221cd3dccf667cf7376d3e68d031678ee32088e450f65c74eedaeda
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -182,28 +182,27 @@ end
|
|
182
182
|
|
183
183
|
``` ruby
|
184
184
|
class Fizznum
|
185
|
-
attr_accessor :num
|
186
185
|
|
187
|
-
def initialize(
|
188
|
-
|
186
|
+
def initialize(n)
|
187
|
+
@n = n
|
189
188
|
end
|
190
189
|
|
191
|
-
def fizzbuzz?()
|
192
|
-
def fizz?()
|
193
|
-
def buzz?()
|
190
|
+
def fizzbuzz?() @n % 3 == 0 && @n % 5 == 0; end
|
191
|
+
def fizz?() @n % 3 == 0; end
|
192
|
+
def buzz?() @n % 5 == 0; end
|
194
193
|
|
195
|
-
def
|
194
|
+
def val
|
196
195
|
if fizzbuzz? then "FizzBuzz"
|
197
196
|
elsif fizz? then "Fizz"
|
198
197
|
elsif buzz? then "Buzz"
|
199
|
-
else
|
198
|
+
else @n
|
200
199
|
end
|
201
200
|
end
|
202
201
|
|
203
202
|
end
|
204
203
|
|
205
204
|
def fizzbuzz
|
206
|
-
(1..100).map{ |n| Fizznum.new(n).
|
205
|
+
(1..100).map{ |n| Fizznum.new(n).val }
|
207
206
|
end
|
208
207
|
```
|
209
208
|
|
@@ -308,34 +307,34 @@ end
|
|
308
307
|
```
|
309
308
|
|
310
309
|
|
311
|
-
|
312
|
-
## Pattern Matching with Noaidi
|
310
|
+
## Poor Man's (Do-It-Yourself) Pattern Matching
|
313
311
|
|
314
312
|
``` ruby
|
315
|
-
require "noaidi"
|
316
|
-
|
317
313
|
def fizzbuzz
|
318
314
|
(1..100).map do |n|
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
315
|
+
case [n % 3 == 0, n % 5 == 0]
|
316
|
+
when [true, true] then "FizzBuzz"
|
317
|
+
when [true, false] then "Fizz"
|
318
|
+
when [false, true] then "Buzz"
|
319
|
+
else n
|
324
320
|
end
|
325
321
|
end
|
326
322
|
end
|
327
323
|
```
|
328
324
|
|
329
|
-
|
325
|
+
|
326
|
+
## Pattern Matching with Noaidi
|
330
327
|
|
331
328
|
``` ruby
|
329
|
+
require "noaidi"
|
330
|
+
|
332
331
|
def fizzbuzz
|
333
332
|
(1..100).map do |n|
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
333
|
+
Noaidi.match [n % 3, n % 5] do |m|
|
334
|
+
m.(0, 0) { "FizzBuzz" }
|
335
|
+
m.(0, Fixnum) { "Fizz" }
|
336
|
+
m.(Fixnum, 0) { "Buzz" }
|
337
|
+
m.(Fixnum, Fixnum) { n }
|
339
338
|
end
|
340
339
|
end
|
341
340
|
end
|
@@ -349,21 +348,21 @@ require "dry-matcher"
|
|
349
348
|
|
350
349
|
FizzBuzz = Dry::Matcher.new(
|
351
350
|
fizzbuzz: Dry::Matcher::Case.new(
|
352
|
-
match: -> value { value
|
351
|
+
match: -> value { value[0] == 0 && value[1] == 0 },
|
353
352
|
resolve: -> value { "FizzBuzz" } ),
|
354
353
|
fizz: Dry::Matcher::Case.new(
|
355
|
-
match: -> value { value
|
354
|
+
match: -> value { value[0] == 0 },
|
356
355
|
resolve: -> value { "Fizz" } ),
|
357
356
|
buzz: Dry::Matcher::Case.new(
|
358
|
-
match: -> value { value
|
357
|
+
match: -> value { value[1] == 0 },
|
359
358
|
resolve: -> value { "Buzz" } ),
|
360
359
|
other: Dry::Matcher::Case.new(
|
361
360
|
match: -> value { true },
|
362
|
-
resolve: -> value { value } ))
|
361
|
+
resolve: -> value { value[2] } ))
|
363
362
|
|
364
363
|
def fizzbuzz
|
365
364
|
(1..100).map do |n|
|
366
|
-
FizzBuzz.(n) do |m|
|
365
|
+
FizzBuzz.([n % 3, n % 5, n]) do |m|
|
367
366
|
m.fizzbuzz { |v| v }
|
368
367
|
m.fizz { |v| v }
|
369
368
|
m.buzz { |v| v }
|
@@ -374,26 +373,99 @@ end
|
|
374
373
|
```
|
375
374
|
|
376
375
|
|
377
|
-
##
|
376
|
+
## Test Driven Development (TDD)
|
378
377
|
|
379
378
|
``` ruby
|
380
|
-
|
381
|
-
|
382
|
-
|
379
|
+
describe FizzBuzz do
|
380
|
+
before do
|
381
|
+
@result = fizzbuzz
|
382
|
+
end
|
383
383
|
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
384
|
+
it "returns 'Fizz' for multiples of 3" do
|
385
|
+
@result[3-1].must_equal "Fizz"
|
386
|
+
end
|
387
|
+
|
388
|
+
it "returns 'Buzz' for multiples of 5" do
|
389
|
+
@result[5-1].must_equal "Buzz"
|
390
|
+
end
|
391
|
+
|
392
|
+
it "returns 'FizzBuzz' for multiples of 3 and 5" do
|
393
|
+
@result[15-1].must_equal "FizzBuzz"
|
394
|
+
end
|
395
|
+
|
396
|
+
it "returns the passed number if not a multiple of 3 or 5" do
|
397
|
+
@result[1-1].must_equal 1
|
398
|
+
end
|
399
|
+
end
|
400
|
+
```
|
401
|
+
|
402
|
+
Or use asserts for testing:
|
403
|
+
|
404
|
+
``` ruby
|
405
|
+
class TestFizzBuzz < Minitest::Test
|
406
|
+
|
407
|
+
def setup
|
408
|
+
@result = fizzbuzz
|
409
|
+
end
|
410
|
+
|
411
|
+
def test_fizz_multiples_of_3
|
412
|
+
assert_equal "Fizz", @result[3-1]
|
413
|
+
end
|
414
|
+
|
415
|
+
def test_buzz_for_multiples_of_5
|
416
|
+
assert_equal "Buzz", @result[5-1]
|
417
|
+
end
|
418
|
+
|
419
|
+
def test_fizzbuzz_for_multiples_of_3_and_5
|
420
|
+
assert_equal "FizzBuzz", @result[15-1]
|
421
|
+
end
|
422
|
+
|
423
|
+
def test_number_if_not_multiple_of_3_or_5
|
424
|
+
assert_equal 1, @result[1-1]
|
425
|
+
end
|
426
|
+
|
427
|
+
end
|
428
|
+
```
|
429
|
+
|
430
|
+
And here's another fizzbuzz algorithm using a classic `for` loop:
|
431
|
+
|
432
|
+
``` ruby
|
433
|
+
def fizzbuzz
|
434
|
+
result = []
|
435
|
+
for n in 1..100 do
|
436
|
+
result << if n % 3 == 0 && n % 5 == 0 then "FizzBuzz"
|
437
|
+
elsif n % 3 == 0 then "Fizz"
|
438
|
+
elsif n % 5 == 0 then "Buzz"
|
439
|
+
else n
|
440
|
+
end
|
391
441
|
end
|
442
|
+
result
|
392
443
|
end
|
393
444
|
```
|
394
445
|
|
395
|
-
|
446
|
+
Or use an all-in-one assert as used
|
447
|
+
for testing all the fizzbuzz algorithms :-) in this repo:
|
396
448
|
|
449
|
+
``` ruby
|
450
|
+
FIZZBUZZES_1_TO_100 =
|
451
|
+
[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14,
|
452
|
+
"FizzBuzz", 16, 17, "Fizz", 19, "Buzz", "Fizz", 22, 23, "Fizz", "Buzz", 26,
|
453
|
+
"Fizz", 28, 29, "FizzBuzz", 31, 32, "Fizz", 34, "Buzz", "Fizz", 37, 38,
|
454
|
+
"Fizz", "Buzz", 41, "Fizz", 43, 44, "FizzBuzz", 46, 47, "Fizz", 49, "Buzz",
|
455
|
+
"Fizz", 52, 53, "Fizz", "Buzz", 56, "Fizz", 58, 59, "FizzBuzz", 61, 62,
|
456
|
+
"Fizz", 64, "Buzz", "Fizz", 67, 68, "Fizz", "Buzz", 71, "Fizz", 73, 74,
|
457
|
+
"FizzBuzz", 76, 77, "Fizz", 79, "Buzz", "Fizz", 82, 83, "Fizz", "Buzz", 86,
|
458
|
+
"Fizz", 88, 89, "FizzBuzz", 91, 92, "Fizz", 94, "Buzz", "Fizz", 97, 98,
|
459
|
+
"Fizz", "Buzz"]
|
460
|
+
|
461
|
+
class TestFizzBuzz < Minitest::Test
|
462
|
+
|
463
|
+
def test_fizzbuzz
|
464
|
+
assert_equal FIZZBUZZES_1_TO_100, fizzbuzz
|
465
|
+
end
|
466
|
+
|
467
|
+
end
|
468
|
+
```
|
397
469
|
|
398
470
|
|
399
471
|
## With Parameterization
|
data/lib/fizzbuzzer.rb
CHANGED
@@ -107,27 +107,25 @@ end
|
|
107
107
|
|
108
108
|
module V4
|
109
109
|
class Fizznum
|
110
|
-
|
111
|
-
|
112
|
-
def initialize(num)
|
113
|
-
self.num = num
|
110
|
+
def initialize(n)
|
111
|
+
@n = n
|
114
112
|
end
|
115
113
|
|
116
|
-
def fizzbuzz?()
|
117
|
-
def fizz?()
|
118
|
-
def buzz?()
|
114
|
+
def fizzbuzz?() @n % 3 == 0 && @n % 5 == 0; end
|
115
|
+
def fizz?() @n % 3 == 0; end
|
116
|
+
def buzz?() @n % 5 == 0; end
|
119
117
|
|
120
|
-
def
|
118
|
+
def val
|
121
119
|
if fizzbuzz? then "FizzBuzz"
|
122
120
|
elsif fizz? then "Fizz"
|
123
121
|
elsif buzz? then "Buzz"
|
124
|
-
else
|
122
|
+
else @n
|
125
123
|
end
|
126
124
|
end
|
127
125
|
end
|
128
126
|
|
129
127
|
def fizzbuzz
|
130
|
-
(1..100).map{ |n| Fizznum.new(n).
|
128
|
+
(1..100).map{ |n| Fizznum.new(n).val }
|
131
129
|
end
|
132
130
|
end
|
133
131
|
|
@@ -239,6 +237,20 @@ end
|
|
239
237
|
|
240
238
|
|
241
239
|
module V8
|
240
|
+
def fizzbuzz
|
241
|
+
(1..100).map do |n|
|
242
|
+
case [n % 3 == 0, n % 5 == 0]
|
243
|
+
when [true, true] then "FizzBuzz"
|
244
|
+
when [true, false] then "Fizz"
|
245
|
+
when [false, true] then "Buzz"
|
246
|
+
else n
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
|
253
|
+
module V9
|
242
254
|
require "noaidi"
|
243
255
|
|
244
256
|
def fizzbuzz
|
@@ -254,40 +266,26 @@ end
|
|
254
266
|
end
|
255
267
|
|
256
268
|
|
257
|
-
module V9
|
258
|
-
def fizzbuzz
|
259
|
-
(1..100).map do |n|
|
260
|
-
case [n % 3, n % 5].map {|remainder| remainder.zero? }
|
261
|
-
when [true, true] then "FizzBuzz"
|
262
|
-
when [true, false] then "Fizz"
|
263
|
-
when [false, true] then "Buzz"
|
264
|
-
else n
|
265
|
-
end
|
266
|
-
end
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
|
271
269
|
module V10
|
272
270
|
require "dry-matcher"
|
273
271
|
|
274
272
|
FizzBuzz = Dry::Matcher.new(
|
275
273
|
fizzbuzz: Dry::Matcher::Case.new(
|
276
|
-
match: -> value { value
|
274
|
+
match: -> value { value[0] == 0 && value[1] == 0 },
|
277
275
|
resolve: -> value { "FizzBuzz" } ),
|
278
276
|
fizz: Dry::Matcher::Case.new(
|
279
|
-
match: -> value { value
|
277
|
+
match: -> value { value[0] == 0 },
|
280
278
|
resolve: -> value { "Fizz" } ),
|
281
279
|
buzz: Dry::Matcher::Case.new(
|
282
|
-
match: -> value { value
|
280
|
+
match: -> value { value[1] == 0 },
|
283
281
|
resolve: -> value { "Buzz" } ),
|
284
282
|
other: Dry::Matcher::Case.new(
|
285
283
|
match: -> value { true },
|
286
|
-
resolve: -> value { value } ))
|
284
|
+
resolve: -> value { value[2] } ))
|
287
285
|
|
288
286
|
def fizzbuzz
|
289
287
|
(1..100).map do |n|
|
290
|
-
FizzBuzz.(n) do |m|
|
288
|
+
FizzBuzz.([n % 3, n % 5, n]) do |m|
|
291
289
|
m.fizzbuzz { |v| v }
|
292
290
|
m.fizz { |v| v }
|
293
291
|
m.buzz { |v| v }
|
@@ -298,21 +296,20 @@ end
|
|
298
296
|
end
|
299
297
|
|
300
298
|
|
301
|
-
module V11
|
302
|
-
def fizzbuzz
|
303
|
-
fizzy = [1,0,0]
|
304
|
-
buzzy = [1,0,0,0,0]
|
305
299
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
300
|
+
module V11
|
301
|
+
def fizzbuzz
|
302
|
+
result = []
|
303
|
+
for n in 1..100 do
|
304
|
+
result << if n % 3 == 0 && n % 5 == 0 then "FizzBuzz"
|
305
|
+
elsif n % 3 == 0 then "Fizz"
|
306
|
+
elsif n % 5 == 0 then "Buzz"
|
307
|
+
else n
|
308
|
+
end
|
309
|
+
end
|
310
|
+
result
|
313
311
|
end
|
314
312
|
end
|
315
|
-
end
|
316
313
|
|
317
314
|
|
318
315
|
module V12a
|
data/lib/fizzbuzzer/version.rb
CHANGED
data/test/test_driven.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_driven.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
describe FizzBuzz do
|
12
|
+
|
13
|
+
include FizzBuzzer::V11 ## add (include) fizzbuzz method using algorithm V11
|
14
|
+
|
15
|
+
before do
|
16
|
+
@result = fizzbuzz
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns 'Fizz' for multiples of 3" do
|
20
|
+
@result[3-1].must_equal "Fizz"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns 'Buzz' for multiples of 5" do
|
24
|
+
@result[5-1].must_equal "Buzz"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns 'FizzBuzz' for multiples of 3 and 5" do
|
28
|
+
@result[15-1].must_equal "FizzBuzz"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns the passed number if not a multiple of 3 or 5" do
|
32
|
+
@result[1-1].must_equal 1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
class TestFizzBuzz < Minitest::Test
|
39
|
+
|
40
|
+
include FizzBuzzer::V11 ## add (include) fizzbuzz method using algorithm V11
|
41
|
+
|
42
|
+
def setup
|
43
|
+
@result = fizzbuzz
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_fizz_multiples_of_3
|
47
|
+
assert_equal "Fizz", @result[3-1]
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_buzz_for_multiples_of_5
|
51
|
+
assert_equal "Buzz", @result[5-1]
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_fizzbuzz_for_multiples_of_3_and_5
|
55
|
+
assert_equal "FizzBuzz", @result[15-1]
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_number_if_not_multiple_of_3_or_5
|
59
|
+
assert_equal 1, @result[1-1]
|
60
|
+
end
|
61
|
+
end
|
data/test/test_fizzbuzz.rb
CHANGED
@@ -19,13 +19,11 @@ FIZZBUZZES_1_TO_100 =
|
|
19
19
|
"Fizz", 88, 89, "FizzBuzz", 91, 92, "Fizz", 94, "Buzz", "Fizz", 97, 98,
|
20
20
|
"Fizz", "Buzz"]
|
21
21
|
|
22
|
-
## all strings version
|
23
|
-
## e.g. ["1", "2", "Fizz", ...]
|
24
|
-
FIZZBUZZES_1_TO_100_V2 = FIZZBUZZES_1_TO_100.map {|value| value.to_s }
|
25
22
|
|
26
23
|
|
27
24
|
class TestV1 < MiniTest::Test
|
28
|
-
|
25
|
+
|
26
|
+
include FizzBuzzer::V1 ## add (include) fizzbuzz method using algorithm V1
|
29
27
|
|
30
28
|
def test_fizzbuzz
|
31
29
|
assert_equal FIZZBUZZES_1_TO_100, fizzbuzz
|
@@ -43,13 +41,7 @@ end # class TestV1
|
|
43
41
|
|
44
42
|
def test_fizzbuzz
|
45
43
|
puts "running fizzbuzz #{name}..."
|
46
|
-
|
47
|
-
# use all string version e.g. ["1", "2", "Fizz", ...]
|
48
|
-
assert_equal FIZZBUZZES_1_TO_100_V2, fizzbuzz
|
49
|
-
else
|
50
|
-
# use "mixed" tuple version e.g. [1, 2, "Fizz", ...]
|
51
|
-
assert_equal FIZZBUZZES_1_TO_100, fizzbuzz
|
52
|
-
end
|
44
|
+
assert_equal FIZZBUZZES_1_TO_100, fizzbuzz
|
53
45
|
end
|
54
46
|
end)
|
55
47
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fizzbuzzer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: noaidi
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- lib/fizzbuzzer.rb
|
89
89
|
- lib/fizzbuzzer/version.rb
|
90
90
|
- test/helper.rb
|
91
|
+
- test/test_driven.rb
|
91
92
|
- test/test_fizzbuzz.rb
|
92
93
|
- test/test_version.rb
|
93
94
|
homepage: https://github.com/rubylibs/fizzbuzzer
|