trackler 2.2.1.137 → 2.2.1.138
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/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/diffie-hellman/canonical-data.json +72 -0
- data/problem-specifications/exercises/yacht/description.md +2 -2
- data/tracks/csharp/exercises/sgf-parsing/Example.cs +1 -1
- data/tracks/csharp/exercises/sgf-parsing/SgfParsingTest.cs +1 -1
- data/tracks/csharp/exercises/sublist/SublistTest.cs +37 -78
- data/tracks/csharp/generators/Exercises/Sublist.cs +32 -0
- data/tracks/elisp/exercises/bob/README.md +2 -0
- data/tracks/elisp/exercises/bob/bob-test.el +60 -15
- data/tracks/elisp/exercises/bob/example.el +15 -5
- data/tracks/elisp/exercises/hamming/hamming-test.el +1 -1
- data/tracks/fsharp/build.ps1 +3 -3
- data/tracks/fsharp/build.sh +3 -3
- data/tracks/fsharp/exercises/bracket-push/BracketPushTest.fs +5 -1
- data/tracks/fsharp/exercises/isbn-verifier/IsbnVerifierTest.fs +5 -1
- data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGardenTest.fs +1 -1
- data/tracks/fsharp/exercises/pov/PovTest.fs +6 -1
- data/tracks/fsharp/exercises/react/Example.fs +2 -2
- data/tracks/fsharp/exercises/react/React.fsproj +1 -0
- data/tracks/fsharp/exercises/react/ReactTest.fs +55 -33
- data/tracks/fsharp/exercises/series/Example.fs +2 -12
- data/tracks/fsharp/exercises/series/SeriesTest.fs +33 -56
- data/tracks/fsharp/generators/Generators.fs +81 -46
- data/tracks/idris/exercises/rna-transcription/src/{example.idr → Example.idr} +0 -0
- data/tracks/java/config.json +14 -0
- data/tracks/java/exercises/acronym/src/test/java/AcronymTest.java +10 -10
- data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +39 -39
- data/tracks/java/exercises/grep/.meta/hints.md +58 -0
- data/tracks/java/exercises/grep/.meta/src/reference/java/GrepTool.java +65 -0
- data/tracks/java/exercises/grep/.meta/version +1 -0
- data/tracks/java/exercises/grep/README.md +145 -0
- data/tracks/java/exercises/grep/build.gradle +18 -0
- data/tracks/java/exercises/grep/src/main/java/.keep +0 -0
- data/tracks/java/exercises/grep/src/test/java/GrepToolTest.java +395 -0
- data/tracks/java/exercises/largest-series-product/src/test/java/LargestSeriesProductCalculatorTest.java +36 -36
- data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +36 -36
- data/tracks/java/exercises/phone-number/src/test/java/PhoneNumberTest.java +14 -14
- data/tracks/java/exercises/poker/src/test/java/PokerTest.java +40 -40
- data/tracks/java/exercises/pythagorean-triplet/src/test/java/PythagoreanTripletTest.java +10 -10
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/ocaml/exercises/anagram/example.ml +1 -1
- data/tracks/ocaml/exercises/change/example.ml +1 -1
- data/tracks/ocaml/exercises/custom-set/example.ml +4 -3
- data/tracks/ocaml/exercises/custom-set/test.ml +0 -1
- data/tracks/ocaml/exercises/dominoes/test.ml +1 -1
- data/tracks/ocaml/exercises/etl/example.ml +1 -1
- data/tracks/ocaml/exercises/grade-school/example.ml +1 -1
- data/tracks/ocaml/exercises/palindrome-products/example.ml +2 -2
- data/tracks/ocaml/exercises/prime-factors/example.ml +1 -1
- data/tracks/ocaml/exercises/robot-name/test.ml +1 -1
- data/tracks/ocaml/exercises/triangle/example.ml +1 -1
- data/tracks/ocaml/make-exercise.sh +1 -0
- data/tracks/ocaml/tools/test-generator/src/controller.ml +1 -1
- data/tracks/perl5/exercises/raindrops/.meta/solutions/Raindrops.pm +13 -12
- data/tracks/perl5/exercises/raindrops/raindrops.t +166 -111
- data/tracks/perl6/docs/INSTALLATION.md +1 -3
- data/tracks/perl6/exercises/raindrops/.meta/exercise-data.yaml +5 -5
- data/tracks/perl6/exercises/raindrops/.meta/solutions/Raindrops.pm6 +2 -2
- data/tracks/perl6/exercises/raindrops/Raindrops.pm6 +2 -2
- data/tracks/perl6/exercises/raindrops/raindrops.t +3 -3
- data/tracks/python/exercises/food-chain/example.py +11 -2
- data/tracks/python/exercises/food-chain/food_chain_test.py +48 -45
- data/tracks/python/exercises/pov/pov_test.py +12 -1
- data/tracks/python/exercises/series/README.md +6 -6
- data/tracks/python/exercises/series/example.py +2 -3
- data/tracks/python/exercises/series/series_test.py +27 -28
- data/tracks/python/exercises/sgf-parsing/example.py +1 -1
- data/tracks/python/exercises/sgf-parsing/sgf_parsing_test.py +1 -1
- data/tracks/python/exercises/yacht/README.md +2 -2
- data/tracks/ruby/Gemfile +0 -1
- data/tracks/ruby/README.md +23 -0
- data/tracks/ruby/bin/generate +1 -0
- data/tracks/ruby/exercises/complex-numbers/complex_numbers_test.rb +1 -1
- data/tracks/ruby/lib/generator.rb +1 -2
- data/tracks/ruby/lib/generator/command_line.rb +3 -0
- data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +1 -0
- data/tracks/ruby/lib/generator/exercise.rb +2 -0
- data/tracks/ruby/lib/generator/exercise_case.rb +3 -0
- data/tracks/ruby/lib/generator/files.rb +1 -0
- data/tracks/ruby/lib/generator/files/metadata_files.rb +2 -0
- data/tracks/ruby/lib/generator/files/track_files.rb +1 -0
- data/tracks/ruby/lib/generator/implementation.rb +1 -0
- data/tracks/ruby/lib/generator/repository.rb +3 -0
- data/tracks/ruby/lib/generator/template_values.rb +1 -0
- data/tracks/ruby/test/generator/case_values_test.rb +2 -0
- data/tracks/ruby/test/generator/command_line_test.rb +1 -0
- data/tracks/ruby/test/generator/files/metadata_files_test.rb +2 -0
- data/tracks/ruby/test/generator/files/track_files_test.rb +1 -0
- data/tracks/ruby/test/generator/implementation_test.rb +1 -0
- data/tracks/ruby/test/tasks/exercise_test.rb +1 -0
- data/tracks/ruby/test/tasks/exercise_test_tasks_test.rb +2 -0
- data/tracks/ruby/test/test_helper.rb +1 -3
- data/tracks/rust/config.json +12 -0
- data/tracks/rust/exercises/atbash-cipher/src/lib.rs +9 -0
- data/tracks/rust/exercises/hamming/src/lib.rs +6 -0
- data/tracks/rust/exercises/isogram/src/lib.rs +3 -0
- data/tracks/rust/exercises/luhn/src/lib.rs +4 -0
- data/tracks/rust/exercises/palindrome-products/.meta/test-in-release-mode +1 -0
- data/tracks/rust/exercises/palindrome-products/Cargo.toml +6 -0
- data/tracks/rust/exercises/palindrome-products/README.md +72 -0
- data/tracks/rust/exercises/palindrome-products/example.rs +25 -0
- data/tracks/rust/exercises/palindrome-products/src/lib.rs +22 -0
- data/tracks/rust/exercises/palindrome-products/tests/palindrome-products.rs +57 -0
- data/tracks/rust/exercises/pangram/src/lib.rs +4 -0
- data/tracks/rust/exercises/run-length-encoding/src/lib.rs +7 -0
- data/tracks/rust/exercises/say/src/lib.rs +3 -4
- data/tracks/rust/exercises/scrabble-score/src/lib.rs +4 -0
- data/tracks/rust/exercises/word-count/src/lib.rs +6 -0
- data/tracks/scheme/exercises/hello-world/example.scm +1 -4
- data/tracks/scheme/exercises/hello-world/hello-world-test.scm +1 -5
- data/tracks/scheme/exercises/scrabble-score/scrabble-score-test.scm +2 -2
- data/tracks/typescript/config.json +30 -0
- data/tracks/typescript/exercises/queen-attack/README.md +59 -0
- data/tracks/typescript/exercises/queen-attack/package.json +36 -0
- data/tracks/typescript/exercises/queen-attack/queen-attack.example.ts +56 -0
- data/tracks/typescript/exercises/queen-attack/queen-attack.test.ts +71 -0
- data/tracks/typescript/exercises/queen-attack/queen-attack.ts +0 -0
- data/tracks/typescript/exercises/queen-attack/tsconfig.json +22 -0
- data/tracks/typescript/exercises/queen-attack/tslint.json +127 -0
- data/tracks/typescript/exercises/queen-attack/yarn.lock +2624 -0
- data/tracks/typescript/exercises/spiral-matrix/README.md +56 -0
- data/tracks/typescript/exercises/spiral-matrix/package.json +36 -0
- data/tracks/typescript/exercises/spiral-matrix/spiral-matrix.example.ts +33 -0
- data/tracks/typescript/exercises/spiral-matrix/spiral-matrix.test.ts +49 -0
- data/tracks/typescript/exercises/spiral-matrix/spiral-matrix.ts +0 -0
- data/tracks/typescript/exercises/spiral-matrix/tsconfig.json +22 -0
- data/tracks/typescript/exercises/spiral-matrix/tslint.json +127 -0
- data/tracks/typescript/exercises/spiral-matrix/yarn.lock +2624 -0
- metadata +35 -3
|
@@ -1,4 +1,2 @@
|
|
|
1
1
|
## Installing Rakudo Star
|
|
2
|
-
The [
|
|
3
|
-
|
|
4
|
-
If you are familiar with [Docker](https://www.docker.com/) there is an official [rakudo-star](https://hub.docker.com/_/rakudo-star/) Docker image available.
|
|
2
|
+
The [Rakudo Perl 6 Files](https://rakudo.org/files) page contains detailed instructions for downloading and installing Rakudo Star for Windows / Mac OS X / Linux.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
exercise: Raindrops
|
|
2
|
-
version:
|
|
2
|
+
version: 3
|
|
3
3
|
plan: 18
|
|
4
4
|
tests: |-
|
|
5
5
|
for @($c-data<cases>) {
|
|
6
6
|
subtest {
|
|
7
7
|
plan 2;
|
|
8
|
-
is .<input><number>.&
|
|
9
|
-
isa-ok .<input><number>.&
|
|
8
|
+
is .<input><number>.&raindrop, |.<expected description>;
|
|
9
|
+
isa-ok .<input><number>.&raindrop, Str;
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
unit: module
|
|
14
14
|
example: |-
|
|
15
|
-
sub
|
|
15
|
+
sub raindrop (Int:D $num --> Str:D) is export {
|
|
16
16
|
my $str = '';
|
|
17
17
|
given $num {
|
|
18
18
|
when * %% 3 {$str ~= 'Pling'; proceed}
|
|
@@ -22,5 +22,5 @@ example: |-
|
|
|
22
22
|
return $str ?? $str !! $num.Str;
|
|
23
23
|
}
|
|
24
24
|
stub: |-
|
|
25
|
-
sub
|
|
25
|
+
sub raindrop ($num) is export {
|
|
26
26
|
}
|
|
@@ -6,7 +6,7 @@ use lib $?FILE.IO.dirname;
|
|
|
6
6
|
use Raindrops;
|
|
7
7
|
plan 18;
|
|
8
8
|
|
|
9
|
-
my Version:D $version =
|
|
9
|
+
my Version:D $version = v3;
|
|
10
10
|
|
|
11
11
|
if Raindrops.^ver !~~ $version {
|
|
12
12
|
warn "\nExercise version mismatch. Further tests may fail!"
|
|
@@ -18,8 +18,8 @@ my $c-data = from-json $=pod.pop.contents;
|
|
|
18
18
|
for @($c-data<cases>) {
|
|
19
19
|
subtest {
|
|
20
20
|
plan 2;
|
|
21
|
-
is .<input><number>.&
|
|
22
|
-
isa-ok .<input><number>.&
|
|
21
|
+
is .<input><number>.&raindrop, |.<expected description>;
|
|
22
|
+
isa-ok .<input><number>.&raindrop, Str;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -50,5 +50,14 @@ def verses(letter):
|
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
def recite(start_verse, end_verse):
|
|
53
|
-
generated = [verse.
|
|
54
|
-
|
|
53
|
+
generated = [verse.strip().split("\n") for verse in verses(chain())]
|
|
54
|
+
if start_verse == end_verse:
|
|
55
|
+
return generated[start_verse-1]
|
|
56
|
+
else:
|
|
57
|
+
result = []
|
|
58
|
+
for i in range(start_verse-1, end_verse):
|
|
59
|
+
result += generated[i] + [""]
|
|
60
|
+
|
|
61
|
+
# Pop out the last empty string
|
|
62
|
+
result.pop()
|
|
63
|
+
return result
|
|
@@ -9,98 +9,101 @@ class FoodChainTest(unittest.TestCase):
|
|
|
9
9
|
|
|
10
10
|
def test_fly(self):
|
|
11
11
|
expected = [
|
|
12
|
-
"I know an old lady who swallowed a fly."
|
|
13
|
-
"I don't know why she swallowed the fly. Perhaps she'll die."
|
|
12
|
+
"I know an old lady who swallowed a fly.",
|
|
13
|
+
"I don't know why she swallowed the fly. Perhaps she'll die.",
|
|
14
14
|
]
|
|
15
15
|
self.assertEqual(recite(1, 1), expected)
|
|
16
16
|
|
|
17
17
|
def test_spider(self):
|
|
18
18
|
expected = [
|
|
19
|
-
"I know an old lady who swallowed a spider."
|
|
20
|
-
"It wriggled and jiggled and tickled inside her."
|
|
21
|
-
"She swallowed the spider to catch the fly."
|
|
22
|
-
"I don't know why she swallowed the fly. Perhaps she'll die."
|
|
19
|
+
"I know an old lady who swallowed a spider.",
|
|
20
|
+
"It wriggled and jiggled and tickled inside her.",
|
|
21
|
+
"She swallowed the spider to catch the fly.",
|
|
22
|
+
"I don't know why she swallowed the fly. Perhaps she'll die.",
|
|
23
23
|
]
|
|
24
24
|
self.assertEqual(recite(2, 2), expected)
|
|
25
25
|
|
|
26
26
|
def test_bird(self):
|
|
27
27
|
expected = [
|
|
28
|
-
"I know an old lady who swallowed a bird."
|
|
29
|
-
"How absurd to swallow a bird!"
|
|
28
|
+
"I know an old lady who swallowed a bird.",
|
|
29
|
+
"How absurd to swallow a bird!",
|
|
30
30
|
"She swallowed the bird to catch the spider that "
|
|
31
|
-
"wriggled and jiggled and tickled inside her."
|
|
32
|
-
"She swallowed the spider to catch the fly."
|
|
33
|
-
"I don't know why she swallowed the fly. Perhaps she'll die."
|
|
31
|
+
"wriggled and jiggled and tickled inside her.",
|
|
32
|
+
"She swallowed the spider to catch the fly.",
|
|
33
|
+
"I don't know why she swallowed the fly. Perhaps she'll die.",
|
|
34
34
|
]
|
|
35
35
|
self.assertEqual(recite(3, 3), expected)
|
|
36
36
|
|
|
37
37
|
def test_cat(self):
|
|
38
38
|
expected = [
|
|
39
|
-
"I know an old lady who swallowed a cat."
|
|
40
|
-
"Imagine that, to swallow a cat!"
|
|
41
|
-
"She swallowed the cat to catch the bird."
|
|
39
|
+
"I know an old lady who swallowed a cat.",
|
|
40
|
+
"Imagine that, to swallow a cat!",
|
|
41
|
+
"She swallowed the cat to catch the bird.",
|
|
42
42
|
"She swallowed the bird to catch the spider that "
|
|
43
|
-
"wriggled and jiggled and tickled inside her."
|
|
44
|
-
"She swallowed the spider to catch the fly."
|
|
45
|
-
"I don't know why she swallowed the fly. Perhaps she'll die."
|
|
43
|
+
"wriggled and jiggled and tickled inside her.",
|
|
44
|
+
"She swallowed the spider to catch the fly.",
|
|
45
|
+
"I don't know why she swallowed the fly. Perhaps she'll die.",
|
|
46
46
|
]
|
|
47
47
|
self.assertEqual(recite(4, 4), expected)
|
|
48
48
|
|
|
49
49
|
def test_dog(self):
|
|
50
50
|
expected = [
|
|
51
|
-
"I know an old lady who swallowed a dog."
|
|
52
|
-
"What a hog, to swallow a dog!"
|
|
53
|
-
"She swallowed the dog to catch the cat."
|
|
54
|
-
"She swallowed the cat to catch the bird."
|
|
51
|
+
"I know an old lady who swallowed a dog.",
|
|
52
|
+
"What a hog, to swallow a dog!",
|
|
53
|
+
"She swallowed the dog to catch the cat.",
|
|
54
|
+
"She swallowed the cat to catch the bird.",
|
|
55
55
|
"She swallowed the bird to catch the spider that wriggled "
|
|
56
|
-
"and jiggled and tickled inside her."
|
|
57
|
-
"She swallowed the spider to catch the fly."
|
|
58
|
-
"I don't know why she swallowed the fly. Perhaps she'll die."
|
|
56
|
+
"and jiggled and tickled inside her.",
|
|
57
|
+
"She swallowed the spider to catch the fly.",
|
|
58
|
+
"I don't know why she swallowed the fly. Perhaps she'll die.",
|
|
59
59
|
]
|
|
60
60
|
self.assertEqual(recite(5, 5), expected)
|
|
61
61
|
|
|
62
62
|
def test_goat(self):
|
|
63
63
|
expected = [
|
|
64
|
-
"I know an old lady who swallowed a goat."
|
|
65
|
-
"Just opened her throat and swallowed a goat!"
|
|
66
|
-
"She swallowed the goat to catch the dog."
|
|
67
|
-
"She swallowed the dog to catch the cat."
|
|
68
|
-
"She swallowed the cat to catch the bird."
|
|
64
|
+
"I know an old lady who swallowed a goat.",
|
|
65
|
+
"Just opened her throat and swallowed a goat!",
|
|
66
|
+
"She swallowed the goat to catch the dog.",
|
|
67
|
+
"She swallowed the dog to catch the cat.",
|
|
68
|
+
"She swallowed the cat to catch the bird.",
|
|
69
69
|
"She swallowed the bird to catch the spider that "
|
|
70
|
-
"wriggled and jiggled and tickled inside her."
|
|
71
|
-
"She swallowed the spider to catch the fly."
|
|
72
|
-
"I don't know why she swallowed the fly. Perhaps she'll die."
|
|
70
|
+
"wriggled and jiggled and tickled inside her.",
|
|
71
|
+
"She swallowed the spider to catch the fly.",
|
|
72
|
+
"I don't know why she swallowed the fly. Perhaps she'll die.",
|
|
73
73
|
]
|
|
74
74
|
self.assertEqual(recite(6, 6), expected)
|
|
75
75
|
|
|
76
76
|
def test_cow(self):
|
|
77
77
|
expected = [
|
|
78
|
-
"I know an old lady who swallowed a cow."
|
|
79
|
-
"I don't know how she swallowed a cow!"
|
|
80
|
-
"She swallowed the cow to catch the goat."
|
|
81
|
-
"She swallowed the goat to catch the dog."
|
|
82
|
-
"She swallowed the dog to catch the cat."
|
|
83
|
-
"She swallowed the cat to catch the bird."
|
|
78
|
+
"I know an old lady who swallowed a cow.",
|
|
79
|
+
"I don't know how she swallowed a cow!",
|
|
80
|
+
"She swallowed the cow to catch the goat.",
|
|
81
|
+
"She swallowed the goat to catch the dog.",
|
|
82
|
+
"She swallowed the dog to catch the cat.",
|
|
83
|
+
"She swallowed the cat to catch the bird.",
|
|
84
84
|
"She swallowed the bird to catch the spider that "
|
|
85
|
-
"wriggled and jiggled and tickled inside her."
|
|
86
|
-
"She swallowed the spider to catch the fly."
|
|
87
|
-
"I don't know why she swallowed the fly. Perhaps she'll die."
|
|
85
|
+
"wriggled and jiggled and tickled inside her.",
|
|
86
|
+
"She swallowed the spider to catch the fly.",
|
|
87
|
+
"I don't know why she swallowed the fly. Perhaps she'll die.",
|
|
88
88
|
]
|
|
89
89
|
self.assertEqual(recite(7, 7), expected)
|
|
90
90
|
|
|
91
91
|
def test_horse(self):
|
|
92
92
|
expected = [
|
|
93
|
-
"I know an old lady who swallowed a horse."
|
|
94
|
-
"She's dead, of course!"
|
|
93
|
+
"I know an old lady who swallowed a horse.",
|
|
94
|
+
"She's dead, of course!",
|
|
95
95
|
]
|
|
96
96
|
self.assertEqual(recite(8, 8), expected)
|
|
97
97
|
|
|
98
98
|
def test_multiple_verses(self):
|
|
99
|
-
expected =
|
|
99
|
+
expected = recite(1, 1) + [""] + recite(2, 2) + [""] + recite(3, 3)
|
|
100
100
|
self.assertEqual(recite(1, 3), expected)
|
|
101
101
|
|
|
102
102
|
def test_full_song(self):
|
|
103
|
-
expected = [
|
|
103
|
+
expected = []
|
|
104
|
+
for n in range(1, 9):
|
|
105
|
+
expected += recite(n, n) + [""]
|
|
106
|
+
expected.pop()
|
|
104
107
|
self.assertEqual(recite(1, 8), expected)
|
|
105
108
|
|
|
106
109
|
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from pov import Tree
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.3.0
|
|
7
7
|
|
|
8
8
|
class PovTest(unittest.TestCase):
|
|
9
9
|
|
|
@@ -158,6 +158,17 @@ class PovTest(unittest.TestCase):
|
|
|
158
158
|
expected = ['x', 'parent', 'grandparent', 'uncle', 'cousin-1']
|
|
159
159
|
self.assertEqual(tree.path_to('x', 'cousin-1'), expected)
|
|
160
160
|
|
|
161
|
+
def test_can_find_path_not_involving_root(self):
|
|
162
|
+
tree = Tree('grandparent', [
|
|
163
|
+
Tree('parent', [
|
|
164
|
+
Tree('x'),
|
|
165
|
+
Tree('sibling-0'),
|
|
166
|
+
Tree('sibling-1')
|
|
167
|
+
])
|
|
168
|
+
])
|
|
169
|
+
expected = ['x', 'parent', 'sibling-1']
|
|
170
|
+
self.assertEqual(tree.path_to('x', 'sibling-1'), expected)
|
|
171
|
+
|
|
161
172
|
def test_can_find_path_from_nodes_other_than_x(self):
|
|
162
173
|
tree = Tree('parent', [
|
|
163
174
|
Tree('a'),
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# Series
|
|
2
2
|
|
|
3
3
|
Given a string of digits, output all the contiguous substrings of length `n` in
|
|
4
|
-
that string.
|
|
4
|
+
that string in the order that they appear.
|
|
5
5
|
|
|
6
6
|
For example, the string "49142" has the following 3-digit series:
|
|
7
7
|
|
|
8
|
-
- 491
|
|
9
|
-
- 914
|
|
10
|
-
- 142
|
|
8
|
+
- "491"
|
|
9
|
+
- "914"
|
|
10
|
+
- "142"
|
|
11
11
|
|
|
12
12
|
And the following 4-digit series:
|
|
13
13
|
|
|
14
|
-
- 4914
|
|
15
|
-
- 9142
|
|
14
|
+
- "4914"
|
|
15
|
+
- "9142"
|
|
16
16
|
|
|
17
17
|
And if you ask for a 6-digit series from a 5-digit string, you deserve
|
|
18
18
|
whatever you get.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
def slices(series, length):
|
|
2
|
-
|
|
3
|
-
if not 1 <= length <= len(numbers):
|
|
2
|
+
if not 1 <= length <= len(series):
|
|
4
3
|
raise ValueError("Invalid slice length for this series: " + str(
|
|
5
4
|
length))
|
|
6
|
-
return [
|
|
5
|
+
return [series[i:i + length] for i in range(len(series) - length + 1)]
|
|
@@ -9,40 +9,39 @@ import unittest
|
|
|
9
9
|
from series import slices
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
13
|
+
|
|
12
14
|
class SeriesTest(unittest.TestCase):
|
|
13
|
-
def
|
|
14
|
-
self.assertEqual(
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
def test_slices_of_one_from_one(self):
|
|
16
|
+
self.assertEqual(slices("1", 1), ["1"])
|
|
17
|
+
|
|
18
|
+
def test_slices_of_one_from_two(self):
|
|
19
|
+
self.assertEqual(slices("12", 1), ["1", "2"])
|
|
17
20
|
|
|
18
21
|
def test_slices_of_two(self):
|
|
19
|
-
self.assertEqual(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
slices("01234", 5),
|
|
37
|
-
[[0, 1, 2, 3, 4]], )
|
|
38
|
-
|
|
39
|
-
def test_overly_long_slice(self):
|
|
22
|
+
self.assertEqual(slices("35", 2), ["35"])
|
|
23
|
+
|
|
24
|
+
def test_slices_of_two_overlap(self):
|
|
25
|
+
self.assertEqual(slices("9142", 2), ["91", "14", "42"])
|
|
26
|
+
|
|
27
|
+
def test_slices_can_include_duplicates(self):
|
|
28
|
+
self.assertEqual(slices("777777", 3), ["777", "777", "777", "777"])
|
|
29
|
+
|
|
30
|
+
def test_slice_length_is_too_large(self):
|
|
31
|
+
with self.assertRaisesWithMessage(ValueError):
|
|
32
|
+
slices("12345", 6)
|
|
33
|
+
|
|
34
|
+
def test_slice_length_cannot_be_zero(self):
|
|
35
|
+
with self.assertRaisesWithMessage(ValueError):
|
|
36
|
+
slices("12345", 0)
|
|
37
|
+
|
|
38
|
+
def test_slice_length_cannot_be_negative(self):
|
|
40
39
|
with self.assertRaisesWithMessage(ValueError):
|
|
41
|
-
slices("
|
|
40
|
+
slices("123", -1)
|
|
42
41
|
|
|
43
|
-
def
|
|
42
|
+
def test_empty_series_is_invalid(self):
|
|
44
43
|
with self.assertRaisesWithMessage(ValueError):
|
|
45
|
-
slices("
|
|
44
|
+
slices("", 1)
|
|
46
45
|
|
|
47
46
|
# Utility functions
|
|
48
47
|
def setUp(self):
|
|
@@ -75,7 +75,7 @@ class SgfParsingTest(unittest.TestCase):
|
|
|
75
75
|
def test_escaped_property(self):
|
|
76
76
|
input_string = '(;A[\]b\nc\nd\t\te \n\]])'
|
|
77
77
|
expected = SgfTree(
|
|
78
|
-
properties={'A': [']b
|
|
78
|
+
properties={'A': [']b\nc\nd e \n]']}
|
|
79
79
|
)
|
|
80
80
|
self.assertEqual(parse(input_string), expected)
|
|
81
81
|
|
|
@@ -19,7 +19,7 @@ category chosen.
|
|
|
19
19
|
Sixes 6 × number of sixes 2 3 4 5 6 scores 6
|
|
20
20
|
Full House Total of the dice 3 3 3 5 5 scores 19
|
|
21
21
|
Four of a Kind Total of the four dice 4 4 4 4 6 scores 16
|
|
22
|
-
Little Straight 30 points 1 2 3 4 5 scores 30
|
|
22
|
+
Little Straight 30 points 1 2 3 4 5 scores 30
|
|
23
23
|
Big Straight 30 points 2 3 4 5 6 scores 30
|
|
24
24
|
Choice Sum of the dice 2 3 3 4 6 scores 18
|
|
25
25
|
Yacht 50 points 4 4 4 4 4 scores 50
|
|
@@ -28,7 +28,7 @@ If the dice do not satisfy the requirements of a category, the score is zero.
|
|
|
28
28
|
If, for example, *Four Of A Kind* is entered in the *Yacht* category, zero
|
|
29
29
|
points are scored. A *Yacht* scores zero if entered in the *Full House* category.
|
|
30
30
|
|
|
31
|
-
## Task
|
|
31
|
+
## Task
|
|
32
32
|
Given a list of values for five dice and a category, your solution should return
|
|
33
33
|
the score of the dice for that category. If the dice do not satisfy the requirements
|
|
34
34
|
of the category your solution should return 0. You can assume that five values
|
data/tracks/ruby/Gemfile
CHANGED
data/tracks/ruby/README.md
CHANGED
|
@@ -109,6 +109,29 @@ tree -L 1 ~/code/exercism
|
|
|
109
109
|
├── problem-specifications
|
|
110
110
|
└── ruby
|
|
111
111
|
```
|
|
112
|
+
To explain a bit more, you must follow this commands step-by-step:-
|
|
113
|
+
|
|
114
|
+
``` bash
|
|
115
|
+
$ mkdir exercism
|
|
116
|
+
$ cd exercism
|
|
117
|
+
```
|
|
118
|
+
Fork the [exercism/ruby](https://github.com/exercism/ruby)
|
|
119
|
+
|
|
120
|
+
Fork the [exercism/problem-specifications](https://github.com/exercism/problem-specifications)
|
|
121
|
+
|
|
122
|
+
Now you need to clone both the above repositories
|
|
123
|
+
``` bash
|
|
124
|
+
|
|
125
|
+
$ git clone https://github.com/YOUR-USERNAME/YOUR-RUBY-REPOSITORY
|
|
126
|
+
$ git clone https://github.com/YOUR-USERNAME/YOUR-PROBLEM-S-REPOSITORY
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
Next, you need to [configure the remote](https://help.github.com/articles/configuring-a-remote-for-a-fork/) and [synchronize](https://help.github.com/articles/syncing-a-fork/) it.
|
|
130
|
+
|
|
131
|
+
Make sure you have synced up local master branch and upstream master branch.
|
|
132
|
+
Since this will keep local master branch up-to-date with the upstream repository.
|
|
133
|
+
Thereby, you will able to get the latest commits.
|
|
134
|
+
|
|
112
135
|
|
|
113
136
|
#### Regenerating a Test Suite
|
|
114
137
|
|