trackler 2.0.0.1 → 2.0.0.2
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/bin/bump-content +3 -1
- data/bin/verify-metadata +2 -2
- data/common/exercises/alphametics/canonical-data.json +19 -9
- data/common/exercises/food-chain/canonical-data.json +7 -1
- data/common/exercises/grains/canonical-data.json +66 -0
- data/common/exercises/raindrops/description.md +4 -5
- data/common/exercises/triangle/canonical-data.json +81 -54
- data/lib/trackler/version.rb +1 -1
- data/tracks/c/config.json +26 -19
- data/tracks/c/exercises/allergies/makefile +15 -0
- data/tracks/c/exercises/allergies/src/allergies.h +21 -0
- data/tracks/c/exercises/allergies/src/example.c +32 -0
- data/tracks/c/exercises/allergies/src/example.h +26 -0
- data/tracks/c/exercises/allergies/test/test_allergies.c +203 -0
- data/tracks/c/exercises/allergies/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/allergies/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/allergies/test/vendor/unity_internals.h +701 -0
- data/tracks/c/exercises/atbash-cipher/makefile +16 -0
- data/tracks/c/exercises/atbash-cipher/src/example.c +71 -0
- data/tracks/c/exercises/atbash-cipher/src/example.h +7 -0
- data/tracks/c/exercises/atbash-cipher/test/test_atbash_cipher.c +113 -0
- data/tracks/c/exercises/atbash-cipher/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/atbash-cipher/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/atbash-cipher/test/vendor/unity_internals.h +701 -0
- data/tracks/c/exercises/phone-number/makefile +16 -0
- data/tracks/c/exercises/phone-number/src/example.c +66 -0
- data/tracks/c/exercises/phone-number/src/example.h +8 -0
- data/tracks/c/exercises/phone-number/test/test_phone_number.c +108 -0
- data/tracks/c/exercises/phone-number/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/phone-number/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/phone-number/test/vendor/unity_internals.h +701 -0
- data/tracks/csharp/config.json +8 -0
- data/tracks/csharp/exercises/bowling/BowlingTest.cs +188 -33
- data/tracks/csharp/exercises/bowling/Example.cs +38 -9
- data/tracks/csharp/exercises/rectangles/Example.cs +91 -0
- data/tracks/csharp/exercises/rectangles/RectanglesTest.cs +133 -0
- data/tracks/elisp/docs/INSTALLATION.org +1 -1
- data/tracks/elixir/config.json +8 -66
- data/tracks/elixir/docs/LEARNING.md +1 -1
- data/tracks/elixir/exercises/diamond/diamond_test.exs +12 -12
- data/tracks/elixir/exercises/grep/example.exs +92 -0
- data/tracks/elixir/exercises/grep/grep.exs +6 -0
- data/tracks/elixir/exercises/grep/grep_test.exs +259 -0
- data/tracks/elixir/exercises/markdown/markdown.exs +59 -2
- data/tracks/elixir/exercises/nucleotide-count/nucleotide_count_test.exs +4 -4
- data/tracks/elixir/exercises/phone-number/phone_number_test.exs +5 -0
- data/tracks/fsharp/exercises/bowling/BowlingTest.fs +158 -43
- data/tracks/fsharp/exercises/bowling/Example.fs +53 -24
- data/tracks/go/config.json +5 -0
- data/tracks/go/exercises/diamond/diamond_test.go +227 -0
- data/tracks/go/exercises/diamond/example.go +47 -0
- data/tracks/go/exercises/food-chain/example.go +1 -1
- data/tracks/go/exercises/food-chain/food_chain_test.go +30 -6
- data/tracks/go/exercises/nucleotide-count/example.go +21 -8
- data/tracks/go/exercises/nucleotide-count/nucleotide_count_test.go +45 -37
- data/tracks/haskell/exercises/anagram/test/Tests.hs +1 -11
- data/tracks/java/bin/journey-test.sh +165 -128
- data/tracks/java/docs/ABOUT.md +5 -8
- data/tracks/java/exercises/hello-world/build.gradle +0 -6
- data/tracks/java/exercises/hello-world/src/test/java/HelloWorldTest.java +0 -1
- data/tracks/java/exercises/meetup/build.gradle +0 -1
- data/tracks/java/exercises/meetup/src/example/java/Meetup.java +9 -7
- data/tracks/java/exercises/meetup/src/test/java/MeetupTest.java +185 -188
- data/tracks/lua/config.json +0 -73
- data/tracks/lua/exercises/bowling/bowling_spec.lua +92 -48
- data/tracks/lua/exercises/bowling/example.lua +4 -1
- data/tracks/objective-c/config.json +9 -30
- data/tracks/objective-c/exercises/pangram/PangramExample.h +7 -0
- data/tracks/objective-c/exercises/pangram/PangramExample.m +21 -0
- data/tracks/objective-c/exercises/pangram/PangramTest.m +51 -0
- data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
- data/tracks/ocaml/README.md +46 -1
- data/tracks/ocaml/SETUP.md +21 -2
- data/tracks/ocaml/config.json +48 -78
- data/tracks/perl5/README.md +15 -8
- data/tracks/perl5/testall.pl +5 -5
- data/tracks/php/config.json +26 -34
- data/tracks/php/docs/ABOUT.md +15 -0
- data/tracks/php/exercises/allergies/allergies_test.php +121 -0
- data/tracks/php/exercises/allergies/example.php +64 -0
- data/tracks/php/exercises/etl/etl_test.php +52 -0
- data/tracks/php/exercises/etl/example.php +12 -0
- data/tracks/php/exercises/nucleotide-count/example.php +25 -0
- data/tracks/php/exercises/nucleotide-count/nucleotide-count_test.php +36 -0
- data/tracks/php/exercises/pig-latin/example.php +25 -29
- data/tracks/php/exercises/pig-latin/pig-latin_test.php +26 -19
- data/tracks/php/exercises/space-age/example.php +65 -0
- data/tracks/php/exercises/space-age/space-age_test.php +70 -0
- data/tracks/php/exercises/triangle/example.php +43 -0
- data/tracks/php/exercises/triangle/triangle_test.php +140 -0
- data/tracks/pony/exercises/anagram/example.pony +6 -6
- data/tracks/pony/exercises/anagram/test.pony +3 -4
- data/tracks/pony/exercises/bob/test.pony +23 -23
- data/tracks/pony/exercises/difference-of-squares/test.pony +11 -11
- data/tracks/pony/exercises/hamming/example.pony +3 -3
- data/tracks/pony/exercises/hamming/test.pony +16 -16
- data/tracks/pony/exercises/hello-world/test.pony +5 -4
- data/tracks/pony/exercises/leap/test.pony +8 -8
- data/tracks/python/config.json +18 -0
- data/tracks/python/exercises/diamond/diamond_test.py +33 -0
- data/tracks/python/exercises/diamond/example.py +15 -0
- data/tracks/python/exercises/linked-list/example.py +47 -0
- data/tracks/python/exercises/linked-list/linked_list.py +13 -0
- data/tracks/python/exercises/linked-list/linked_list_test.py +49 -0
- data/tracks/python/exercises/list-ops/example.py +55 -0
- data/tracks/python/exercises/list-ops/list_ops.py +38 -0
- data/tracks/python/exercises/list-ops/list_ops_test.py +136 -0
- data/tracks/ruby/bin/generate +22 -2
- data/tracks/ruby/config.json +12 -83
- data/tracks/ruby/exercises/allergies/allergies_test.rb +0 -1
- data/tracks/ruby/exercises/atbash-cipher/atbash_cipher_test.rb +0 -1
- data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -2
- data/tracks/ruby/exercises/binary/example.rb +0 -1
- data/tracks/ruby/exercises/binary-search-tree/binary_search_tree_test.rb +1 -1
- data/tracks/ruby/exercises/bowling/.version +1 -0
- data/tracks/ruby/exercises/bowling/bowling_test.rb +109 -133
- data/tracks/ruby/exercises/bowling/example.rb +7 -7
- data/tracks/ruby/exercises/bowling/example.tt +27 -0
- data/tracks/ruby/exercises/circular-buffer/circular_buffer_test.rb +0 -2
- data/tracks/ruby/exercises/clock/example.rb +0 -2
- data/tracks/ruby/exercises/connect/connect_test.rb +0 -1
- data/tracks/ruby/exercises/custom-set/custom_set_test.rb +0 -1
- data/tracks/ruby/exercises/diamond/diamond_test.rb +0 -1
- data/tracks/ruby/exercises/etl/etl_test.rb +1 -1
- data/tracks/ruby/exercises/house/house_test.rb +0 -1
- data/tracks/ruby/exercises/isogram/isogram_test.rb +2 -2
- data/tracks/ruby/exercises/largest-series-product/example.tt +0 -3
- data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +0 -4
- data/tracks/ruby/exercises/linked-list/linked_list_test.rb +1 -1
- data/tracks/ruby/exercises/meetup/meetup_test.rb +0 -1
- data/tracks/ruby/exercises/nth-prime/example.tt +0 -2
- data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +0 -2
- data/tracks/ruby/exercises/ocr-numbers/ocr_numbers_test.rb +1 -2
- data/tracks/ruby/exercises/protein-translation/protein_translation_test.rb +0 -1
- data/tracks/ruby/exercises/proverb/proverb_test.rb +1 -3
- data/tracks/ruby/exercises/queen-attack/example.rb +3 -1
- data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +34 -8
- data/tracks/ruby/exercises/robot-simulator/robot_simulator_test.rb +1 -1
- data/tracks/ruby/exercises/strain/strain_test.rb +2 -2
- data/tracks/ruby/exercises/tournament/.version +1 -0
- data/tracks/ruby/exercises/tournament/example.rb +54 -0
- data/tracks/ruby/exercises/tournament/example.tt +23 -0
- data/tracks/ruby/exercises/tournament/tournament_test.rb +92 -0
- data/tracks/ruby/exercises/transpose/.version +1 -0
- data/tracks/ruby/exercises/transpose/example.rb +14 -0
- data/tracks/ruby/exercises/transpose/example.tt +22 -0
- data/tracks/ruby/exercises/transpose/transpose_test.rb +303 -0
- data/tracks/ruby/lib/bowling_cases.rb +46 -0
- data/tracks/ruby/lib/isogram_cases.rb +1 -1
- data/tracks/ruby/lib/tournament_cases.rb +45 -0
- data/tracks/ruby/lib/transpose_cases.rb +45 -0
- data/tracks/rust/config.json +2 -0
- data/tracks/rust/exercises/bowling/.gitignore +7 -0
- data/tracks/rust/exercises/bowling/Cargo.toml +3 -0
- data/tracks/rust/exercises/bowling/example.rs +134 -0
- data/tracks/rust/exercises/bowling/tests/bowling.rs +373 -0
- data/tracks/rust/exercises/grains/.gitignore +7 -0
- data/tracks/rust/exercises/grains/Cargo.toml +3 -0
- data/tracks/rust/exercises/grains/example.rs +11 -0
- data/tracks/rust/exercises/grains/src/lib.rs +7 -0
- data/tracks/rust/exercises/grains/tests/grains.rs +63 -0
- data/tracks/rust/problems.md +2 -0
- data/tracks/scala/README.md +38 -0
- data/tracks/scala/config.json +20 -74
- data/tracks/scala/exercises/accumulate/src/test/scala/accumulate_test.scala +4 -0
- data/tracks/scala/exercises/allergies/src/test/scala/allergies_test.scala +11 -0
- data/tracks/scala/exercises/alphametics/build.sbt +6 -0
- data/tracks/scala/exercises/alphametics/example.scala +125 -0
- data/tracks/scala/exercises/alphametics/src/main/scala/.keep +0 -0
- data/tracks/scala/exercises/alphametics/src/test/scala/AlphameticsTest.scala +62 -0
- data/tracks/scala/exercises/atbash-cipher/src/test/scala/atbash_test.scala +8 -0
- data/tracks/scala/exercises/bank-account/src/test/scala/BankAccountTest.scala +4 -0
- data/tracks/scala/exercises/binary/src/test/scala/binary_test.scala +13 -0
- data/tracks/scala/exercises/binary-search-tree/src/test/scala/BstTest.scala +11 -0
- data/tracks/scala/exercises/bowling/Example.scala +116 -0
- data/tracks/scala/exercises/bowling/build.sbt +3 -0
- data/tracks/scala/exercises/bowling/src/main/scala/Bowling.scala +11 -0
- data/tracks/scala/exercises/bowling/src/test/scala/BowlingSuite.scala +237 -0
- data/tracks/scala/exercises/clock/src/test/scala/ClockTest.scala +50 -0
- data/tracks/scala/exercises/connect/README.md +17 -0
- data/tracks/scala/exercises/connect/src/test/scala/ConnectTest.scala +7 -0
- data/tracks/scala/exercises/crypto-square/src/test/scala/{CrytpoSquareTest.scala → CryptoSquareTest.scala} +9 -0
- data/tracks/scala/exercises/custom-set/src/test/scala/CustomSetTest.scala +36 -0
- data/tracks/scala/exercises/difference-of-squares/src/test/scala/squares_test.scala +8 -0
- data/tracks/scala/exercises/forth/src/test/scala/ForthTest.scala +22 -0
- data/tracks/scala/exercises/hexadecimal/src/test/scala/HexadecimalTest.scala +8 -0
- data/tracks/scala/exercises/kindergarten-garden/src/test/scala/GardenTest.scala +5 -0
- data/tracks/scala/exercises/largest-series-product/src/test/scala/SeriesTest.scala +2 -0
- data/tracks/scala/exercises/linked-list/src/test/scala/DequeTest.scala +4 -0
- data/tracks/scala/exercises/luhn/src/test/scala/LuhnTest.scala +4 -0
- data/tracks/scala/exercises/matrix/src/test/scala/MatrixTest.scala +2 -0
- data/tracks/scala/exercises/minesweeper/src/test/scala/MinesweeperTest.scala +6 -0
- data/tracks/scala/exercises/nth-prime/src/test/scala/PrimeTest.scala +5 -0
- data/tracks/scala/exercises/ocr-numbers/src/test/scala/OcrTest.scala +15 -0
- data/tracks/scala/exercises/octal/src/test/scala/OctalTest.scala +7 -0
- data/tracks/scala/exercises/parallel-letter-frequency/src/test/scala/FrequencyTest.scala +8 -0
- data/tracks/scala/exercises/pascals-triangle/src/test/scala/PascalsTriangleTest.scala +5 -0
- data/tracks/scala/exercises/pig-latin/src/test/scala/PigLatinTest.scala +4 -0
- data/tracks/scala/exercises/pythagorean-triplet/src/test/scala/PythagoreanTripletTest.scala +3 -0
- data/tracks/scala/exercises/queen-attack/src/test/scala/QueensTest.scala +5 -0
- data/tracks/scala/exercises/robot-simulator/src/test/scala/RobotTest.scala +16 -8
- data/tracks/scala/exercises/say/src/test/scala/SayTest.scala +34 -17
- data/tracks/scala/exercises/scrabble-score/src/test/scala/scrabble_score_test.scala +6 -0
- data/tracks/scala/exercises/secret-handshake/src/test/scala/SecretHandshakeTest.scala +18 -9
- data/tracks/scala/exercises/series/src/test/scala/SeriesTest.scala +4 -2
- data/tracks/scala/exercises/sieve/src/test/scala/SieveTest.scala +8 -4
- data/tracks/scala/exercises/simple-cipher/src/test/scala/CipherTest.scala +17 -9
- data/tracks/scala/exercises/sublist/src/test/scala/sublist_test.scala +17 -0
- data/tracks/scala/exercises/trinary/src/test/scala/TrinaryTest.scala +14 -7
- data/tracks/scala/exercises/wordy/src/test/scala/WordProblemTest.scala +28 -14
- data/tracks/scala/project/Build.scala +3 -3
- data/tracks/scala/testgen/src/main/scala/BowlingTestGenerator.scala +57 -0
- data/tracks/sml/config.json +41 -6
- data/tracks/sml/exercises/flatten-array/example.sml +6 -0
- data/tracks/sml/exercises/flatten-array/test_flatten_array.sml +10 -0
- data/tracks/sml/exercises/nth-prime/example.sml +46 -0
- data/tracks/sml/exercises/nth-prime/test_nth_prime.sml +14 -0
- data/tracks/sml/exercises/raindrops/example.sml +9 -0
- data/tracks/sml/exercises/raindrops/raindrops.sml +2 -0
- data/tracks/sml/exercises/raindrops/test_raindrops.sml +95 -0
- data/tracks/swift/config.json +269 -328
- data/tracks/swift/exercises/pangram/PangramExample.swift +17 -0
- data/tracks/swift/exercises/pangram/PangramTest.swift +43 -0
- data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.pbxproj +16 -0
- metadata +95 -3
data/tracks/ruby/config.json
CHANGED
|
@@ -4,89 +4,6 @@
|
|
|
4
4
|
"repository": "https://github.com/exercism/xruby",
|
|
5
5
|
"active": true,
|
|
6
6
|
"gitter": "xruby",
|
|
7
|
-
"problems": [
|
|
8
|
-
"hello-world",
|
|
9
|
-
"hamming",
|
|
10
|
-
"gigasecond",
|
|
11
|
-
"rna-transcription",
|
|
12
|
-
"raindrops",
|
|
13
|
-
"difference-of-squares",
|
|
14
|
-
"pangram",
|
|
15
|
-
"sieve",
|
|
16
|
-
"roman-numerals",
|
|
17
|
-
"robot-name",
|
|
18
|
-
"nth-prime",
|
|
19
|
-
"leap",
|
|
20
|
-
"grains",
|
|
21
|
-
"word-count",
|
|
22
|
-
"bob",
|
|
23
|
-
"run-length-encoding",
|
|
24
|
-
"binary",
|
|
25
|
-
"accumulate",
|
|
26
|
-
"sum-of-multiples",
|
|
27
|
-
"grade-school",
|
|
28
|
-
"series",
|
|
29
|
-
"phone-number",
|
|
30
|
-
"prime-factors",
|
|
31
|
-
"strain",
|
|
32
|
-
"etl",
|
|
33
|
-
"trinary",
|
|
34
|
-
"beer-song",
|
|
35
|
-
"bowling",
|
|
36
|
-
"space-age",
|
|
37
|
-
"anagram",
|
|
38
|
-
"binary-search-tree",
|
|
39
|
-
"crypto-square",
|
|
40
|
-
"clock",
|
|
41
|
-
"alphametics",
|
|
42
|
-
"rail-fence-cipher",
|
|
43
|
-
"acronym",
|
|
44
|
-
"scrabble-score",
|
|
45
|
-
"nucleotide-count",
|
|
46
|
-
"flatten-array",
|
|
47
|
-
"hexadecimal",
|
|
48
|
-
"say",
|
|
49
|
-
"meetup",
|
|
50
|
-
"queen-attack",
|
|
51
|
-
"palindrome-products",
|
|
52
|
-
"bracket-push",
|
|
53
|
-
"food-chain",
|
|
54
|
-
"matrix",
|
|
55
|
-
"saddle-points",
|
|
56
|
-
"triangle",
|
|
57
|
-
"atbash-cipher",
|
|
58
|
-
"house",
|
|
59
|
-
"secret-handshake",
|
|
60
|
-
"proverb",
|
|
61
|
-
"ocr-numbers",
|
|
62
|
-
"pig-latin",
|
|
63
|
-
"simple-linked-list",
|
|
64
|
-
"luhn",
|
|
65
|
-
"simple-cipher",
|
|
66
|
-
"wordy",
|
|
67
|
-
"allergies",
|
|
68
|
-
"poker",
|
|
69
|
-
"kindergarten-garden",
|
|
70
|
-
"linked-list",
|
|
71
|
-
"pythagorean-triplet",
|
|
72
|
-
"robot-simulator",
|
|
73
|
-
"twelve-days",
|
|
74
|
-
"circular-buffer",
|
|
75
|
-
"largest-series-product",
|
|
76
|
-
"binary-search",
|
|
77
|
-
"two-bucket",
|
|
78
|
-
"pascals-triangle",
|
|
79
|
-
"custom-set",
|
|
80
|
-
"minesweeper",
|
|
81
|
-
"scale-generator",
|
|
82
|
-
"protein-translation",
|
|
83
|
-
"perfect-numbers",
|
|
84
|
-
"connect",
|
|
85
|
-
"list-ops",
|
|
86
|
-
"diamond",
|
|
87
|
-
"all-your-base",
|
|
88
|
-
"isogram"
|
|
89
|
-
],
|
|
90
7
|
"exercises": [
|
|
91
8
|
{
|
|
92
9
|
"slug": "hello-world",
|
|
@@ -573,6 +490,18 @@
|
|
|
573
490
|
"difficulty": 1,
|
|
574
491
|
"topics": [
|
|
575
492
|
]
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
"slug": "transpose",
|
|
496
|
+
"difficulty": 1,
|
|
497
|
+
"topics": [
|
|
498
|
+
]
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
"slug": "tournament",
|
|
502
|
+
"difficulty": 1,
|
|
503
|
+
"topics": [
|
|
504
|
+
]
|
|
576
505
|
}
|
|
577
506
|
],
|
|
578
507
|
"deprecated": [
|
|
@@ -59,7 +59,6 @@ class AllergiesTest < Minitest::Test
|
|
|
59
59
|
def test_allergic_to_everything
|
|
60
60
|
skip
|
|
61
61
|
allergies = Allergies.new(255)
|
|
62
|
-
# rubocop:disable Metrics/LineLength
|
|
63
62
|
expected = %w(eggs peanuts shellfish strawberries tomatoes chocolate pollen cats)
|
|
64
63
|
assert_equal expected, allergies.list
|
|
65
64
|
end
|
|
@@ -3,7 +3,6 @@ gem 'minitest', '>= 5.0.0'
|
|
|
3
3
|
require 'minitest/autorun'
|
|
4
4
|
require_relative 'beer_song'
|
|
5
5
|
|
|
6
|
-
# rubocop:disable Metrics/LineLength
|
|
7
6
|
class BeerSongTest < Minitest::Test
|
|
8
7
|
def test_the_first_verse
|
|
9
8
|
expected = "99 bottles of beer on the wall, 99 bottles of beer.\n" \
|
|
@@ -62,7 +61,7 @@ class BeerSongTest < Minitest::Test
|
|
|
62
61
|
assert_equal expected, BeerSong.new.verses(2, 0)
|
|
63
62
|
end
|
|
64
63
|
|
|
65
|
-
def test_the_whole_song
|
|
64
|
+
def test_the_whole_song
|
|
66
65
|
skip
|
|
67
66
|
expected = <<-SONG
|
|
68
67
|
99 bottles of beer on the wall, 99 bottles of beer.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2
|
|
@@ -3,224 +3,200 @@ gem 'minitest', '>= 5.0.0'
|
|
|
3
3
|
require 'minitest/autorun'
|
|
4
4
|
require_relative 'bowling'
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
# Test data version:
|
|
7
|
+
# 0a51cfc
|
|
8
|
+
class BowlingTest < Minitest::Test
|
|
7
9
|
def setup
|
|
8
10
|
@game = Game.new
|
|
9
11
|
end
|
|
10
12
|
|
|
11
|
-
def
|
|
12
|
-
|
|
13
|
-
assert_equal 1, @game.method(:roll).arity
|
|
13
|
+
def roll(rolls)
|
|
14
|
+
rolls.each { |pins| @game.roll(pins) }
|
|
14
15
|
end
|
|
15
16
|
|
|
16
|
-
def
|
|
17
|
-
skip
|
|
18
|
-
|
|
17
|
+
def test_should_be_able_to_score_a_game_with_all_zeros
|
|
18
|
+
# skip
|
|
19
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
20
|
+
assert_equal 0, @game.score
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
def
|
|
23
|
+
def test_should_be_able_to_score_a_game_with_no_strikes_or_spares
|
|
22
24
|
skip
|
|
23
|
-
|
|
24
|
-
@game.
|
|
25
|
-
roll_n_times(18, 0)
|
|
26
|
-
assert_equal 7, @game.score
|
|
25
|
+
roll([3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6])
|
|
26
|
+
assert_equal 90, @game.score
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
def
|
|
29
|
+
def test_a_spare_followed_by_zeros_is_worth_ten_points
|
|
30
30
|
skip
|
|
31
|
-
[
|
|
32
|
-
|
|
33
|
-
end
|
|
34
|
-
roll_n_times(14, 0)
|
|
35
|
-
assert_equal 19, @game.score
|
|
31
|
+
roll([6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
32
|
+
assert_equal 10, @game.score
|
|
36
33
|
end
|
|
37
34
|
|
|
38
|
-
def
|
|
35
|
+
def test_points_scored_in_the_roll_after_a_spare_are_counted_twice
|
|
39
36
|
skip
|
|
40
|
-
|
|
41
|
-
assert_equal
|
|
37
|
+
roll([6, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
38
|
+
assert_equal 16, @game.score
|
|
42
39
|
end
|
|
43
40
|
|
|
44
|
-
def
|
|
41
|
+
def test_consecutive_spares_each_get_a_one_roll_bonus
|
|
45
42
|
skip
|
|
46
|
-
|
|
47
|
-
assert_equal
|
|
43
|
+
roll([5, 5, 3, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
44
|
+
assert_equal 31, @game.score
|
|
48
45
|
end
|
|
49
46
|
|
|
50
|
-
def
|
|
47
|
+
def test_a_spare_in_the_last_frame_gets_a_one_roll_bonus_that_is_counted_once
|
|
51
48
|
skip
|
|
52
|
-
|
|
53
|
-
assert_equal
|
|
49
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 7])
|
|
50
|
+
assert_equal 17, @game.score
|
|
54
51
|
end
|
|
55
52
|
|
|
56
|
-
def
|
|
53
|
+
def test_a_strike_earns_ten_points_in_frame_with_a_single_roll
|
|
57
54
|
skip
|
|
58
|
-
|
|
59
|
-
@game.
|
|
60
|
-
@game.roll(3)
|
|
61
|
-
roll_n_times(16, 0)
|
|
62
|
-
|
|
63
|
-
assert_equal 26, @game.score
|
|
55
|
+
roll([10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
56
|
+
assert_equal 10, @game.score
|
|
64
57
|
end
|
|
65
58
|
|
|
66
|
-
def
|
|
59
|
+
def test_points_scored_in_the_two_rolls_after_a_strike_are_counted_twice_as_a_bonus
|
|
67
60
|
skip
|
|
68
|
-
|
|
69
|
-
@game.
|
|
70
|
-
@game.roll(3)
|
|
71
|
-
@game.roll(4)
|
|
72
|
-
roll_n_times(16, 0)
|
|
73
|
-
|
|
74
|
-
assert_equal 20, @game.score
|
|
61
|
+
roll([10, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
62
|
+
assert_equal 26, @game.score
|
|
75
63
|
end
|
|
76
64
|
|
|
77
|
-
def
|
|
65
|
+
def test_consecutive_strikes_each_get_the_two_roll_bonus
|
|
78
66
|
skip
|
|
79
|
-
|
|
80
|
-
@game.roll(10)
|
|
81
|
-
@game.roll(10)
|
|
82
|
-
@game.roll(5)
|
|
83
|
-
@game.roll(3)
|
|
84
|
-
roll_n_times(12, 0)
|
|
85
|
-
|
|
67
|
+
roll([10, 10, 10, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
86
68
|
assert_equal 81, @game.score
|
|
87
69
|
end
|
|
88
70
|
|
|
89
|
-
def
|
|
71
|
+
def test_a_strike_in_the_last_frame_gets_a_two_roll_bonus_that_is_counted_once
|
|
90
72
|
skip
|
|
91
|
-
|
|
92
|
-
@game.
|
|
93
|
-
@game.roll(3)
|
|
94
|
-
@game.roll(7)
|
|
95
|
-
@game.roll(4)
|
|
96
|
-
@game.roll(1)
|
|
97
|
-
roll_n_times(14, 0)
|
|
98
|
-
|
|
99
|
-
assert_equal 32, @game.score
|
|
73
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 7, 1])
|
|
74
|
+
assert_equal 18, @game.score
|
|
100
75
|
end
|
|
101
76
|
|
|
102
|
-
def
|
|
77
|
+
def test_rolling_a_spare_with_the_two_roll_bonus_does_not_get_a_bonus_roll
|
|
103
78
|
skip
|
|
104
|
-
|
|
105
|
-
@game.
|
|
106
|
-
@game.roll(7)
|
|
107
|
-
@game.roll(1)
|
|
108
|
-
|
|
109
|
-
assert_equal 18, @game.score
|
|
79
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 7, 3])
|
|
80
|
+
assert_equal 20, @game.score
|
|
110
81
|
end
|
|
111
82
|
|
|
112
|
-
def
|
|
83
|
+
def test_strikes_with_the_two_roll_bonus_do_not_get_bonus_rolls
|
|
113
84
|
skip
|
|
114
|
-
|
|
115
|
-
@game.
|
|
116
|
-
@game.roll(1)
|
|
117
|
-
@game.roll(7)
|
|
118
|
-
|
|
119
|
-
assert_equal 17, @game.score
|
|
85
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10])
|
|
86
|
+
assert_equal 30, @game.score
|
|
120
87
|
end
|
|
121
88
|
|
|
122
|
-
def
|
|
89
|
+
def test_a_strike_with_the_one_roll_bonus_after_a_spare_in_the_last_frame_does_not_get_a_bonus
|
|
123
90
|
skip
|
|
124
|
-
|
|
125
|
-
@game.
|
|
126
|
-
@game.roll(10)
|
|
127
|
-
@game.roll(10)
|
|
128
|
-
|
|
129
|
-
assert_equal 30, @game.score
|
|
91
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 10])
|
|
92
|
+
assert_equal 20, @game.score
|
|
130
93
|
end
|
|
131
94
|
|
|
132
|
-
def
|
|
95
|
+
def test_all_strikes_is_a_perfect_game
|
|
133
96
|
skip
|
|
134
|
-
|
|
97
|
+
roll([10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10])
|
|
135
98
|
assert_equal 300, @game.score
|
|
136
99
|
end
|
|
137
100
|
|
|
138
|
-
def
|
|
101
|
+
def test_rolls_can_not_score_negative_points
|
|
139
102
|
skip
|
|
140
|
-
assert_raises
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
end
|
|
103
|
+
assert_raises StandardError do
|
|
104
|
+
roll([-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
105
|
+
@game.score
|
|
106
|
+
end
|
|
145
107
|
end
|
|
146
108
|
|
|
147
|
-
def
|
|
109
|
+
def test_a_roll_can_not_score_more_than_10_points
|
|
148
110
|
skip
|
|
149
|
-
assert_raises
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
end
|
|
111
|
+
assert_raises StandardError do
|
|
112
|
+
roll([11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
113
|
+
@game.score
|
|
114
|
+
end
|
|
154
115
|
end
|
|
155
116
|
|
|
156
|
-
def
|
|
117
|
+
def test_two_rolls_in_a_frame_can_not_score_more_than_10_points
|
|
157
118
|
skip
|
|
158
|
-
assert_raises
|
|
159
|
-
|
|
160
|
-
@game.
|
|
119
|
+
assert_raises StandardError do
|
|
120
|
+
roll([5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
121
|
+
@game.score
|
|
161
122
|
end
|
|
162
123
|
end
|
|
163
124
|
|
|
164
|
-
def
|
|
125
|
+
def test_two_bonus_rolls_after_a_strike_in_the_last_frame_can_not_score_more_than_10_points
|
|
165
126
|
skip
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
@game.
|
|
169
|
-
@game.roll(5)
|
|
170
|
-
@game.roll(6)
|
|
127
|
+
assert_raises StandardError do
|
|
128
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5, 6])
|
|
129
|
+
@game.score
|
|
171
130
|
end
|
|
172
131
|
end
|
|
173
132
|
|
|
174
|
-
def
|
|
133
|
+
def test_an_unstarted_game_can_not_be_scored
|
|
175
134
|
skip
|
|
176
|
-
assert_raises
|
|
177
|
-
|
|
178
|
-
'Score cannot be taken until the end of the game',
|
|
179
|
-
) do
|
|
135
|
+
assert_raises StandardError do
|
|
136
|
+
roll([])
|
|
180
137
|
@game.score
|
|
181
138
|
end
|
|
182
139
|
end
|
|
183
140
|
|
|
184
|
-
def
|
|
141
|
+
def test_an_incomplete_game_can_not_be_scored
|
|
185
142
|
skip
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
@game.score
|
|
191
|
-
end
|
|
143
|
+
assert_raises StandardError do
|
|
144
|
+
roll([0, 0])
|
|
145
|
+
@game.score
|
|
146
|
+
end
|
|
192
147
|
end
|
|
193
148
|
|
|
194
|
-
def
|
|
149
|
+
def test_a_game_with_more_than_ten_frames_can_not_be_scored
|
|
195
150
|
skip
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
'Should not be able to roll after game is over',
|
|
200
|
-
) do
|
|
201
|
-
@game.roll(0)
|
|
151
|
+
assert_raises StandardError do
|
|
152
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
153
|
+
@game.score
|
|
202
154
|
end
|
|
203
155
|
end
|
|
204
156
|
|
|
205
|
-
def
|
|
157
|
+
def test_bonus_rolls_for_a_strike_in_the_last_frame_must_be_rolled_before_score_can_be_calculated
|
|
206
158
|
skip
|
|
207
|
-
|
|
159
|
+
assert_raises StandardError do
|
|
160
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10])
|
|
161
|
+
@game.score
|
|
162
|
+
end
|
|
163
|
+
end
|
|
208
164
|
|
|
209
|
-
|
|
165
|
+
def test_both_bonus_rolls_for_a_strike_in_the_last_frame_must_be_rolled_before_score_can_be_calculated
|
|
166
|
+
skip
|
|
167
|
+
assert_raises StandardError do
|
|
168
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10])
|
|
210
169
|
@game.score
|
|
211
170
|
end
|
|
212
171
|
end
|
|
213
172
|
|
|
214
|
-
def
|
|
215
|
-
|
|
216
|
-
|
|
173
|
+
def test_bonus_roll_for_a_spare_in_the_last_frame_must_be_rolled_before_score_can_be_calculated
|
|
174
|
+
skip
|
|
175
|
+
assert_raises StandardError do
|
|
176
|
+
roll([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3])
|
|
177
|
+
@game.score
|
|
217
178
|
end
|
|
218
179
|
end
|
|
219
|
-
private :roll_n_times
|
|
220
180
|
|
|
221
|
-
#
|
|
181
|
+
# Problems in exercism evolve over time, as we find better ways to ask
|
|
182
|
+
# questions.
|
|
183
|
+
# The version number refers to the version of the problem you solved,
|
|
184
|
+
# not your solution.
|
|
185
|
+
#
|
|
186
|
+
# Define a constant named VERSION inside of the top level BookKeeping
|
|
187
|
+
# module, which may be placed near the end of your file.
|
|
188
|
+
#
|
|
189
|
+
# In your file, it will look like this:
|
|
190
|
+
#
|
|
191
|
+
# module BookKeeping
|
|
192
|
+
# VERSION = 1 # Where the version number matches the one in the test.
|
|
193
|
+
# end
|
|
194
|
+
#
|
|
195
|
+
# If you are curious, read more about constants on RubyDoc:
|
|
196
|
+
# http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
|
|
197
|
+
|
|
222
198
|
def test_bookkeeping
|
|
223
199
|
skip
|
|
224
|
-
assert_equal
|
|
200
|
+
assert_equal 2, BookKeeping::VERSION
|
|
225
201
|
end
|
|
226
202
|
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
module BookKeeping
|
|
2
|
-
VERSION =
|
|
2
|
+
VERSION = 2
|
|
3
3
|
end
|
|
4
4
|
|
|
5
5
|
class Game
|
|
6
|
-
|
|
6
|
+
PINS = { MIN: 0, MAX: 10 }.freeze
|
|
7
7
|
at_exit { public :roll, :score }
|
|
8
8
|
|
|
9
9
|
private
|
|
@@ -20,7 +20,7 @@ class Game
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def validate(pins)
|
|
23
|
-
raise 'Invalid number of pins' unless (
|
|
23
|
+
raise 'Invalid number of pins' unless (PINS[:MIN]..PINS[:MAX]).cover?(pins)
|
|
24
24
|
raise 'Too many pins in frame' unless valid_frame?(pins)
|
|
25
25
|
raise 'Game is over, no rolls allowed' if game_complete?
|
|
26
26
|
end
|
|
@@ -28,8 +28,8 @@ class Game
|
|
|
28
28
|
def valid_frame?(pins)
|
|
29
29
|
last_roll_was_strike = @score_card[current_frame].last == 10
|
|
30
30
|
|
|
31
|
-
(last_frame? && last_roll_was_strike) ||
|
|
32
|
-
|
|
31
|
+
(last_frame? && last_roll_was_strike || spare?) ||
|
|
32
|
+
@score_card[current_frame].last.to_i + pins <= PINS[:MAX]
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def score
|
|
@@ -40,10 +40,10 @@ class Game
|
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
def score_frame(f, i)
|
|
43
|
-
strike_or_spare = [f.first, f.inject(:+)].any? {|e| e ==
|
|
43
|
+
strike_or_spare = [f.first, f.inject(:+)].any? { |e| e == PINS[:MAX] }
|
|
44
44
|
|
|
45
45
|
if strike_or_spare
|
|
46
|
-
special(@score_card[i], @score_card[i+1], @score_card[i+2])
|
|
46
|
+
special(@score_card[i], @score_card[i + 1], @score_card[i + 2])
|
|
47
47
|
else
|
|
48
48
|
f.reduce(:+)
|
|
49
49
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
gem 'minitest', '>= 5.0.0'
|
|
3
|
+
require 'minitest/autorun'
|
|
4
|
+
require_relative 'bowling'
|
|
5
|
+
|
|
6
|
+
# Test data version:
|
|
7
|
+
# <%= sha1 %>
|
|
8
|
+
class BowlingTest < Minitest::Test
|
|
9
|
+
def setup
|
|
10
|
+
@game = Game.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def roll(rolls)
|
|
14
|
+
rolls.each { |pins| @game.roll(pins) }
|
|
15
|
+
end
|
|
16
|
+
<% test_cases.each do |test_case| %>
|
|
17
|
+
def <%= test_case.test_name %>
|
|
18
|
+
<%= test_case.skipped %>
|
|
19
|
+
<%= test_case.work_load %>
|
|
20
|
+
end
|
|
21
|
+
<% end %>
|
|
22
|
+
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
|
|
23
|
+
def test_bookkeeping
|
|
24
|
+
skip
|
|
25
|
+
assert_equal <%= version.next %>, BookKeeping::VERSION
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -89,7 +89,6 @@ class CircularBufferTest < Minitest::Test
|
|
|
89
89
|
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
|
|
90
90
|
end
|
|
91
91
|
|
|
92
|
-
# rubocop:disable Metrics/MethodLength
|
|
93
92
|
def test_alternate_read_and_write_into_buffer_overflow
|
|
94
93
|
skip
|
|
95
94
|
buffer = CircularBuffer.new(5)
|
|
@@ -108,5 +107,4 @@ class CircularBufferTest < Minitest::Test
|
|
|
108
107
|
assert_equal 'B', buffer.read
|
|
109
108
|
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
|
|
110
109
|
end
|
|
111
|
-
# rubocop:enable Metrics/MethodLength
|
|
112
110
|
end
|
|
@@ -12,7 +12,6 @@ class Clock
|
|
|
12
12
|
@internal = hours * 60 + minutes
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
# rubocop:disable Style/OpMethod
|
|
16
15
|
def +(hours=0, minutes)
|
|
17
16
|
@internal += hours * 60 + minutes
|
|
18
17
|
self
|
|
@@ -21,7 +20,6 @@ class Clock
|
|
|
21
20
|
def -(*args)
|
|
22
21
|
self.+(*args.map(&:-@))
|
|
23
22
|
end
|
|
24
|
-
# rubocop:enable Style/OpMethod
|
|
25
23
|
|
|
26
24
|
def ==(other)
|
|
27
25
|
to_s == other.to_s
|
|
@@ -204,7 +204,6 @@ class CustomSetTest < Minitest::Test
|
|
|
204
204
|
assert_equal expected, set2.intersection(set1)
|
|
205
205
|
end
|
|
206
206
|
|
|
207
|
-
# rubocop:disable Metrics/LineLength
|
|
208
207
|
def test_intersection_of_two_sets_with_shared_elements_is_a_set_of_the_shared_elements
|
|
209
208
|
skip
|
|
210
209
|
set1 = CustomSet.new [1, 2, 3, 4]
|
|
@@ -4,10 +4,10 @@ gem 'minitest', '>= 5.0.0'
|
|
|
4
4
|
require 'minitest/autorun'
|
|
5
5
|
require_relative 'isogram'
|
|
6
6
|
|
|
7
|
-
# Common test data version:
|
|
7
|
+
# Common test data version: c1cb73f
|
|
8
8
|
class IsogramTest < Minitest::Test
|
|
9
9
|
def test_duplicates
|
|
10
|
-
|
|
10
|
+
# skip
|
|
11
11
|
string = 'duplicates'
|
|
12
12
|
assert Isogram.is_isogram?(string)
|
|
13
13
|
end
|
|
@@ -5,9 +5,6 @@ require_relative 'largest_series_product'
|
|
|
5
5
|
|
|
6
6
|
# Test data version:
|
|
7
7
|
# <%= sha1 %>
|
|
8
|
-
# Rubocop directives
|
|
9
|
-
# rubocop:disable Style/NumericLiterals
|
|
10
|
-
# rubocop:disable Metrics/LineLength
|
|
11
8
|
#
|
|
12
9
|
class Seriestest < Minitest::Test<% test_cases.each do |test_case| %>
|
|
13
10
|
def <%= test_case.name %><% if test_case.skipped? %>
|