trackler 2.2.1.72 → 2.2.1.73
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/armstrong-numbers/canonical-data.json +70 -0
- data/problem-specifications/exercises/armstrong-numbers/description.md +10 -0
- data/problem-specifications/exercises/armstrong-numbers/metadata.yml +4 -0
- data/problem-specifications/exercises/bob/canonical-data.json +2 -2
- data/problem-specifications/exercises/bob/description.md +2 -0
- data/tracks/c/config.json +41 -41
- data/tracks/common-lisp/exercises/etl/README.md +1 -1
- data/tracks/common-lisp/exercises/isogram/README.md +1 -1
- data/tracks/delphi/config.json +10 -0
- data/tracks/delphi/config/maintainers.json +2 -2
- data/tracks/delphi/exercises/armstrong-numbers/ArmstrongNumbers.dpr +60 -0
- data/tracks/delphi/exercises/armstrong-numbers/README.md +39 -0
- data/tracks/delphi/exercises/armstrong-numbers/uArmstrongNumbersExample.pas +24 -0
- data/tracks/delphi/exercises/armstrong-numbers/uArmstrongNumbersTests.pas +101 -0
- data/tracks/delphi/exercises/bob/README.md +2 -0
- data/tracks/delphi/exercises/bob/uBobExample.pas +12 -3
- data/tracks/delphi/exercises/bob/uBobTests.pas +80 -23
- data/tracks/go/exercises/bob/README.md +2 -0
- data/tracks/go/exercises/bob/cases_test.go +3 -3
- data/tracks/go/exercises/bob/example.go +3 -0
- data/tracks/go/exercises/book-store/cases_test.go +7 -2
- data/tracks/go/exercises/word-count/cases_test.go +6 -1
- data/tracks/groovy/exercises/linked-list/README.md +1 -1
- data/tracks/haskell/.travis.yml +1 -0
- data/tracks/haskell/bin/ensure-readmes-are-updated.sh +40 -0
- data/tracks/haskell/config.json +9 -0
- data/tracks/haskell/exercises/rail-fence-cipher/README.md +119 -0
- data/tracks/haskell/exercises/rail-fence-cipher/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/rail-fence-cipher/examples/success-standard/src/RailFenceCipher.hs +12 -0
- data/tracks/haskell/exercises/rail-fence-cipher/package.yaml +20 -0
- data/tracks/haskell/exercises/rail-fence-cipher/src/RailFenceCipher.hs +7 -0
- data/tracks/haskell/exercises/rail-fence-cipher/stack.yaml +1 -0
- data/tracks/haskell/exercises/rail-fence-cipher/test/Tests.hs +60 -0
- data/tracks/java/CONTRIBUTING.md +14 -5
- data/tracks/java/bin/run-journey-test-from-ci.sh +1 -1
- data/tracks/java/config.json +13 -0
- data/tracks/java/exercises/custom-set/.meta/src/reference/java/CustomSet.java +12 -12
- data/tracks/java/exercises/food-chain/.meta/src/reference/java/FoodChain.java +3 -3
- data/tracks/java/exercises/grade-school/.meta/src/reference/java/School.java +7 -7
- data/tracks/java/exercises/hamming/.meta/src/reference/java/Hamming.java +3 -3
- data/tracks/java/exercises/hexadecimal/.meta/src/reference/java/Hexadecimal.java +2 -4
- data/tracks/java/exercises/isogram/.meta/src/reference/java/IsogramChecker.java +2 -2
- data/tracks/java/exercises/largest-series-product/.meta/src/reference/java/LargestSeriesProductCalculator.java +3 -3
- data/tracks/java/exercises/linked-list/.meta/src/reference/java/DoublyLinkedList.java +6 -6
- data/tracks/java/exercises/markdown/.meta/src/reference/java/Markdown.java +96 -0
- data/tracks/java/exercises/markdown/.meta/version +1 -0
- data/tracks/java/exercises/markdown/README.md +30 -0
- data/tracks/java/exercises/markdown/build.gradle +18 -0
- data/tracks/java/exercises/markdown/src/main/java/Markdown.java +83 -0
- data/tracks/java/exercises/markdown/src/test/java/MarkdownTest.java +95 -0
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/javascript/exercises/alphametics/example.js +13 -9
- data/tracks/kotlin/docs/TESTS.md +14 -11
- data/tracks/ocaml/exercises/bob/example.ml +5 -3
- data/tracks/ocaml/exercises/bob/test.ml +3 -4
- data/tracks/ocaml/exercises/word-count/test.ml +3 -0
- data/tracks/ocaml/tools/test-generator/templates/ocaml/bob/test.ml +0 -1
- data/tracks/perl6/config.json +16 -6
- data/tracks/perl6/exercises/bob/Bob.pm6 +1 -1
- data/tracks/perl6/exercises/bob/Example.pm6 +11 -7
- data/tracks/perl6/exercises/bob/README.md +2 -0
- data/tracks/perl6/exercises/bob/bob.t +3 -3
- data/tracks/perl6/exercises/bob/example.yaml +11 -7
- data/tracks/perl6/exercises/clock/clock.t +17 -17
- data/tracks/perl6/exercises/clock/example.yaml +17 -17
- data/tracks/perl6/exercises/roman-numerals/Example.pm6 +17 -0
- data/tracks/perl6/exercises/roman-numerals/RomanNumerals.pm6 +4 -0
- data/tracks/perl6/exercises/roman-numerals/example.yaml +30 -0
- data/tracks/perl6/exercises/roman-numerals/roman-numerals.t +162 -0
- data/tracks/python/exercises/book-store/book_store_test.py +7 -1
- data/tracks/ruby/config.json +11 -0
- data/tracks/ruby/exercises/isbn-verifier/.meta/.version +1 -0
- data/tracks/ruby/exercises/isbn-verifier/.meta/generator/isbn_verifier_case.rb +28 -0
- data/tracks/ruby/exercises/isbn-verifier/.meta/solutions/isbn_verifier.rb +25 -0
- data/tracks/ruby/exercises/isbn-verifier/README.md +73 -0
- data/tracks/ruby/exercises/isbn-verifier/isbn_verifier_test.rb +105 -0
- data/tracks/ruby/exercises/isogram/.meta/generator/isogram_case.rb +3 -3
- data/tracks/ruby/exercises/isogram/isogram_test.rb +18 -18
- data/tracks/rust/README.md +0 -2
- data/tracks/rust/config.json +11 -0
- data/tracks/rust/exercises/diffie-hellman/tests/diffie-hellman.rs +0 -1
- data/tracks/rust/exercises/parallel-letter-frequency/HINTS.md +2 -2
- data/tracks/rust/exercises/parallel-letter-frequency/README.md +2 -2
- data/tracks/rust/exercises/rna-transcription/example.rs +10 -10
- data/tracks/rust/exercises/rna-transcription/tests/rna-transcription.rs +10 -10
- data/tracks/rust/exercises/series/.gitignore +3 -0
- data/tracks/rust/exercises/series/Cargo.toml +5 -0
- data/tracks/rust/exercises/series/README.md +60 -0
- data/tracks/rust/exercises/series/example.rs +13 -0
- data/tracks/rust/exercises/series/src/lib.rs +3 -0
- data/tracks/rust/exercises/series/tests/series.rs +34 -0
- data/tracks/sml/exercises/nth-prime/README.md +1 -1
- data/tracks/vimscript/.travis.yml +3 -0
- data/tracks/vimscript/docs/LEARNING.md +1 -1
- metadata +38 -2
@@ -6,6 +6,8 @@ Bob answers 'Sure.' if you ask him a question.
|
|
6
6
|
|
7
7
|
He answers 'Whoa, chill out!' if you yell at him.
|
8
8
|
|
9
|
+
He answers 'Calm down, I know what I'm doing!' if you yell a question at him.
|
10
|
+
|
9
11
|
He says 'Fine. Be that way!' if you address him without actually saying
|
10
12
|
anything.
|
11
13
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
package bob
|
2
2
|
|
3
3
|
// Source: exercism/problem-specifications
|
4
|
-
// Commit:
|
5
|
-
// Problem Specifications Version: 1.
|
4
|
+
// Commit: fef09f6 Bob: Add fifth rule (#1025)
|
5
|
+
// Problem Specifications Version: 1.1.0
|
6
6
|
|
7
7
|
var testCases = []struct {
|
8
8
|
description string
|
@@ -52,7 +52,7 @@ var testCases = []struct {
|
|
52
52
|
{
|
53
53
|
"forceful question",
|
54
54
|
"WHAT THE HELL WERE YOU THINKING?",
|
55
|
-
"
|
55
|
+
"Calm down, I know what I'm doing!",
|
56
56
|
},
|
57
57
|
{
|
58
58
|
"shouting numbers",
|
@@ -1,8 +1,8 @@
|
|
1
1
|
package bookstore
|
2
2
|
|
3
3
|
// Source: exercism/problem-specifications
|
4
|
-
// Commit:
|
5
|
-
// Problem Specifications Version: 1.0
|
4
|
+
// Commit: a636903 Update description per @insti comments
|
5
|
+
// Problem Specifications Version: 1.1.0
|
6
6
|
|
7
7
|
var testCases = []struct {
|
8
8
|
description string
|
@@ -74,4 +74,9 @@ var testCases = []struct {
|
|
74
74
|
basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2},
|
75
75
|
expected: 75.20,
|
76
76
|
},
|
77
|
+
{
|
78
|
+
description: "Four groups of four are cheaper than two groups each of five and three",
|
79
|
+
basket: []int{1, 1, 2, 2, 3, 3, 4, 5, 1, 1, 2, 2, 3, 3, 4, 5},
|
80
|
+
expected: 102.40,
|
81
|
+
},
|
77
82
|
}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
package wordcount
|
2
2
|
|
3
3
|
// Source: exercism/problem-specifications
|
4
|
-
// Commit:
|
4
|
+
// Commit: 8793a05 word-count: Add test for multiple whitespace (#1023)
|
5
5
|
// Problem Specifications Version: 1.0.0
|
6
6
|
|
7
7
|
var testCases = []struct {
|
@@ -59,4 +59,9 @@ var testCases = []struct {
|
|
59
59
|
"Joe can't tell between 'large' and large.",
|
60
60
|
Frequency{"and": 1, "between": 1, "can't": 1, "joe": 1, "large": 2, "tell": 1},
|
61
61
|
},
|
62
|
+
{
|
63
|
+
"multiple spaces not detected as a word",
|
64
|
+
" multiple whitespaces",
|
65
|
+
Frequency{"multiple": 1, "whitespaces": 1},
|
66
|
+
},
|
62
67
|
}
|
data/tracks/haskell/.travis.yml
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
if [ ! -x bin/configlet ]; then
|
2
|
+
echo "Improper configuration; configlet should exist in bin/ when this script is run"
|
3
|
+
echo "Ping a Haskell track maintainer to fix this"
|
4
|
+
exit 1
|
5
|
+
fi
|
6
|
+
|
7
|
+
if [ ! -d "problem-specifications" ]; then
|
8
|
+
git clone https://github.com/exercism/problem-specifications.git problem-specifications
|
9
|
+
fi
|
10
|
+
|
11
|
+
newline=$'\n '
|
12
|
+
|
13
|
+
missing_readmes=""
|
14
|
+
wrong_readmes=""
|
15
|
+
for exercise in $(git diff --name-only master..$(git rev-parse --abbrev-ref HEAD) | grep exercises/ | cut -d'/' -f2 -s | sort -fu); do
|
16
|
+
echo "Checking readme for $exercise"
|
17
|
+
readme_path="exercises/${exercise}/README.md"
|
18
|
+
if [ ! -f $readme_path ]; then
|
19
|
+
missing_readmes="$missing_readmes$newline$exercise"
|
20
|
+
else
|
21
|
+
existing_readme_checksum=$(md5sum $readme_path | cut -d' ' -f1)
|
22
|
+
# generate the new README
|
23
|
+
bin/configlet generate . --only "$exercise" --spec-path "problem-specifications"
|
24
|
+
generated_readme_checksum=$(md5sum $readme_path | cut -d' ' -f1)
|
25
|
+
|
26
|
+
if [ $existing_readme_checksum != $generated_readme_checksum ]; then
|
27
|
+
wrong_readmes="$wrong_readmes$newline$exercise"
|
28
|
+
fi
|
29
|
+
fi
|
30
|
+
done
|
31
|
+
|
32
|
+
if [ -n "$missing_readmes" ]; then
|
33
|
+
echo "Exercises missing README.md:$missing_readmes"
|
34
|
+
fi
|
35
|
+
if [ -n "$wrong_readmes" ]; then
|
36
|
+
echo "Exercises with out-of-date README.md:$wrong_readmes"
|
37
|
+
fi
|
38
|
+
if [ -n "$missing_readmes" -o -n "$wrong_readmes" ]; then
|
39
|
+
exit 1
|
40
|
+
fi
|
data/tracks/haskell/config.json
CHANGED
@@ -31,6 +31,15 @@
|
|
31
31
|
"topics": [
|
32
32
|
]
|
33
33
|
},
|
34
|
+
{
|
35
|
+
"uuid": "5bf7612c-427e-484d-bc67-8553fac4f64d",
|
36
|
+
"slug": "rail-fence-cipher",
|
37
|
+
"core": false,
|
38
|
+
"unlocked_by": null,
|
39
|
+
"difficulty": 1,
|
40
|
+
"topics": [
|
41
|
+
]
|
42
|
+
},
|
34
43
|
{
|
35
44
|
"uuid": "6cbb7841-9d96-4528-88e3-6e98a450fd7c",
|
36
45
|
"slug": "space-age",
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# Rail Fence Cipher
|
2
|
+
|
3
|
+
Implement encoding and decoding for the rail fence cipher.
|
4
|
+
|
5
|
+
The Rail Fence cipher is a form of transposition cipher that gets its name from
|
6
|
+
the way in which it's encoded. It was already used by the ancient Greeks.
|
7
|
+
|
8
|
+
In the Rail Fence cipher, the message is written downwards on successive "rails"
|
9
|
+
of an imaginary fence, then moving up when we get to the bottom (like a zig-zag).
|
10
|
+
Finally the message is then read off in rows.
|
11
|
+
|
12
|
+
For example, using three "rails" and the message "WE ARE DISCOVERED FLEE AT ONCE",
|
13
|
+
the cipherer writes out:
|
14
|
+
|
15
|
+
```text
|
16
|
+
W . . . E . . . C . . . R . . . L . . . T . . . E
|
17
|
+
. E . R . D . S . O . E . E . F . E . A . O . C .
|
18
|
+
. . A . . . I . . . V . . . D . . . E . . . N . .
|
19
|
+
```
|
20
|
+
|
21
|
+
Then reads off:
|
22
|
+
|
23
|
+
```text
|
24
|
+
WECRLTEERDSOEEFEAOCAIVDEN
|
25
|
+
```
|
26
|
+
|
27
|
+
To decrypt a message you take the zig-zag shape and fill the ciphertext along the rows.
|
28
|
+
|
29
|
+
```text
|
30
|
+
? . . . ? . . . ? . . . ? . . . ? . . . ? . . . ?
|
31
|
+
. ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? .
|
32
|
+
. . ? . . . ? . . . ? . . . ? . . . ? . . . ? . .
|
33
|
+
```
|
34
|
+
|
35
|
+
The first row has seven spots that can be filled with "WECRLTE".
|
36
|
+
|
37
|
+
```text
|
38
|
+
W . . . E . . . C . . . R . . . L . . . T . . . E
|
39
|
+
. ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? .
|
40
|
+
. . ? . . . ? . . . ? . . . ? . . . ? . . . ? . .
|
41
|
+
```
|
42
|
+
|
43
|
+
Now the 2nd row takes "ERDSOEEFEAOC".
|
44
|
+
|
45
|
+
```text
|
46
|
+
W . . . E . . . C . . . R . . . L . . . T . . . E
|
47
|
+
. E . R . D . S . O . E . E . F . E . A . O . C .
|
48
|
+
. . ? . . . ? . . . ? . . . ? . . . ? . . . ? . .
|
49
|
+
```
|
50
|
+
|
51
|
+
Leaving "AIVDEN" for the last row.
|
52
|
+
|
53
|
+
```text
|
54
|
+
W . . . E . . . C . . . R . . . L . . . T . . . E
|
55
|
+
. E . R . D . S . O . E . E . F . E . A . O . C .
|
56
|
+
. . A . . . I . . . V . . . D . . . E . . . N . .
|
57
|
+
```
|
58
|
+
|
59
|
+
If you now read along the zig-zag shape you can read the original message.
|
60
|
+
|
61
|
+
|
62
|
+
## Getting Started
|
63
|
+
|
64
|
+
For installation and learning resources, refer to the
|
65
|
+
[exercism help page](http://exercism.io/languages/haskell).
|
66
|
+
|
67
|
+
## Running the tests
|
68
|
+
|
69
|
+
To run the test suite, execute the following command:
|
70
|
+
|
71
|
+
```bash
|
72
|
+
stack test
|
73
|
+
```
|
74
|
+
|
75
|
+
#### If you get an error message like this...
|
76
|
+
|
77
|
+
```
|
78
|
+
No .cabal file found in directory
|
79
|
+
```
|
80
|
+
|
81
|
+
You are probably running an old stack version and need
|
82
|
+
to upgrade it.
|
83
|
+
|
84
|
+
#### Otherwise, if you get an error message like this...
|
85
|
+
|
86
|
+
```
|
87
|
+
No compiler found, expected minor version match with...
|
88
|
+
Try running "stack setup" to install the correct GHC...
|
89
|
+
```
|
90
|
+
|
91
|
+
Just do as it says and it will download and install
|
92
|
+
the correct compiler version:
|
93
|
+
|
94
|
+
```bash
|
95
|
+
stack setup
|
96
|
+
```
|
97
|
+
|
98
|
+
## Running *GHCi*
|
99
|
+
|
100
|
+
If you want to play with your solution in GHCi, just run the command:
|
101
|
+
|
102
|
+
```bash
|
103
|
+
stack ghci
|
104
|
+
```
|
105
|
+
|
106
|
+
## Feedback, Issues, Pull Requests
|
107
|
+
|
108
|
+
The [exercism/haskell](https://github.com/exercism/haskell) repository on
|
109
|
+
GitHub is the home for all of the Haskell exercises.
|
110
|
+
|
111
|
+
If you have feedback about an exercise, or want to help implementing a new
|
112
|
+
one, head over there and create an issue. We'll do our best to help you!
|
113
|
+
|
114
|
+
## Source
|
115
|
+
|
116
|
+
Wikipedia [https://en.wikipedia.org/wiki/Transposition_cipher#Rail_Fence_cipher](https://en.wikipedia.org/wiki/Transposition_cipher#Rail_Fence_cipher)
|
117
|
+
|
118
|
+
## Submitting Incomplete Solutions
|
119
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
data/tracks/haskell/exercises/rail-fence-cipher/examples/success-standard/src/RailFenceCipher.hs
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module RailFenceCipher (encode, decode) where
|
2
|
+
|
3
|
+
import Data.List (sortBy)
|
4
|
+
import Data.Function (on)
|
5
|
+
|
6
|
+
encode :: Int -> [a] -> [a]
|
7
|
+
encode n xs = concat [[a | (a, b) <- zip xs c, b == i] | i <- [1..n]]
|
8
|
+
where c = cycle $ [1..n] ++ [n-1,n-2..2]
|
9
|
+
|
10
|
+
decode :: Int -> [a] -> [a]
|
11
|
+
decode n xs = map snd $ sortBy (compare `on` fst) zippedL
|
12
|
+
where zippedL = zip (encode n [0..length xs - 1]) xs
|
@@ -0,0 +1,20 @@
|
|
1
|
+
name: rail-fence-cipher
|
2
|
+
version: 1.1.0.1
|
3
|
+
|
4
|
+
dependencies:
|
5
|
+
- base
|
6
|
+
|
7
|
+
library:
|
8
|
+
exposed-modules: RailFenceCipher
|
9
|
+
source-dirs: src
|
10
|
+
dependencies:
|
11
|
+
# - foo # List here the packages you
|
12
|
+
# - bar # want to use in your solution.
|
13
|
+
|
14
|
+
tests:
|
15
|
+
test:
|
16
|
+
main: Tests.hs
|
17
|
+
source-dirs: test
|
18
|
+
dependencies:
|
19
|
+
- rail-fence-cipher
|
20
|
+
- hspec
|
@@ -0,0 +1 @@
|
|
1
|
+
resolver: lts-9.11
|
@@ -0,0 +1,60 @@
|
|
1
|
+
{-# LANGUAGE RecordWildCards #-}
|
2
|
+
|
3
|
+
import Data.Foldable (for_)
|
4
|
+
import Test.Hspec (Spec, describe, it, shouldBe)
|
5
|
+
import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith)
|
6
|
+
|
7
|
+
import RailFenceCipher (encode, decode)
|
8
|
+
|
9
|
+
main :: IO ()
|
10
|
+
main = hspecWith defaultConfig {configFastFail = True} specs
|
11
|
+
|
12
|
+
specs :: Spec
|
13
|
+
specs = do
|
14
|
+
describe "encode" $ for_ encodeCases testE
|
15
|
+
describe "decode" $ for_ decodeCases testD
|
16
|
+
where
|
17
|
+
testE Case{..} = it description $ encode key text `shouldBe` expected
|
18
|
+
testD Case{..} = it description $ decode key text `shouldBe` expected
|
19
|
+
|
20
|
+
data Case = Case { description :: String
|
21
|
+
, key :: Int
|
22
|
+
, text :: String
|
23
|
+
, expected :: String
|
24
|
+
}
|
25
|
+
|
26
|
+
encodeCases :: [Case]
|
27
|
+
encodeCases = [ Case { description = "encode with two rails"
|
28
|
+
, key = 2
|
29
|
+
, text = "XOXOXOXOXOXOXOXOXO"
|
30
|
+
, expected = "XXXXXXXXXOOOOOOOOO"
|
31
|
+
}
|
32
|
+
, Case { description = "encode with three rails"
|
33
|
+
, key = 3
|
34
|
+
, text = "WEAREDISCOVEREDFLEEATONCE"
|
35
|
+
, expected = "WECRLTEERDSOEEFEAOCAIVDEN"
|
36
|
+
}
|
37
|
+
, Case { description = "encode with ending in the middle"
|
38
|
+
, key = 4
|
39
|
+
, text = "EXERCISES"
|
40
|
+
, expected = "ESXIEECSR"
|
41
|
+
}
|
42
|
+
]
|
43
|
+
|
44
|
+
decodeCases :: [Case]
|
45
|
+
decodeCases = [ Case { description = "decode with three rails"
|
46
|
+
, key = 3
|
47
|
+
, text = "TEITELHDVLSNHDTISEIIEA"
|
48
|
+
, expected = "THEDEVILISINTHEDETAILS"
|
49
|
+
}
|
50
|
+
, Case { description = "decode with five rails"
|
51
|
+
, key = 5
|
52
|
+
, text = "EIEXMSMESAORIWSCE"
|
53
|
+
, expected = "EXERCISMISAWESOME"
|
54
|
+
}
|
55
|
+
, Case { description = "decode with six rails"
|
56
|
+
, key = 6
|
57
|
+
, text = "133714114238148966225439541018335470986172518171757571896261"
|
58
|
+
, expected = "112358132134558914423337761098715972584418167651094617711286"
|
59
|
+
}
|
60
|
+
]
|
data/tracks/java/CONTRIBUTING.md
CHANGED
@@ -85,6 +85,7 @@ The `exercises` subdirectory contains all of the problem submodules.
|
|
85
85
|
Each problem/submodule is a subdirectory of the same name as its slug.
|
86
86
|
|
87
87
|
* its `build.gradle` names dependencies required to work that problem.
|
88
|
+
* its `README.md` describes the exercise.
|
88
89
|
|
89
90
|
Each problem/submodule has three source sets:
|
90
91
|
|
@@ -152,19 +153,27 @@ Also please make a [dibs pull request](https://github.com/exercism/docs/blob/mas
|
|
152
153
|
|
153
154
|
The Java specific details you need to know about adding an exercise are:
|
154
155
|
|
155
|
-
|
156
|
+
* Please add an entry to the `exercises` array in `config.json`. You can find details about what should be in that entry [here](https://github.com/exercism/docs/blob/master/language-tracks/configuration/exercises.md).
|
156
157
|
You can also look at other entries in `config.json` as examples and try to mimic them.
|
157
158
|
|
158
|
-
|
159
|
+
* Please add an entry for your exercise to `settings.gradle`.
|
159
160
|
This should just be `include 'exercise-name'`.
|
160
161
|
This list is in alphabetical order so please add your exercise so that it maintains this order.
|
161
162
|
|
162
|
-
|
163
|
+
* Please add an exercise submodule for your exercise.
|
163
164
|
See [The Problem Submodules](#the-problem-submodules) section for what needs to be in this.
|
164
|
-
The `build.gradle` file can just be copied from any other exercise submodule.
|
165
165
|
See the [POLICIES doc](https://github.com/exercism/java/blob/master/POLICIES.md#starter-implementations) for an explanation of when you need to add a starter implementation.
|
166
|
+
The `build.gradle` file can just be copied from any other exercise submodule.
|
167
|
+
The `README.md` file can be generated using [configlet](https://github.com/exercism/configlet/releases).
|
168
|
+
You can do this by:
|
169
|
+
|
170
|
+
1. Download configlet and put it somewhere in your PATH
|
171
|
+
|
172
|
+
2. Clone [the problem-specifications repository](https://github.com/exercism/problem-specifications).
|
173
|
+
|
174
|
+
3. Run `configlet generate . --only name_of_new_exercise` from the root of this repository.
|
166
175
|
|
167
|
-
|
176
|
+
* Check if there is canonical data for the exercise you're adding.
|
168
177
|
This can be found at `https://github.com/exercism/problem-specifications/tree/master/exercises/EXERCISE-SLUG/canonical-data.json`.
|
169
178
|
If there is canonical data for your exercise then you should follow this when making the tests.
|
170
179
|
We aim to follow the canonical data as closely as possible in our tests to ensure thorough test coverage.
|