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.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/armstrong-numbers/canonical-data.json +70 -0
  4. data/problem-specifications/exercises/armstrong-numbers/description.md +10 -0
  5. data/problem-specifications/exercises/armstrong-numbers/metadata.yml +4 -0
  6. data/problem-specifications/exercises/bob/canonical-data.json +2 -2
  7. data/problem-specifications/exercises/bob/description.md +2 -0
  8. data/tracks/c/config.json +41 -41
  9. data/tracks/common-lisp/exercises/etl/README.md +1 -1
  10. data/tracks/common-lisp/exercises/isogram/README.md +1 -1
  11. data/tracks/delphi/config.json +10 -0
  12. data/tracks/delphi/config/maintainers.json +2 -2
  13. data/tracks/delphi/exercises/armstrong-numbers/ArmstrongNumbers.dpr +60 -0
  14. data/tracks/delphi/exercises/armstrong-numbers/README.md +39 -0
  15. data/tracks/delphi/exercises/armstrong-numbers/uArmstrongNumbersExample.pas +24 -0
  16. data/tracks/delphi/exercises/armstrong-numbers/uArmstrongNumbersTests.pas +101 -0
  17. data/tracks/delphi/exercises/bob/README.md +2 -0
  18. data/tracks/delphi/exercises/bob/uBobExample.pas +12 -3
  19. data/tracks/delphi/exercises/bob/uBobTests.pas +80 -23
  20. data/tracks/go/exercises/bob/README.md +2 -0
  21. data/tracks/go/exercises/bob/cases_test.go +3 -3
  22. data/tracks/go/exercises/bob/example.go +3 -0
  23. data/tracks/go/exercises/book-store/cases_test.go +7 -2
  24. data/tracks/go/exercises/word-count/cases_test.go +6 -1
  25. data/tracks/groovy/exercises/linked-list/README.md +1 -1
  26. data/tracks/haskell/.travis.yml +1 -0
  27. data/tracks/haskell/bin/ensure-readmes-are-updated.sh +40 -0
  28. data/tracks/haskell/config.json +9 -0
  29. data/tracks/haskell/exercises/rail-fence-cipher/README.md +119 -0
  30. data/tracks/haskell/exercises/rail-fence-cipher/examples/success-standard/package.yaml +16 -0
  31. data/tracks/haskell/exercises/rail-fence-cipher/examples/success-standard/src/RailFenceCipher.hs +12 -0
  32. data/tracks/haskell/exercises/rail-fence-cipher/package.yaml +20 -0
  33. data/tracks/haskell/exercises/rail-fence-cipher/src/RailFenceCipher.hs +7 -0
  34. data/tracks/haskell/exercises/rail-fence-cipher/stack.yaml +1 -0
  35. data/tracks/haskell/exercises/rail-fence-cipher/test/Tests.hs +60 -0
  36. data/tracks/java/CONTRIBUTING.md +14 -5
  37. data/tracks/java/bin/run-journey-test-from-ci.sh +1 -1
  38. data/tracks/java/config.json +13 -0
  39. data/tracks/java/exercises/custom-set/.meta/src/reference/java/CustomSet.java +12 -12
  40. data/tracks/java/exercises/food-chain/.meta/src/reference/java/FoodChain.java +3 -3
  41. data/tracks/java/exercises/grade-school/.meta/src/reference/java/School.java +7 -7
  42. data/tracks/java/exercises/hamming/.meta/src/reference/java/Hamming.java +3 -3
  43. data/tracks/java/exercises/hexadecimal/.meta/src/reference/java/Hexadecimal.java +2 -4
  44. data/tracks/java/exercises/isogram/.meta/src/reference/java/IsogramChecker.java +2 -2
  45. data/tracks/java/exercises/largest-series-product/.meta/src/reference/java/LargestSeriesProductCalculator.java +3 -3
  46. data/tracks/java/exercises/linked-list/.meta/src/reference/java/DoublyLinkedList.java +6 -6
  47. data/tracks/java/exercises/markdown/.meta/src/reference/java/Markdown.java +96 -0
  48. data/tracks/java/exercises/markdown/.meta/version +1 -0
  49. data/tracks/java/exercises/markdown/README.md +30 -0
  50. data/tracks/java/exercises/markdown/build.gradle +18 -0
  51. data/tracks/java/exercises/markdown/src/main/java/Markdown.java +83 -0
  52. data/tracks/java/exercises/markdown/src/test/java/MarkdownTest.java +95 -0
  53. data/tracks/java/exercises/settings.gradle +1 -0
  54. data/tracks/javascript/exercises/alphametics/example.js +13 -9
  55. data/tracks/kotlin/docs/TESTS.md +14 -11
  56. data/tracks/ocaml/exercises/bob/example.ml +5 -3
  57. data/tracks/ocaml/exercises/bob/test.ml +3 -4
  58. data/tracks/ocaml/exercises/word-count/test.ml +3 -0
  59. data/tracks/ocaml/tools/test-generator/templates/ocaml/bob/test.ml +0 -1
  60. data/tracks/perl6/config.json +16 -6
  61. data/tracks/perl6/exercises/bob/Bob.pm6 +1 -1
  62. data/tracks/perl6/exercises/bob/Example.pm6 +11 -7
  63. data/tracks/perl6/exercises/bob/README.md +2 -0
  64. data/tracks/perl6/exercises/bob/bob.t +3 -3
  65. data/tracks/perl6/exercises/bob/example.yaml +11 -7
  66. data/tracks/perl6/exercises/clock/clock.t +17 -17
  67. data/tracks/perl6/exercises/clock/example.yaml +17 -17
  68. data/tracks/perl6/exercises/roman-numerals/Example.pm6 +17 -0
  69. data/tracks/perl6/exercises/roman-numerals/RomanNumerals.pm6 +4 -0
  70. data/tracks/perl6/exercises/roman-numerals/example.yaml +30 -0
  71. data/tracks/perl6/exercises/roman-numerals/roman-numerals.t +162 -0
  72. data/tracks/python/exercises/book-store/book_store_test.py +7 -1
  73. data/tracks/ruby/config.json +11 -0
  74. data/tracks/ruby/exercises/isbn-verifier/.meta/.version +1 -0
  75. data/tracks/ruby/exercises/isbn-verifier/.meta/generator/isbn_verifier_case.rb +28 -0
  76. data/tracks/ruby/exercises/isbn-verifier/.meta/solutions/isbn_verifier.rb +25 -0
  77. data/tracks/ruby/exercises/isbn-verifier/README.md +73 -0
  78. data/tracks/ruby/exercises/isbn-verifier/isbn_verifier_test.rb +105 -0
  79. data/tracks/ruby/exercises/isogram/.meta/generator/isogram_case.rb +3 -3
  80. data/tracks/ruby/exercises/isogram/isogram_test.rb +18 -18
  81. data/tracks/rust/README.md +0 -2
  82. data/tracks/rust/config.json +11 -0
  83. data/tracks/rust/exercises/diffie-hellman/tests/diffie-hellman.rs +0 -1
  84. data/tracks/rust/exercises/parallel-letter-frequency/HINTS.md +2 -2
  85. data/tracks/rust/exercises/parallel-letter-frequency/README.md +2 -2
  86. data/tracks/rust/exercises/rna-transcription/example.rs +10 -10
  87. data/tracks/rust/exercises/rna-transcription/tests/rna-transcription.rs +10 -10
  88. data/tracks/rust/exercises/series/.gitignore +3 -0
  89. data/tracks/rust/exercises/series/Cargo.toml +5 -0
  90. data/tracks/rust/exercises/series/README.md +60 -0
  91. data/tracks/rust/exercises/series/example.rs +13 -0
  92. data/tracks/rust/exercises/series/src/lib.rs +3 -0
  93. data/tracks/rust/exercises/series/tests/series.rs +34 -0
  94. data/tracks/sml/exercises/nth-prime/README.md +1 -1
  95. data/tracks/vimscript/.travis.yml +3 -0
  96. data/tracks/vimscript/docs/LEARNING.md +1 -1
  97. 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: 65756b1 bob: Fix canonical-data.json formatting
5
- // Problem Specifications Version: 1.0.0
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
- "Whoa, chill out!",
55
+ "Calm down, I know what I'm doing!",
56
56
  },
57
57
  {
58
58
  "shouting numbers",
@@ -8,6 +8,9 @@ func Hey(remark string) string {
8
8
  case silent(remark):
9
9
  return "Fine. Be that way!"
10
10
  case yelling(remark):
11
+ if asking(remark) {
12
+ return "Calm down, I know what I'm doing!"
13
+ }
11
14
  return "Whoa, chill out!"
12
15
  case asking(remark):
13
16
  return "Sure."
@@ -1,8 +1,8 @@
1
1
  package bookstore
2
2
 
3
3
  // Source: exercism/problem-specifications
4
- // Commit: 087ad69 book-store: Add missing trailing zero
5
- // Problem Specifications Version: 1.0.1
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: cd26d49 word-count: Make exercise schema-compliant (#634)
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
  }
@@ -35,7 +35,7 @@ For installation and learning resources, refer to the
35
35
  You can run all the tests for an exercise by entering
36
36
 
37
37
  ```
38
- $ groovy ./LinkedListSpec.groovy
38
+ $ groovy ./DoubleLinkedListSpec.groovy
39
39
  ```
40
40
 
41
41
  in your terminal.
@@ -32,6 +32,7 @@ install:
32
32
  - stack --resolver ${RESOLVER} --install-ghc install hlint
33
33
 
34
34
  script:
35
+ - "sh ./bin/ensure-readmes-are-updated.sh"
35
36
  - |
36
37
  set -e
37
38
 
@@ -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
@@ -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.
@@ -0,0 +1,16 @@
1
+ name: rail-fence-cipher
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: RailFenceCipher
8
+ source-dirs: src
9
+
10
+ tests:
11
+ test:
12
+ main: Tests.hs
13
+ source-dirs: test
14
+ dependencies:
15
+ - rail-fence-cipher
16
+ - hspec
@@ -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,7 @@
1
+ module RailFenceCipher (encode, decode) where
2
+
3
+ encode :: Int -> String -> String
4
+ encode = error "You need to implement this function!"
5
+
6
+ decode :: Int -> String -> String
7
+ decode = error "You need to implement this function!"
@@ -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
+ ]
@@ -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
- 1. 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
+ * 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
- 2. Please add an entry for your exercise to `settings.gradle`.
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
- 3. Please add an exercise submodule for your exercise.
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
- 4. Check if there is canonical data for the exercise you're adding.
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.