trackler 2.2.1.105 → 2.2.1.106

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.
Files changed (558) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/.travis.yml +1 -41
  4. data/problem-specifications/exercises/bowling/canonical-data.json +17 -1
  5. data/problem-specifications/exercises/circular-buffer/canonical-data.json +317 -278
  6. data/problem-specifications/exercises/forth/canonical-data.json +155 -67
  7. data/problem-specifications/exercises/grains/canonical-data.json +32 -11
  8. data/problem-specifications/exercises/grep/canonical-data.json +106 -64
  9. data/problem-specifications/exercises/house/canonical-data.json +57 -29
  10. data/problem-specifications/exercises/isogram/canonical-data.json +28 -10
  11. data/problem-specifications/exercises/list-ops/canonical-data.json +77 -39
  12. data/problem-specifications/exercises/pov/canonical-data.json +386 -355
  13. data/problem-specifications/exercises/trinary/canonical-data.json +34 -12
  14. data/problem-specifications/exercises/two-bucket/description.md +1 -1
  15. data/problem-specifications/exercises/word-search/canonical-data.json +309 -269
  16. data/problem-specifications/exercises/zipper/canonical-data.json +337 -311
  17. data/tracks/bash/docs/ABOUT.md +22 -2
  18. data/tracks/c/exercises/bob/README.md +2 -0
  19. data/tracks/c/exercises/bob/src/example.c +4 -2
  20. data/tracks/c/exercises/bob/test/test_bob.c +82 -12
  21. data/tracks/c/exercises/palindrome-products/src/example.c +100 -27
  22. data/tracks/c/exercises/palindrome-products/src/example.h +19 -4
  23. data/tracks/c/exercises/palindrome-products/test/test_palindrome_products.c +178 -10
  24. data/tracks/common-lisp/exercises/bob/README.md +2 -0
  25. data/tracks/common-lisp/exercises/bob/bob-test.lisp +45 -8
  26. data/tracks/common-lisp/exercises/bob/example.lisp +11 -7
  27. data/tracks/cpp/docs/INSTALLATION.md +1 -1
  28. data/tracks/cpp/exercises/leap/leap_test.cpp +1 -1
  29. data/tracks/elixir/exercises/pig-latin/example.exs +1 -2
  30. data/tracks/elixir/exercises/pig-latin/pig_latin_test.exs +13 -4
  31. data/tracks/elm/config.json +4 -4
  32. data/tracks/elm/exercises/bob/Bob.example.elm +3 -1
  33. data/tracks/elm/exercises/bob/README.md +2 -0
  34. data/tracks/elm/exercises/bob/tests/Tests.elm +1 -1
  35. data/tracks/elm/exercises/phone-number/PhoneNumber.example.elm +33 -18
  36. data/tracks/elm/exercises/phone-number/tests/Tests.elm +40 -19
  37. data/tracks/elm/exercises/space-age/tests/Tests.elm +8 -8
  38. data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +2 -2
  39. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fs +3 -7
  40. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTreeTest.fs +63 -37
  41. data/tracks/fsharp/exercises/binary-search-tree/Example.fs +5 -5
  42. data/tracks/fsharp/exercises/circular-buffer/CircularBufferTest.fs +0 -13
  43. data/tracks/fsharp/exercises/complex-numbers/ComplexNumbersTest.fs +7 -1
  44. data/tracks/fsharp/exercises/react/ReactTest.fs +0 -12
  45. data/tracks/fsharp/exercises/scale-generator/Example.fs +11 -7
  46. data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fs +1 -1
  47. data/tracks/fsharp/exercises/scale-generator/ScaleGeneratorTest.fs +34 -49
  48. data/tracks/fsharp/generators/Common.fs +1 -1
  49. data/tracks/fsharp/generators/Exercise.fs +3 -2
  50. data/tracks/fsharp/generators/Generators.fs +95 -29
  51. data/tracks/fsharp/generators/Templates/_TestFunction.liquid +1 -1
  52. data/tracks/fsharp/generators/Templates/_TestFunctionBody.liquid +3 -1
  53. data/tracks/fsharp/generators/Templates/_TestMember.liquid +1 -1
  54. data/tracks/fsharp/generators/Templates/_TestMemberBody.liquid +3 -1
  55. data/tracks/go/exercises/simple-linked-list/linked_list_test.go +17 -13
  56. data/tracks/haskell/config.json +10 -0
  57. data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
  58. data/tracks/haskell/exercises/all-your-base/test/Tests.hs +1 -1
  59. data/tracks/haskell/exercises/bowling/package.yaml +1 -1
  60. data/tracks/haskell/exercises/bowling/test/Tests.hs +8 -0
  61. data/tracks/haskell/exercises/complex-numbers/package.yaml +1 -1
  62. data/tracks/haskell/exercises/diamond/examples/success-standard/src/Diamond.hs +2 -2
  63. data/tracks/haskell/exercises/diamond/package.yaml +1 -1
  64. data/tracks/haskell/exercises/diamond/src/Diamond.hs +1 -1
  65. data/tracks/haskell/exercises/diamond/test/Tests.hs +1 -1
  66. data/tracks/haskell/exercises/forth/package.yaml +1 -1
  67. data/tracks/haskell/exercises/grains/package.yaml +1 -1
  68. data/tracks/haskell/exercises/isogram/package.yaml +1 -1
  69. data/tracks/haskell/exercises/list-ops/package.yaml +1 -1
  70. data/tracks/haskell/exercises/list-ops/test/Tests.hs +81 -76
  71. data/tracks/haskell/exercises/pov/package.yaml +1 -1
  72. data/tracks/haskell/exercises/protein-translation/README.md +102 -0
  73. data/tracks/haskell/exercises/protein-translation/examples/success-standard/package.yaml +17 -0
  74. data/tracks/haskell/exercises/protein-translation/examples/success-standard/src/ProteinTranslation.hs +24 -0
  75. data/tracks/haskell/exercises/protein-translation/package.yaml +20 -0
  76. data/tracks/haskell/exercises/protein-translation/src/ProteinTranslation.hs +4 -0
  77. data/tracks/haskell/exercises/protein-translation/stack.yaml +1 -0
  78. data/tracks/haskell/exercises/protein-translation/test/Tests.hs +119 -0
  79. data/tracks/haskell/exercises/zipper/package.yaml +1 -1
  80. data/tracks/java/.github/PULL_REQUEST_TEMPLATE.md +1 -1
  81. data/tracks/java/config.json +13 -0
  82. data/tracks/java/exercises/atbash-cipher/src/test/java/AtbashTest.java +78 -62
  83. data/tracks/java/exercises/binary/.meta/version +1 -0
  84. data/tracks/java/exercises/binary/src/test/java/BinaryTest.java +97 -32
  85. data/tracks/java/exercises/bracket-push/.meta/version +1 -1
  86. data/tracks/java/exercises/isbn-verifier/.meta/version +1 -1
  87. data/tracks/java/exercises/isbn-verifier/src/test/java/IsbnVerifierTest.java +6 -0
  88. data/tracks/java/exercises/matrix/.meta/src/reference/java/Matrix.java +0 -8
  89. data/tracks/java/exercises/matrix/.meta/version +2 -0
  90. data/tracks/java/exercises/matrix/src/test/java/MatrixTest.java +95 -193
  91. data/tracks/java/exercises/octal/src/test/java/OctalTest.java +81 -32
  92. data/tracks/java/exercises/pascals-triangle/.meta/version +1 -1
  93. data/tracks/java/exercises/phone-number/.meta/version +1 -1
  94. data/tracks/java/exercises/pig-latin/.meta/version +1 -1
  95. data/tracks/java/exercises/pig-latin/src/test/java/PigLatinTranslatorTest.java +116 -55
  96. data/tracks/java/exercises/prime-factors/src/test/java/PrimeFactorsCalculatorTest.java +42 -24
  97. data/tracks/java/exercises/raindrops/.meta/version +1 -1
  98. data/tracks/java/exercises/raindrops/src/test/java/RaindropConverterTest.java +97 -41
  99. data/tracks/java/exercises/reverse-string/.meta/version +1 -1
  100. data/tracks/java/exercises/roman-numerals/src/test/java/RomanNumeralsTest.java +118 -37
  101. data/tracks/java/exercises/run-length-encoding/.meta/version +1 -0
  102. data/tracks/java/exercises/scrabble-score/src/test/java/ScrabbleScoreTest.java +71 -29
  103. data/tracks/java/exercises/settings.gradle +1 -0
  104. data/tracks/java/exercises/two-bucket/.meta/src/reference/java/TwoBucket.java +145 -0
  105. data/tracks/java/exercises/two-bucket/.meta/version +1 -0
  106. data/tracks/java/exercises/two-bucket/README.md +48 -0
  107. data/tracks/java/exercises/two-bucket/build.gradle +18 -0
  108. data/{problem-specifications/exercises/circular-buffer/USE_OLD_SCHEMA → tracks/java/exercises/two-bucket/src/main/java/.keep} +0 -0
  109. data/tracks/java/exercises/two-bucket/src/test/java/TwoBucketTest.java +77 -0
  110. data/tracks/javascript/.eslintignore +0 -9
  111. data/tracks/javascript/exercises/binary-search/example.js +1 -1
  112. data/tracks/javascript/exercises/binary-search-tree/example.js +2 -2
  113. data/tracks/javascript/exercises/bracket-push/example.js +1 -1
  114. data/tracks/javascript/exercises/leap/example.js +7 -3
  115. data/tracks/javascript/exercises/leap/leap.js +2 -2
  116. data/tracks/javascript/exercises/list-ops/example.js +1 -1
  117. data/tracks/javascript/exercises/luhn/example.js +2 -2
  118. data/tracks/javascript/exercises/pythagorean-triplet/example.js +2 -1
  119. data/tracks/javascript/exercises/roman-numerals/example.js +3 -2
  120. data/tracks/julia/config.json +13 -0
  121. data/tracks/julia/exercises/isbn-verifier/README.md +51 -0
  122. data/tracks/julia/exercises/isbn-verifier/example.jl +26 -0
  123. data/{problem-specifications/exercises/forth/USE_OLD_SCHEMA → tracks/julia/exercises/isbn-verifier/isbn-verifier.jl} +0 -0
  124. data/tracks/julia/exercises/isbn-verifier/runtests.jl +73 -0
  125. data/tracks/perl5/.travis.yml +8 -1
  126. data/tracks/perl5/README.md +9 -11
  127. data/tracks/perl5/bin/exercise-gen.pl +14 -29
  128. data/tracks/perl5/config.json +1 -0
  129. data/tracks/perl5/cpanfile +2 -1
  130. data/tracks/perl5/exercises/accumulate/{Example.pm → .meta/solutions/Accumulate.pm} +1 -1
  131. data/tracks/perl5/exercises/accumulate/.meta/solutions/accumulate.t +1 -0
  132. data/tracks/perl5/exercises/accumulate/accumulate.t +1 -1
  133. data/tracks/perl5/exercises/all-your-base/{Example.pm → .meta/solutions/AllYourBase.pm} +1 -1
  134. data/tracks/perl5/exercises/all-your-base/.meta/solutions/all-your-base.t +1 -0
  135. data/tracks/perl5/exercises/all-your-base/all-your-base.t +1 -1
  136. data/tracks/perl5/exercises/allergies/{Example.pm → .meta/solutions/Allergies.pm} +1 -1
  137. data/tracks/perl5/exercises/allergies/.meta/solutions/allergies.t +1 -0
  138. data/tracks/perl5/exercises/allergies/allergies.t +75 -8
  139. data/tracks/perl5/exercises/anagram/{Example.pm → .meta/solutions/Anagram.pm} +1 -1
  140. data/tracks/perl5/exercises/anagram/.meta/solutions/anagram.t +1 -0
  141. data/tracks/perl5/exercises/anagram/anagram.t +61 -8
  142. data/tracks/perl5/exercises/atbash-cipher/{Example.pm → .meta/solutions/Cipher.pm} +1 -1
  143. data/tracks/perl5/exercises/atbash-cipher/.meta/solutions/cipher.t +1 -0
  144. data/tracks/perl5/exercises/atbash-cipher/cipher.t +81 -8
  145. data/tracks/perl5/exercises/beer-song/{Example.pm → .meta/solutions/Beer.pm} +1 -1
  146. data/tracks/perl5/exercises/beer-song/.meta/solutions/beer.t +1 -0
  147. data/tracks/perl5/exercises/beer-song/beer.t +80 -7
  148. data/tracks/perl5/exercises/binary/{Example.pm → .meta/solutions/Binary.pm} +1 -1
  149. data/tracks/perl5/exercises/binary/.meta/solutions/binary.t +1 -0
  150. data/tracks/perl5/exercises/binary/binary.t +1 -1
  151. data/tracks/perl5/exercises/binary-search/{Example.pm → .meta/solutions/BinarySearch.pm} +1 -1
  152. data/tracks/perl5/exercises/binary-search/.meta/solutions/binary-search.t +1 -0
  153. data/tracks/perl5/exercises/binary-search/binary-search.t +1 -1
  154. data/tracks/perl5/exercises/binary-search-tree/{Example.pm → .meta/solutions/BinarySearchTree.pm} +1 -1
  155. data/tracks/perl5/exercises/binary-search-tree/.meta/solutions/binary_search_tree.t +1 -0
  156. data/tracks/perl5/exercises/binary-search-tree/binary_search_tree.t +1 -1
  157. data/tracks/perl5/exercises/bob/{example.yaml → .meta/exercise-data.yaml} +0 -1
  158. data/tracks/perl5/exercises/bob/{Example.pm → .meta/solutions/Bob.pm} +0 -0
  159. data/tracks/perl5/exercises/bob/.meta/solutions/bob.t +1 -0
  160. data/tracks/perl5/exercises/bob/bob.t +1 -2
  161. data/tracks/perl5/exercises/clock/{Example.pm → .meta/solutions/Clock.pm} +2 -2
  162. data/tracks/perl5/exercises/clock/.meta/solutions/clock.t +1 -0
  163. data/tracks/perl5/exercises/clock/clock.t +1 -1
  164. data/tracks/perl5/exercises/crypto-square/{Example.pm → .meta/solutions/Crypto.pm} +1 -1
  165. data/tracks/perl5/exercises/crypto-square/.meta/solutions/crypto.t +1 -0
  166. data/tracks/perl5/exercises/crypto-square/crypto.t +1 -1
  167. data/tracks/perl5/exercises/custom-set/{Example.pm → .meta/solutions/CustomSet.pm} +1 -1
  168. data/tracks/perl5/exercises/custom-set/.meta/solutions/custom-set.t +1 -0
  169. data/tracks/perl5/exercises/custom-set/custom-set.t +1 -1
  170. data/tracks/perl5/exercises/difference-of-squares/{Example.pm → .meta/solutions/Squares.pm} +1 -1
  171. data/tracks/perl5/exercises/difference-of-squares/.meta/solutions/difference_of_squares.t +1 -0
  172. data/tracks/perl5/exercises/difference-of-squares/difference_of_squares.t +1 -1
  173. data/tracks/perl5/exercises/etl/{Example.pm → .meta/solutions/ETL.pm} +1 -1
  174. data/tracks/perl5/exercises/etl/.meta/solutions/etl.t +1 -0
  175. data/tracks/perl5/exercises/etl/etl.t +1 -1
  176. data/tracks/perl5/exercises/food-chain/{Example.pm → .meta/solutions/FoodChainSong.pm} +1 -1
  177. data/tracks/perl5/exercises/food-chain/.meta/solutions/food_chain.t +1 -0
  178. data/tracks/perl5/exercises/food-chain/food_chain.t +1 -1
  179. data/tracks/perl5/exercises/gigasecond/{Example.pm → .meta/solutions/Gigasecond.pm} +1 -1
  180. data/tracks/perl5/exercises/gigasecond/.meta/solutions/gigasecond.t +1 -0
  181. data/tracks/perl5/exercises/gigasecond/gigasecond.t +1 -1
  182. data/tracks/perl5/exercises/grade-school/{Example.pm → .meta/solutions/GradeSchool.pm} +1 -1
  183. data/tracks/perl5/exercises/grade-school/.meta/solutions/grade_school.t +1 -0
  184. data/tracks/perl5/exercises/grade-school/grade_school.t +1 -1
  185. data/tracks/perl5/exercises/grains/{Example.pm → .meta/solutions/Grains.pm} +1 -1
  186. data/tracks/perl5/exercises/grains/.meta/solutions/grains.t +1 -0
  187. data/tracks/perl5/exercises/grains/grains.t +54 -6
  188. data/tracks/perl5/exercises/hamming/{Example.pm → .meta/solutions/Hamming.pm} +1 -1
  189. data/tracks/perl5/exercises/hamming/.meta/solutions/hamming.t +1 -0
  190. data/tracks/perl5/exercises/hamming/hamming.t +1 -1
  191. data/tracks/perl5/exercises/hello-world/{example.yaml → .meta/exercise-data.yaml} +0 -1
  192. data/tracks/perl5/exercises/hello-world/{Example.pm → .meta/solutions/HelloWorld.pm} +0 -0
  193. data/tracks/perl5/exercises/hello-world/.meta/solutions/hello-world.t +1 -0
  194. data/tracks/perl5/exercises/hello-world/hello-world.t +1 -2
  195. data/tracks/perl5/exercises/hexadecimal/{Example.pm → .meta/solutions/Hexadecimal.pm} +1 -1
  196. data/tracks/perl5/exercises/hexadecimal/.meta/solutions/hexadecimal.t +1 -0
  197. data/tracks/perl5/exercises/hexadecimal/hexadecimal.t +1 -1
  198. data/tracks/perl5/exercises/house/{Example.pm → .meta/solutions/House.pm} +1 -1
  199. data/tracks/perl5/exercises/house/.meta/solutions/house.t +1 -0
  200. data/tracks/perl5/exercises/house/house.t +1 -1
  201. data/tracks/perl5/exercises/kindergarten-garden/{Example.pm → .meta/solutions/Kindergarten.pm} +1 -1
  202. data/tracks/perl5/exercises/kindergarten-garden/.meta/solutions/kindergarten.t +1 -0
  203. data/tracks/perl5/exercises/kindergarten-garden/kindergarten.t +1 -1
  204. data/tracks/perl5/exercises/largest-series-product/{Example.pm → .meta/solutions/Series.pm} +1 -1
  205. data/tracks/perl5/exercises/largest-series-product/.meta/solutions/series_product.t +1 -0
  206. data/tracks/perl5/exercises/largest-series-product/series_product.t +1 -1
  207. data/tracks/perl5/exercises/leap/{example.yaml → .meta/exercise-data.yaml} +0 -1
  208. data/tracks/perl5/exercises/leap/{Example.pm → .meta/solutions/Leap.pm} +0 -0
  209. data/tracks/perl5/exercises/leap/.meta/solutions/leap.t +1 -0
  210. data/tracks/perl5/exercises/leap/leap.t +1 -2
  211. data/tracks/perl5/exercises/linked-list/{Example.pm → .meta/solutions/Deque.pm} +1 -1
  212. data/tracks/perl5/exercises/linked-list/.meta/solutions/deque.t +1 -0
  213. data/tracks/perl5/exercises/linked-list/deque.t +60 -7
  214. data/tracks/perl5/exercises/list-ops/{Example.pm → .meta/solutions/ListOps.pm} +1 -1
  215. data/tracks/perl5/exercises/list-ops/.meta/solutions/list-ops.t +1 -0
  216. data/tracks/perl5/exercises/list-ops/list-ops.t +1 -1
  217. data/tracks/perl5/exercises/luhn/{example.yaml → .meta/exercise-data.yaml} +0 -0
  218. data/tracks/perl5/exercises/luhn/{Example.pm → .meta/solutions/Luhn.pm} +0 -0
  219. data/tracks/perl5/exercises/luhn/.meta/solutions/luhn.t +1 -0
  220. data/tracks/perl5/exercises/luhn/luhn.t +1 -2
  221. data/tracks/perl5/exercises/matrix/{Example.pm → .meta/solutions/Matrix.pm} +1 -1
  222. data/tracks/perl5/exercises/matrix/.meta/solutions/matrix.t +1 -0
  223. data/tracks/perl5/exercises/matrix/matrix.t +1 -1
  224. data/tracks/perl5/exercises/meetup/{Example.pm → .meta/solutions/Meetup.pm} +1 -1
  225. data/tracks/perl5/exercises/meetup/.meta/solutions/meetup.t +1 -0
  226. data/tracks/perl5/exercises/meetup/meetup.t +1 -1
  227. data/tracks/perl5/exercises/minesweeper/{Example.pm → .meta/solutions/Minesweeper.pm} +1 -1
  228. data/tracks/perl5/exercises/minesweeper/.meta/solutions/minesweeper.t +1 -0
  229. data/tracks/perl5/exercises/minesweeper/minesweeper.t +1 -1
  230. data/tracks/perl5/exercises/nucleotide-count/{Example.pm → .meta/solutions/NucleotideCount.pm} +1 -1
  231. data/tracks/perl5/exercises/nucleotide-count/.meta/solutions/nucleotide_count.t +1 -0
  232. data/tracks/perl5/exercises/nucleotide-count/nucleotide_count.t +1 -1
  233. data/tracks/perl5/exercises/ocr-numbers/{Example.pm → .meta/solutions/OCR.pm} +1 -1
  234. data/tracks/perl5/exercises/ocr-numbers/.meta/solutions/ocr.t +1 -0
  235. data/tracks/perl5/exercises/ocr-numbers/ocr.t +1 -1
  236. data/tracks/perl5/exercises/palindrome-products/{Example.pm → .meta/solutions/Palindrome.pm} +1 -1
  237. data/tracks/perl5/exercises/palindrome-products/.meta/solutions/palindrome.t +1 -0
  238. data/tracks/perl5/exercises/palindrome-products/palindrome.t +1 -1
  239. data/tracks/perl5/exercises/pascals-triangle/{Example.pm → .meta/solutions/Triangle.pm} +1 -1
  240. data/tracks/perl5/exercises/pascals-triangle/.meta/solutions/triangle.t +1 -0
  241. data/tracks/perl5/exercises/pascals-triangle/triangle.t +51 -7
  242. data/tracks/perl5/exercises/phone-number/{example.yaml → .meta/exercise-data.yaml} +0 -0
  243. data/tracks/perl5/exercises/phone-number/{Example.pm → .meta/solutions/PhoneNumber.pm} +0 -0
  244. data/tracks/perl5/exercises/phone-number/.meta/solutions/phone-number.t +1 -0
  245. data/tracks/perl5/exercises/phone-number/phone-number.t +1 -2
  246. data/tracks/perl5/exercises/pig-latin/{Example.pm → .meta/solutions/PigLatin.pm} +1 -1
  247. data/tracks/perl5/exercises/pig-latin/.meta/solutions/piglatin.t +1 -0
  248. data/tracks/perl5/exercises/pig-latin/piglatin.t +1 -1
  249. data/tracks/perl5/exercises/point-mutations/{Example.pm → .meta/solutions/DNA.pm} +1 -1
  250. data/tracks/perl5/exercises/point-mutations/.meta/solutions/dna.t +1 -0
  251. data/tracks/perl5/exercises/point-mutations/dna.t +75 -7
  252. data/tracks/perl5/exercises/prime-factors/{Example.pm → .meta/solutions/Prime.pm} +1 -1
  253. data/tracks/perl5/exercises/prime-factors/.meta/solutions/prime.t +1 -0
  254. data/tracks/perl5/exercises/prime-factors/prime.t +63 -7
  255. data/tracks/perl5/exercises/proverb/{Example.pm → .meta/solutions/Proverb.pm} +1 -1
  256. data/tracks/perl5/exercises/proverb/.meta/solutions/proverb.t +1 -0
  257. data/tracks/perl5/exercises/proverb/proverb.t +58 -7
  258. data/tracks/perl5/exercises/pythagorean-triplet/{Example.pm → .meta/solutions/Triplet.pm} +2 -2
  259. data/tracks/perl5/exercises/pythagorean-triplet/.meta/solutions/triplet.t +1 -0
  260. data/tracks/perl5/exercises/pythagorean-triplet/triplet.t +1 -1
  261. data/tracks/perl5/exercises/queen-attack/{Example.pm → .meta/solutions/Queens.pm} +1 -1
  262. data/tracks/perl5/exercises/queen-attack/.meta/solutions/queen.t +1 -0
  263. data/tracks/perl5/exercises/queen-attack/queen.t +186 -8
  264. data/tracks/perl5/exercises/raindrops/{Example.pm → .meta/solutions/Raindrops.pm} +1 -1
  265. data/tracks/perl5/exercises/raindrops/.meta/solutions/raindrops.t +1 -0
  266. data/tracks/perl5/exercises/raindrops/raindrops.t +89 -7
  267. data/tracks/perl5/exercises/rna-transcription/{Example.pm → .meta/solutions/DNA.pm} +1 -1
  268. data/tracks/perl5/exercises/rna-transcription/.meta/solutions/rna.t +1 -0
  269. data/tracks/perl5/exercises/rna-transcription/rna.t +1 -1
  270. data/tracks/perl5/exercises/robot-name/{Example.pm → .meta/solutions/RobotName.pm} +1 -1
  271. data/tracks/perl5/exercises/robot-name/.meta/solutions/robot_name.t +1 -0
  272. data/tracks/perl5/exercises/robot-name/robot_name.t +1 -1
  273. data/tracks/perl5/exercises/robot-simulator/{Example.pm → .meta/solutions/Robot.pm} +1 -1
  274. data/tracks/perl5/exercises/robot-simulator/.meta/solutions/robot_simulator.t +1 -0
  275. data/tracks/perl5/exercises/robot-simulator/robot_simulator.t +1 -1
  276. data/tracks/perl5/exercises/roman-numerals/{Example.pm → .meta/solutions/Decimal.pm} +1 -1
  277. data/tracks/perl5/exercises/roman-numerals/.meta/solutions/roman.t +1 -0
  278. data/tracks/perl5/exercises/roman-numerals/roman.t +1 -1
  279. data/tracks/perl5/exercises/saddle-points/{Example.pm → .meta/solutions/Matrix.pm} +1 -1
  280. data/tracks/perl5/exercises/saddle-points/.meta/solutions/saddle_points.t +1 -0
  281. data/tracks/perl5/exercises/saddle-points/saddle_points.t +1 -1
  282. data/tracks/perl5/exercises/say/{Example.pm → .meta/solutions/Say.pm} +1 -1
  283. data/tracks/perl5/exercises/say/.meta/solutions/say.t +1 -0
  284. data/tracks/perl5/exercises/say/say.t +1 -1
  285. data/tracks/perl5/exercises/scrabble-score/{Example.pm → .meta/solutions/Word.pm} +1 -1
  286. data/tracks/perl5/exercises/scrabble-score/.meta/solutions/scrabble.t +1 -0
  287. data/tracks/perl5/exercises/scrabble-score/scrabble.t +1 -1
  288. data/tracks/perl5/exercises/secret-handshake/{Example.pm → .meta/solutions/SecretHandshake.pm} +1 -1
  289. data/tracks/perl5/exercises/secret-handshake/.meta/solutions/handshake.t +1 -0
  290. data/tracks/perl5/exercises/secret-handshake/handshake.t +1 -1
  291. data/tracks/perl5/exercises/series/{Example.pm → .meta/solutions/Series.pm} +1 -1
  292. data/tracks/perl5/exercises/series/.meta/solutions/series.t +1 -0
  293. data/tracks/perl5/exercises/series/series.t +1 -1
  294. data/tracks/perl5/exercises/sieve/{Example.pm → .meta/solutions/Sieve.pm} +1 -1
  295. data/tracks/perl5/exercises/sieve/.meta/solutions/sieve.t +1 -0
  296. data/tracks/perl5/exercises/sieve/sieve.t +1 -1
  297. data/tracks/perl5/exercises/simple-cipher/{Example.pm → .meta/solutions/Cipher.pm} +1 -1
  298. data/tracks/perl5/exercises/simple-cipher/.meta/solutions/cipher.t +1 -0
  299. data/tracks/perl5/exercises/simple-cipher/cipher.t +1 -1
  300. data/tracks/perl5/exercises/simple-linked-list/{Example.pm → .meta/solutions/LinkedList.pm} +1 -1
  301. data/tracks/perl5/exercises/simple-linked-list/.meta/solutions/simple_linked_list.t +1 -0
  302. data/tracks/perl5/exercises/simple-linked-list/simple_linked_list.t +1 -1
  303. data/tracks/perl5/exercises/space-age/{Example.pm → .meta/solutions/SpaceAge.pm} +1 -1
  304. data/tracks/perl5/exercises/space-age/.meta/solutions/space.t +1 -0
  305. data/tracks/perl5/exercises/space-age/space.t +1 -1
  306. data/tracks/perl5/exercises/strain/{Example.pm → .meta/solutions/Strain.pm} +1 -1
  307. data/tracks/perl5/exercises/strain/.meta/solutions/strain.t +1 -0
  308. data/tracks/perl5/exercises/strain/strain.t +1 -1
  309. data/tracks/perl5/exercises/sublist/{Example.pm → .meta/solutions/Sublist.pm} +1 -1
  310. data/tracks/perl5/exercises/sublist/.meta/solutions/sublist.t +1 -0
  311. data/tracks/perl5/exercises/sublist/sublist.t +1 -1
  312. data/tracks/perl5/exercises/sum-of-multiples/{Example.pm → .meta/solutions/SumOfMultiples.pm} +1 -1
  313. data/tracks/perl5/exercises/sum-of-multiples/.meta/solutions/sum_of_multiples.t +1 -0
  314. data/tracks/perl5/exercises/sum-of-multiples/sum_of_multiples.t +1 -1
  315. data/tracks/perl5/exercises/triangle/{Example.pm → .meta/solutions/Triangle.pm} +1 -1
  316. data/tracks/perl5/exercises/triangle/.meta/solutions/triangle.t +1 -0
  317. data/tracks/perl5/exercises/triangle/triangle.t +87 -8
  318. data/tracks/perl5/exercises/trinary/{Example.pm → .meta/solutions/Trinary.pm} +1 -1
  319. data/tracks/perl5/exercises/trinary/.meta/solutions/trinary.t +1 -0
  320. data/tracks/perl5/exercises/trinary/trinary.t +1 -1
  321. data/tracks/perl5/exercises/twelve-days/{Example.pm → .meta/solutions/TwelveDays.pm} +1 -1
  322. data/tracks/perl5/exercises/twelve-days/.meta/solutions/song.t +1 -0
  323. data/tracks/perl5/exercises/twelve-days/song.t +1 -1
  324. data/tracks/perl5/exercises/word-count/{Example.pm → .meta/solutions/Phrase.pm} +1 -1
  325. data/tracks/perl5/exercises/word-count/.meta/solutions/word_count.t +1 -0
  326. data/tracks/perl5/exercises/word-count/word_count.t +1 -1
  327. data/tracks/perl5/exercises/wordy/{Example.pm → .meta/solutions/Wordy.pm} +1 -1
  328. data/tracks/perl5/exercises/wordy/.meta/solutions/wordy.t +1 -0
  329. data/tracks/perl5/exercises/wordy/wordy.t +87 -9
  330. data/tracks/perl5/lib/Exercism/Generator.pm +48 -0
  331. data/tracks/perl5/t/generated-tests.t +26 -0
  332. data/tracks/perl5/templates/test.mustache +4 -17
  333. data/tracks/perl6/.proverc +1 -0
  334. data/tracks/perl6/.travis.yml +6 -10
  335. data/tracks/perl6/README.md +1 -3
  336. data/tracks/perl6/bin/exercise-gen.pl6 +2 -0
  337. data/tracks/perl6/exercises/accumulate/.meta/solutions/accumulate.t +1 -0
  338. data/tracks/perl6/exercises/acronym/.meta/solutions/acronym.t +1 -0
  339. data/tracks/perl6/exercises/all-your-base/.meta/solutions/all-your-base.t +1 -0
  340. data/tracks/perl6/exercises/allergies/.meta/solutions/allergies.t +1 -0
  341. data/tracks/perl6/exercises/anagram/.meta/solutions/anagram.t +1 -0
  342. data/tracks/perl6/exercises/atbash-cipher/.meta/solutions/atbash-cipher.t +1 -0
  343. data/tracks/perl6/exercises/bob/.meta/solutions/bob.t +1 -0
  344. data/tracks/perl6/exercises/clock/.meta/solutions/clock.t +1 -0
  345. data/tracks/perl6/exercises/etl/.meta/solutions/etl.t +1 -0
  346. data/tracks/perl6/exercises/flatten-array/.meta/solutions/flatten-array.t +1 -0
  347. data/tracks/perl6/exercises/grade-school/.meta/solutions/grade-school.t +1 -0
  348. data/tracks/perl6/exercises/grains/.meta/solutions/grains.t +1 -0
  349. data/tracks/perl6/exercises/hamming/.meta/solutions/hamming.t +1 -0
  350. data/tracks/perl6/exercises/hello-world/.meta/solutions/hello-world.t +1 -0
  351. data/tracks/perl6/exercises/leap/.meta/solutions/leap.t +1 -0
  352. data/tracks/perl6/exercises/linked-list/.meta/solutions/linked-list.t +1 -0
  353. data/tracks/perl6/exercises/luhn/.meta/solutions/luhn.t +1 -0
  354. data/tracks/perl6/exercises/meetup/.meta/solutions/meetup.t +1 -0
  355. data/tracks/perl6/exercises/nucleotide-count/.meta/solutions/nucleotide-count.t +1 -0
  356. data/tracks/perl6/exercises/pangram/.meta/solutions/pangram.t +1 -0
  357. data/tracks/perl6/exercises/phone-number/.meta/solutions/phone-number.t +1 -0
  358. data/tracks/perl6/exercises/raindrops/.meta/solutions/raindrops.t +1 -0
  359. data/tracks/perl6/exercises/rna-transcription/.meta/solutions/rna-transcription.t +1 -0
  360. data/tracks/perl6/exercises/robot-name/.meta/solutions/robot-name.t +1 -0
  361. data/tracks/perl6/exercises/roman-numerals/.meta/solutions/roman-numerals.t +1 -0
  362. data/tracks/perl6/exercises/scrabble-score/.meta/solutions/scrabble-score.t +1 -0
  363. data/tracks/perl6/exercises/space-age/.meta/solutions/space-age.t +1 -0
  364. data/tracks/perl6/exercises/two-fer/.meta/solutions/two-fer.t +1 -0
  365. data/tracks/perl6/exercises/word-count/.meta/solutions/word-count.t +1 -0
  366. data/tracks/perl6/exercises/wordy/.meta/solutions/wordy.t +1 -0
  367. data/tracks/python/config/exercise_readme.go.tmpl +23 -4
  368. data/tracks/python/exercises/accumulate/README.md +2 -3
  369. data/tracks/python/exercises/acronym/README.md +2 -3
  370. data/tracks/python/exercises/acronym/acronym_test.py +2 -5
  371. data/tracks/python/exercises/all-your-base/README.md +2 -4
  372. data/tracks/python/exercises/allergies/README.md +2 -3
  373. data/tracks/python/exercises/allergies/allergies_test.py +1 -1
  374. data/tracks/python/exercises/alphametics/README.md +2 -4
  375. data/tracks/python/exercises/anagram/README.md +2 -3
  376. data/tracks/python/exercises/anagram/anagram_test.py +2 -16
  377. data/tracks/python/exercises/armstrong-numbers/README.md +16 -2
  378. data/tracks/python/exercises/atbash-cipher/README.md +2 -3
  379. data/tracks/python/exercises/atbash-cipher/atbash_cipher_test.py +1 -1
  380. data/tracks/python/exercises/beer-song/README.md +2 -3
  381. data/tracks/python/exercises/binary/README.md +2 -3
  382. data/tracks/python/exercises/binary-search/README.md +2 -3
  383. data/tracks/python/exercises/binary-search-tree/README.md +2 -3
  384. data/tracks/python/exercises/bob/README.md +4 -3
  385. data/tracks/python/exercises/book-store/README.md +2 -3
  386. data/tracks/python/exercises/bowling/README.md +2 -3
  387. data/tracks/python/exercises/bracket-push/README.md +2 -3
  388. data/tracks/python/exercises/change/README.md +2 -3
  389. data/tracks/python/exercises/circular-buffer/README.md +2 -3
  390. data/tracks/python/exercises/clock/README.md +2 -3
  391. data/tracks/python/exercises/collatz-conjecture/README.md +2 -3
  392. data/tracks/python/exercises/complex-numbers/README.md +3 -3
  393. data/tracks/python/exercises/connect/README.md +2 -4
  394. data/tracks/python/exercises/crypto-square/README.md +2 -3
  395. data/tracks/python/exercises/crypto-square/crypto_square_test.py +1 -1
  396. data/tracks/python/exercises/custom-set/README.md +17 -3
  397. data/tracks/python/exercises/diamond/README.md +2 -3
  398. data/tracks/python/exercises/difference-of-squares/README.md +2 -3
  399. data/tracks/python/exercises/difference-of-squares/difference_of_squares_test.py +1 -1
  400. data/tracks/python/exercises/diffie-hellman/README.md +2 -3
  401. data/tracks/python/exercises/dominoes/README.md +2 -4
  402. data/tracks/python/exercises/dot-dsl/README.md +20 -5
  403. data/tracks/python/exercises/error-handling/README.md +2 -4
  404. data/tracks/python/exercises/etl/README.md +2 -3
  405. data/tracks/python/exercises/flatten-array/README.md +2 -3
  406. data/tracks/python/exercises/flatten-array/flatten_array_test.py +1 -1
  407. data/tracks/python/exercises/food-chain/README.md +2 -3
  408. data/tracks/python/exercises/forth/README.md +2 -4
  409. data/tracks/python/exercises/gigasecond/README.md +2 -3
  410. data/tracks/python/exercises/gigasecond/gigasecond_test.py +1 -2
  411. data/tracks/python/exercises/go-counting/README.md +2 -4
  412. data/tracks/python/exercises/grade-school/README.md +2 -3
  413. data/tracks/python/exercises/grains/README.md +2 -3
  414. data/tracks/python/exercises/grep/README.md +2 -3
  415. data/tracks/python/exercises/hamming/README.md +2 -3
  416. data/tracks/python/exercises/hamming/hamming_test.py +1 -1
  417. data/tracks/python/exercises/hello-world/README.md +2 -3
  418. data/tracks/python/exercises/hello-world/hello_world_test.py +1 -1
  419. data/tracks/python/exercises/hexadecimal/README.md +2 -3
  420. data/tracks/python/exercises/house/README.md +2 -3
  421. data/tracks/python/exercises/isbn-verifier/README.md +48 -20
  422. data/tracks/python/exercises/isogram/README.md +2 -3
  423. data/tracks/python/exercises/kindergarten-garden/README.md +2 -3
  424. data/tracks/python/exercises/kindergarten-garden/kindergarten_garden_test.py +1 -1
  425. data/tracks/python/exercises/largest-series-product/README.md +2 -3
  426. data/tracks/python/exercises/largest-series-product/largest_series_product_test.py +1 -1
  427. data/tracks/python/exercises/leap/README.md +2 -3
  428. data/tracks/python/exercises/leap/leap_test.py +1 -1
  429. data/tracks/python/exercises/linked-list/README.md +2 -3
  430. data/tracks/python/exercises/list-ops/README.md +2 -4
  431. data/tracks/python/exercises/luhn/README.md +2 -3
  432. data/tracks/python/exercises/markdown/README.md +2 -4
  433. data/tracks/python/exercises/matrix/README.md +2 -3
  434. data/tracks/python/exercises/matrix/example.py +6 -3
  435. data/tracks/python/exercises/matrix/matrix.py +6 -0
  436. data/tracks/python/exercises/matrix/matrix_test.py +25 -15
  437. data/tracks/python/exercises/meetup/README.md +2 -3
  438. data/tracks/python/exercises/meetup/meetup_test.py +1 -2
  439. data/tracks/python/exercises/minesweeper/README.md +2 -4
  440. data/tracks/python/exercises/nth-prime/README.md +2 -3
  441. data/tracks/python/exercises/nucleotide-count/README.md +2 -3
  442. data/tracks/python/exercises/ocr-numbers/README.md +2 -3
  443. data/tracks/python/exercises/octal/README.md +2 -3
  444. data/tracks/python/exercises/palindrome-products/README.md +2 -3
  445. data/tracks/python/exercises/pangram/README.md +2 -3
  446. data/tracks/python/exercises/pangram/pangram_test.py +1 -1
  447. data/tracks/python/exercises/parallel-letter-frequency/README.md +2 -4
  448. data/tracks/python/exercises/pascals-triangle/README.md +2 -3
  449. data/tracks/python/exercises/perfect-numbers/README.md +2 -3
  450. data/tracks/python/exercises/phone-number/README.md +2 -3
  451. data/tracks/python/exercises/pig-latin/README.md +2 -3
  452. data/tracks/python/exercises/pig-latin/pig_latin_test.py +1 -1
  453. data/tracks/python/exercises/point-mutations/README.md +2 -3
  454. data/tracks/python/exercises/poker/README.md +2 -3
  455. data/tracks/python/exercises/pov/README.md +2 -5
  456. data/tracks/python/exercises/prime-factors/README.md +2 -3
  457. data/tracks/python/exercises/prime-factors/prime_factors_test.py +1 -1
  458. data/tracks/python/exercises/protein-translation/README.md +4 -5
  459. data/tracks/python/exercises/proverb/README.md +2 -2
  460. data/tracks/python/exercises/pythagorean-triplet/README.md +2 -3
  461. data/tracks/python/exercises/queen-attack/README.md +2 -3
  462. data/tracks/python/exercises/rail-fence-cipher/README.md +2 -3
  463. data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher.py +2 -6
  464. data/tracks/python/exercises/raindrops/README.md +2 -3
  465. data/tracks/python/exercises/react/README.md +2 -4
  466. data/tracks/python/exercises/rectangles/README.md +2 -4
  467. data/tracks/python/exercises/reverse-string/README.md +28 -0
  468. data/tracks/python/exercises/reverse-string/reverse_string_test.py +1 -1
  469. data/tracks/python/exercises/rna-transcription/README.md +3 -4
  470. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +3 -25
  471. data/tracks/python/exercises/robot-name/README.md +2 -3
  472. data/tracks/python/exercises/robot-simulator/README.md +2 -3
  473. data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +1 -1
  474. data/tracks/python/exercises/roman-numerals/README.md +2 -3
  475. data/tracks/python/exercises/rotational-cipher/README.md +2 -3
  476. data/tracks/python/exercises/rotational-cipher/rotational_cipher_test.py +1 -1
  477. data/tracks/python/exercises/run-length-encoding/README.md +2 -3
  478. data/tracks/python/exercises/saddle-points/README.md +2 -3
  479. data/tracks/python/exercises/say/README.md +2 -3
  480. data/tracks/python/exercises/say/say_test.py +1 -1
  481. data/tracks/python/exercises/scale-generator/README.md +2 -4
  482. data/tracks/python/exercises/scrabble-score/README.md +2 -3
  483. data/tracks/python/exercises/scrabble-score/scrabble_score_test.py +1 -1
  484. data/tracks/python/exercises/secret-handshake/README.md +3 -4
  485. data/tracks/python/exercises/series/README.md +2 -3
  486. data/tracks/python/exercises/sieve/README.md +2 -3
  487. data/tracks/python/exercises/sieve/sieve_test.py +1 -1
  488. data/tracks/python/exercises/simple-cipher/README.md +6 -9
  489. data/tracks/python/exercises/simple-linked-list/README.md +2 -3
  490. data/tracks/python/exercises/space-age/README.md +2 -3
  491. data/tracks/python/exercises/space-age/space_age_test.py +1 -1
  492. data/tracks/python/exercises/spiral-matrix/README.md +20 -8
  493. data/tracks/python/exercises/strain/README.md +2 -3
  494. data/tracks/python/exercises/sublist/README.md +2 -4
  495. data/tracks/python/exercises/sublist/sublist_test.py +1 -1
  496. data/tracks/python/exercises/sum-of-multiples/README.md +2 -3
  497. data/tracks/python/exercises/sum-of-multiples/sum_of_multiples_test.py +1 -1
  498. data/tracks/python/exercises/tournament/README.md +2 -4
  499. data/tracks/python/exercises/transpose/README.md +2 -3
  500. data/tracks/python/exercises/tree-building/README.md +2 -4
  501. data/tracks/python/exercises/triangle/README.md +2 -3
  502. data/tracks/python/exercises/trinary/README.md +2 -3
  503. data/tracks/python/exercises/twelve-days/README.md +2 -3
  504. data/tracks/python/exercises/two-bucket/README.md +2 -3
  505. data/tracks/python/exercises/two-fer/README.md +3 -4
  506. data/tracks/python/exercises/variable-length-quantity/README.md +2 -3
  507. data/tracks/python/exercises/word-count/README.md +2 -3
  508. data/tracks/python/exercises/word-search/README.md +2 -4
  509. data/tracks/python/exercises/wordy/README.md +2 -3
  510. data/tracks/python/exercises/zebra-puzzle/README.md +2 -3
  511. data/tracks/python/exercises/zipper/README.md +2 -4
  512. data/tracks/ruby/docs/24pullrequests.md +1 -1
  513. data/tracks/rust/exercises/robot-name/Cargo-example.toml +6 -0
  514. data/tracks/rust/exercises/robot-name/Cargo.toml +0 -1
  515. data/tracks/scala/exercises/beer-song/example.scala +3 -3
  516. data/tracks/scala/exercises/beer-song/src/test/scala/BeerSongTest.scala +29 -30
  517. data/tracks/scala/exercises/binary-search/src/test/scala/BinarySearchTest.scala +3 -3
  518. data/tracks/scala/exercises/book-store/example.scala +1 -1
  519. data/tracks/scala/exercises/book-store/src/test/scala/BookStoreTest.scala +19 -15
  520. data/tracks/scala/testgen/src/main/scala/BeerSongTestGenerator.scala +21 -3
  521. data/tracks/scala/testgen/src/main/scala/BinarySearchTestGenerator.scala +3 -5
  522. data/tracks/scala/testgen/src/main/scala/BookStoreTestGenerator.scala +3 -3
  523. data/tracks/swift/.travis.yml +2 -2
  524. data/tracks/swift/config.json +12 -0
  525. data/tracks/swift/exercises/scale-generator/Package.swift +5 -0
  526. data/tracks/swift/exercises/scale-generator/README.md +65 -0
  527. data/tracks/swift/exercises/scale-generator/Sources/ScaleGenerator.swift +1 -0
  528. data/tracks/swift/exercises/scale-generator/Sources/ScaleGeneratorExample.swift +78 -0
  529. data/tracks/swift/exercises/scale-generator/Tests/LinuxMain.swift +6 -0
  530. data/tracks/swift/exercises/scale-generator/Tests/ScaleGeneratorTests/ScaleGeneratorTests.swift +116 -0
  531. metadata +197 -101
  532. data/problem-specifications/exercises/grains/USE_OLD_SCHEMA +0 -0
  533. data/problem-specifications/exercises/grep/USE_OLD_SCHEMA +0 -0
  534. data/problem-specifications/exercises/house/USE_OLD_SCHEMA +0 -0
  535. data/problem-specifications/exercises/isogram/USE_OLD_SCHEMA +0 -0
  536. data/problem-specifications/exercises/list-ops/USE_OLD_SCHEMA +0 -0
  537. data/problem-specifications/exercises/pov/USE_OLD_SCHEMA +0 -0
  538. data/problem-specifications/exercises/trinary/USE_OLD_SCHEMA +0 -0
  539. data/problem-specifications/exercises/word-search/USE_OLD_SCHEMA +0 -0
  540. data/problem-specifications/exercises/zipper/USE_OLD_SCHEMA +0 -0
  541. data/problem-specifications/old-schema.json +0 -137
  542. data/tracks/c/exercises/bob/.meta/description.md +0 -10
  543. data/tracks/elm/exercises/bob/.meta/description.md +0 -10
  544. data/tracks/perl5/exercises/allergies/cases.json +0 -69
  545. data/tracks/perl5/exercises/anagram/cases.json +0 -56
  546. data/tracks/perl5/exercises/atbash-cipher/cases.json +0 -75
  547. data/tracks/perl5/exercises/beer-song/cases.json +0 -74
  548. data/tracks/perl5/exercises/grains/cases.json +0 -49
  549. data/tracks/perl5/exercises/linked-list/cases.json +0 -54
  550. data/tracks/perl5/exercises/pascals-triangle/cases.json +0 -45
  551. data/tracks/perl5/exercises/point-mutations/cases.json +0 -69
  552. data/tracks/perl5/exercises/prime-factors/cases.json +0 -57
  553. data/tracks/perl5/exercises/proverb/cases.json +0 -52
  554. data/tracks/perl5/exercises/queen-attack/cases.json +0 -182
  555. data/tracks/perl5/exercises/raindrops/cases.json +0 -83
  556. data/tracks/perl5/exercises/triangle/cases.json +0 -82
  557. data/tracks/perl5/exercises/wordy/cases.json +0 -82
  558. data/tracks/python/docs/EXERCISE_README_INSERT.md +0 -23
@@ -1,73 +1,89 @@
1
+ import org.junit.Before;
1
2
  import org.junit.Ignore;
2
3
  import org.junit.Test;
3
- import org.junit.experimental.runners.Enclosed;
4
- import org.junit.runner.RunWith;
5
- import org.junit.runners.Parameterized;
6
- import org.junit.runners.Parameterized.Parameters;
7
-
8
- import java.util.Arrays;
9
- import java.util.Collection;
10
4
 
11
5
  import static org.junit.Assert.assertEquals;
12
6
 
13
- @RunWith(Enclosed.class)
14
7
  public class AtbashTest {
15
8
 
16
- @RunWith(Parameterized.class)
17
- public static class EncodeTest {
18
- private String plaintext;
19
- private String ciphertext;
20
-
21
- @Parameters(name = "{index}: expected plaintext \"{0}\" to encode to ciphertext \"{1}\".")
22
- public static Collection<Object[]> data() {
23
- return Arrays.asList(new Object[][]{
24
- {"yes", "bvh"},
25
- {"no", "ml"},
26
- {"OMG", "lnt"},
27
- {"O M G", "lnt"},
28
- {"mindblowingly", "nrmwy oldrm tob"},
29
- {"Testing,1 2 3, testing.", "gvhgr mt123 gvhgr mt"},
30
- {"Truth is fiction.", "gifgs rhurx grlm"},
31
- {"The quick brown fox jumps over the lazy dog.", "gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt"}
32
- });
33
- }
34
-
35
- public EncodeTest(String plaintext, String ciphertext) {
36
- this.plaintext = plaintext;
37
- this.ciphertext = ciphertext;
38
- }
39
-
40
-
41
- @Test
42
- public void test() {
43
- assertEquals(ciphertext, new Atbash().encode(plaintext));
44
- }
9
+ private Atbash atbash;
10
+
11
+ @Before
12
+ public void setup() {
13
+ atbash = new Atbash();
14
+ }
15
+
16
+ @Test
17
+ public void testEncodeYes() {
18
+ assertEquals("bvh", atbash.encode("yes"));
45
19
  }
46
20
 
47
- @RunWith(Parameterized.class)
48
- public static class DecodeTest {
49
- private String ciphertext;
50
- private String plaintext;
51
-
52
- @Parameters(name = "{index}: expected ciphertext \"{0}\" to decode to plaintext \"{1}\".")
53
- public static Collection<Object[]> data() {
54
- return Arrays.asList(new Object[][]{
55
- {"vcvix rhn", "exercism"},
56
- {"zmlyh gzxov rhlug vmzhg vkkrm thglm v", "anobstacleisoftenasteppingstone"},
57
- {"gvhgr mt123 gvhgr mt", "testing123testing"},
58
- {"gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt", "thequickbrownfoxjumpsoverthelazydog"}
59
- });
60
- }
61
-
62
- public DecodeTest(String ciphertext, String plaintext) {
63
- this.ciphertext = ciphertext;
64
- this.plaintext = plaintext;
65
- }
66
-
67
- @Ignore("Remove to run tests")
68
- @Test
69
- public void test() {
70
- assertEquals(plaintext, new Atbash().decode(ciphertext));
71
- }
21
+ @Ignore("Remove to run test")
22
+ @Test
23
+ public void testEncodeNo() {
24
+ assertEquals("ml", atbash.encode("no"));
72
25
  }
26
+
27
+ @Ignore("Remove to run test")
28
+ @Test
29
+ public void testEncodeOmgInCapital() {
30
+ assertEquals("lnt", atbash.encode("OMG"));
31
+ }
32
+
33
+ @Ignore("Remove to run test")
34
+ @Test
35
+ public void testEncodeOmgWithSpaces() {
36
+ assertEquals("lnt", atbash.encode("O M G"));
37
+ }
38
+
39
+ @Ignore("Remove to run test")
40
+ @Test
41
+ public void testEncodeMindBlowingly() {
42
+ assertEquals("nrmwy oldrm tob", atbash.encode("mindblowingly"));
43
+ }
44
+
45
+ @Ignore("Remove to run test")
46
+ @Test
47
+ public void testEncodeNumbers() {
48
+ assertEquals("gvhgr mt123 gvhgr mt", atbash.encode("Testing,1 2 3, testing."));
49
+ }
50
+
51
+ @Ignore("Remove to run test")
52
+ @Test
53
+ public void testEncodeDeepThought() {
54
+ assertEquals("gifgs rhurx grlm", atbash.encode("Truth is fiction."));
55
+ }
56
+
57
+ @Ignore("Remove to run test")
58
+ @Test
59
+ public void testEncodeAllTheLetters() {
60
+ assertEquals("gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt",
61
+ atbash.encode("The quick brown fox jumps over the lazy dog."));
62
+ }
63
+
64
+ @Ignore("Remove to run test")
65
+ @Test
66
+ public void testDecodeExercism() {
67
+ assertEquals("exercism", atbash.decode("vcvix rhn"));
68
+ }
69
+
70
+ @Ignore("Remove to run test")
71
+ @Test
72
+ public void testDecodeASentence() {
73
+ assertEquals("anobstacleisoftenasteppingstone", atbash.decode("zmlyh gzxov rhlug vmzhg vkkrm thglm v"));
74
+ }
75
+
76
+ @Ignore("Remove to run test")
77
+ @Test
78
+ public void testDecodeNumbers() {
79
+ assertEquals("testing123testing", atbash.decode("gvhgr mt123 gvhgr mt"));
80
+ }
81
+
82
+ @Ignore("Remove to run test")
83
+ @Test
84
+ public void testDecodeAllTheLetters() {
85
+ assertEquals("thequickbrownfoxjumpsoverthelazydog",
86
+ atbash.decode("gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt"));
87
+ }
88
+
73
89
  }
@@ -0,0 +1 @@
1
+ 1.1.0
@@ -1,49 +1,114 @@
1
1
  import org.junit.Test;
2
2
  import org.junit.Ignore;
3
- import org.junit.runner.RunWith;
4
- import org.junit.runners.Parameterized;
5
- import org.junit.runners.Parameterized.Parameters;
6
-
7
- import java.util.Arrays;
8
- import java.util.Collection;
9
3
 
10
4
  import static org.junit.Assert.assertEquals;
11
5
 
12
- @RunWith(Parameterized.class)
13
6
  public class BinaryTest {
14
7
 
15
- private String binaryNumberAsString;
16
- private int decimalNumber;
8
+ private Binary binary;
17
9
 
18
- @Parameters(name = "{index}: expected {1} when converting \"{0}\" from binary to decimal.")
19
- public static Collection<Object[]> data() {
20
- return Arrays.asList(new Object[][]{
21
- {"1", 1},
22
- {"10", 2},
23
- {"11", 3},
24
- {"100", 4},
25
- {"1001", 9},
26
- {"11010", 26},
27
- {"10001101000", 1128},
28
- {"2", 0},
29
- {"5", 0},
30
- {"9", 0},
31
- {"134678", 0},
32
- {"abc10z", 0},
33
- {"011", 3}
34
- });
10
+ @Test
11
+ public void testBinary0IsDecimal0() {
12
+ binary = new Binary("0");
13
+ assertEquals(0, binary.getDecimal());
14
+ }
15
+
16
+ @Ignore("Remove to run test")
17
+ @Test
18
+ public void testBinary1IsDecimal1() {
19
+ binary = new Binary("1");
20
+ assertEquals(1, binary.getDecimal());
35
21
  }
36
22
 
37
- public BinaryTest(String binaryNumberAsString, int decimalNumber) {
38
- this.binaryNumberAsString = binaryNumberAsString;
39
- this.decimalNumber = decimalNumber;
23
+ @Ignore("Remove to run test")
24
+ @Test
25
+ public void testBinary10IsDecimal2() {
26
+ binary = new Binary("10");
27
+ assertEquals(2, binary.getDecimal());
40
28
  }
41
29
 
30
+ @Ignore("Remove to run test")
31
+ @Test
32
+ public void testBinary11IsDecimal3() {
33
+ binary = new Binary("11");
34
+ assertEquals(3, binary.getDecimal());
35
+ }
42
36
 
37
+ @Ignore("Remove to run test")
43
38
  @Test
44
- public void test() {
45
- Binary binary = new Binary(binaryNumberAsString);
39
+ public void testBinary100IsDecimal4() {
40
+ binary = new Binary("100");
41
+ assertEquals(4, binary.getDecimal());
42
+ }
46
43
 
47
- assertEquals(decimalNumber, binary.getDecimal());
44
+ @Ignore("Remove to run test")
45
+ @Test
46
+ public void testBinary1001IsDecimal9() {
47
+ binary = new Binary("1001");
48
+ assertEquals(9, binary.getDecimal());
49
+ }
50
+
51
+ @Ignore("Remove to run test")
52
+ @Test
53
+ public void testBinary11010IsDecimal26() {
54
+ binary = new Binary("11010");
55
+ assertEquals(26, binary.getDecimal());
56
+ }
57
+
58
+ @Ignore("Remove to run test")
59
+ @Test
60
+ public void testBinary10001101000IsDecimal1128() {
61
+ binary = new Binary("10001101000");
62
+ assertEquals(1128, binary.getDecimal());
63
+ }
64
+
65
+ @Ignore("Remove to run test")
66
+ @Test
67
+ public void testBinaryIgnoresLeadingZeros() {
68
+ binary = new Binary("000011111");
69
+ assertEquals(31, binary.getDecimal());
48
70
  }
71
+
72
+ @Ignore("Remove to run test")
73
+ @Test
74
+ public void test2NotValidBinaryDigit() {
75
+ binary = new Binary("2");
76
+ assertEquals(0, binary.getDecimal());
77
+ }
78
+
79
+ @Ignore("Remove to run test")
80
+ @Test
81
+ public void testNumberContainingNonBinaryDigitInvalid() {
82
+ binary = new Binary("01201");
83
+ assertEquals(0, binary.getDecimal());
84
+ }
85
+
86
+ @Ignore("Remove to run test")
87
+ @Test
88
+ public void testNumberWithTrailingNonBinaryCharactersInvalid() {
89
+ binary = new Binary("10nope");
90
+ assertEquals(0, binary.getDecimal());
91
+ }
92
+
93
+ @Ignore("Remove to run test")
94
+ @Test
95
+ public void testNumberWithLeadingNonBinaryCharactersInvalid() {
96
+ binary = new Binary("nope10");
97
+ assertEquals(0, binary.getDecimal());
98
+ }
99
+
100
+ @Ignore("Remove to run test")
101
+ @Test
102
+ public void testNumberWithInternalNonBinaryCharactersInvalid() {
103
+ binary = new Binary("10nope10");
104
+ assertEquals(0, binary.getDecimal());
105
+ }
106
+
107
+ @Ignore("Remove to run test")
108
+ @Test
109
+ public void testNumberAndWordWhitespaceSeparatedInvalid() {
110
+ binary = new Binary("001 nope");
111
+ assertEquals(0, binary.getDecimal());
112
+ }
113
+
49
114
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1 +1 @@
1
- 2.0.0
1
+ 2.2.0
@@ -91,4 +91,10 @@ public class IsbnVerifierTest {
91
91
  assertFalse(isbnVerifier.isValid("3-598-21515-X"));
92
92
  }
93
93
 
94
+ @Ignore("Remove to run test")
95
+ @Test
96
+ public void emptyIsbn() {
97
+ assertFalse(isbnVerifier.isValid(""));
98
+ }
99
+
94
100
  }
@@ -28,12 +28,4 @@ class Matrix {
28
28
  }
29
29
  return column;
30
30
  }
31
-
32
- int getRowsCount() {
33
- return matrix.length;
34
- }
35
-
36
- int getColumnsCount() {
37
- return matrix[0].length;
38
- }
39
31
  }
@@ -0,0 +1,2 @@
1
+ 1.0.0
2
+
@@ -10,198 +10,100 @@ import java.util.Collection;
10
10
  import static org.junit.Assert.assertArrayEquals;
11
11
  import static org.junit.Assert.assertEquals;
12
12
 
13
- @RunWith(Enclosed.class)
14
13
  public class MatrixTest {
15
-
16
- @RunWith(Parameterized.class)
17
- public static class CountRowsTest {
18
- private Matrix matrix;
19
- private int numberOfRows;
20
-
21
- @Parameterized.Parameters(name = "{index}: expected matrix constructed with string \n\"{0}\" to have {1} row(s).")
22
- public static Collection<Object[]> data() {
23
- return Arrays.asList(new Object[][]{
24
- {"0", 1},
25
- {"0 1", 1},
26
- { "0\n"
27
- + "1", 2},
28
- { "0 1\n"
29
- + "2 3", 2},
30
- { "0 1 2\n"
31
- + "3 4 5\n"
32
- + "6 7 8", 3}
33
- });
34
- }
35
-
36
- public CountRowsTest(String matrixAsString, int numberOfRows) {
37
- this.matrix = new Matrix(matrixAsString);
38
- this.numberOfRows = numberOfRows;
39
- }
40
-
41
- @Test
42
- public void countRowsTest() {
43
- assertEquals(numberOfRows, matrix.getRowsCount());
44
- }
45
- }
46
-
47
- @Ignore("Remove to run test")
48
- @RunWith(Parameterized.class)
49
- public static class CountColumnsTest {
50
- private Matrix matrix;
51
- private int numberOfColumns;
52
-
53
- @Parameterized.Parameters(name = "{index}: expected matrix constructed with string \n\"{0}\" to have {1} column(s).")
54
- public static Collection<Object[]> data() {
55
- return Arrays.asList(new Object[][]{
56
- {"0", 1},
57
- {"0 1", 2},
58
- { "0\n"
59
- + "1", 1},
60
- { "0 1\n"
61
- + "2 3", 2},
62
- { "0 1 2\n"
63
- + "3 4 5\n"
64
- + "6 7 8", 3}
65
- });
66
- }
67
-
68
- public CountColumnsTest(String matrixAsString, int numberOfColumns) {
69
- this.matrix = new Matrix(matrixAsString);
70
- this.numberOfColumns = numberOfColumns;
71
- }
72
-
73
- @Test
74
- public void countColumnsTest() {
75
- assertEquals(numberOfColumns, matrix.getColumnsCount());
76
- }
77
- }
78
-
79
- @Ignore("Remove to run test")
80
- @RunWith(Parameterized.class)
81
- public static class GetFirstRowTest {
82
- private Matrix matrix;
83
- private int[] firstRow;
84
-
85
- @Parameterized.Parameters(name = "{index}: checking first row of matrix constructed with string \n\"{0}\".")
86
- public static Collection<Object[]> data() {
87
- return Arrays.asList(new Object[][]{
88
- {"0", new int[] {0}},
89
- {"0 1", new int[] {0, 1}},
90
- { "0\n"
91
- + "1", new int[] {0}},
92
- { "0 1\n"
93
- + "2 3", new int[] {0, 1}},
94
- { "0 1 2\n"
95
- + "3 4 5\n"
96
- + "6 7 8", new int[] {0, 1, 2}}
97
- });
98
- }
99
-
100
- public GetFirstRowTest(String matrixAsString, int[] firstRow) {
101
- this.matrix = new Matrix(matrixAsString);
102
- this.firstRow = firstRow;
103
- }
104
-
105
- @Test
106
- public void getFirstRowTest() {
107
- assertArrayEquals(firstRow, matrix.getRow(0));
108
- }
109
- }
110
-
111
- @Ignore("Remove to run test")
112
- @RunWith(Parameterized.class)
113
- public static class GetLastRowTest {
114
- private Matrix matrix;
115
- private int[] lastRow;
116
-
117
- @Parameterized.Parameters(name = "{index}: checking last row of matrix constructed with string \n\"{0}\".")
118
- public static Collection<Object[]> data() {
119
- return Arrays.asList(new Object[][]{
120
- {"0", new int[] {0}},
121
- {"0 1", new int[] {0, 1}},
122
- { "0\n"
123
- + "1", new int[] {1}},
124
- { "0 1\n"
125
- + "2 3", new int[] {2, 3}},
126
- { "0 1 2\n"
127
- + "3 4 5\n"
128
- + "6 7 8", new int[] {6, 7, 8}}
129
- });
130
- }
131
-
132
- public GetLastRowTest(String matrixAsString, int[] lastRow) {
133
- this.matrix = new Matrix(matrixAsString);
134
- this.lastRow = lastRow;
135
- }
136
-
137
- @Test
138
- public void getLastRowTest() {
139
- assertArrayEquals(lastRow, matrix.getRow(matrix.getRowsCount() - 1));
140
- }
141
- }
142
-
143
- @Ignore("Remove to run test")
144
- @RunWith(Parameterized.class)
145
- public static class GetFirstColumnTest {
146
- private Matrix matrix;
147
- private int[] firstColumn;
148
-
149
- @Parameterized.Parameters(name = "{index}: checking first column of matrix constructed with string \n\"{0}\".")
150
- public static Collection<Object[]> data() {
151
- return Arrays.asList(new Object[][]{
152
- {"0", new int[] {0}},
153
- {"0 1", new int[] {0}},
154
- { "0\n"
155
- + "1", new int[] {0, 1}},
156
- { "0 1\n"
157
- + "2 3", new int[] {0, 2}},
158
- { "0 1 2\n"
159
- + "3 4 5\n"
160
- + "6 7 8", new int[] {0, 3, 6}}
161
- });
162
- }
163
-
164
- public GetFirstColumnTest(String matrixAsString, int[] firstColumn) {
165
- this.matrix = new Matrix(matrixAsString);
166
- this.firstColumn = firstColumn;
167
- }
168
-
169
- @Test
170
- public void getFirstColumnTest() {
171
- assertArrayEquals(firstColumn, matrix.getColumn(0));
172
- }
173
- }
174
-
175
-
176
- @Ignore("Remove to run test")
177
- @RunWith(Parameterized.class)
178
- public static class GetLastColumnTest {
179
- private Matrix matrix;
180
- private int[] lastColumn;
181
-
182
- @Parameterized.Parameters(name = "{index}: checking last column of matrix constructed with string \n\"{0}\".")
183
- public static Collection<Object[]> data() {
184
- return Arrays.asList(new Object[][]{
185
- {"0", new int[] {0}},
186
- {"0 1", new int[] {1}},
187
- { "0\n"
188
- + "1", new int[] {0, 1}},
189
- { "0 1\n"
190
- + "2 3", new int[] {1, 3}},
191
- { "0 1 2\n"
192
- + "3 4 5\n"
193
- + "6 7 8", new int[] {2, 5, 8}}
194
- });
195
- }
196
-
197
- public GetLastColumnTest(String matrixAsString, int[] lastColumn) {
198
- this.matrix = new Matrix(matrixAsString);
199
- this.lastColumn = lastColumn;
200
- }
201
-
202
- @Test
203
- public void getLastColumnTest() {
204
- assertArrayEquals(lastColumn, matrix.getColumn(matrix.getColumnsCount() - 1));
205
- }
206
- }
14
+
15
+ @Test
16
+ public void extractRowFromOneNumberMatrixTest() {
17
+ String matrixAsString = "1";
18
+ int rowIndex = 0;
19
+ int[] expectedRow = {1};
20
+
21
+ Matrix matrix = new Matrix(matrixAsString);
22
+
23
+ assertArrayEquals(expectedRow, matrix.getRow(rowIndex));
24
+ }
25
+
26
+ @Ignore("Remove to run test")
27
+ @Test
28
+ public void extractRowFromMatrixTest() {
29
+ String matrixAsString = "1 2\n3 4";
30
+ int rowIndex = 1;
31
+ int[] expectedRow = {3, 4};
32
+
33
+ Matrix matrix = new Matrix(matrixAsString);
34
+
35
+ assertArrayEquals(expectedRow, matrix.getRow(rowIndex));
36
+ }
37
+
38
+ @Ignore("Remove to run test")
39
+ @Test
40
+ public void extractRowFromDiffWidthsMatrixTest() {
41
+ String matrixAsString = "1 2\n10 20";
42
+ int rowIndex = 1;
43
+ int[] expectedRow = {10, 20};
44
+
45
+ Matrix matrix = new Matrix(matrixAsString);
46
+
47
+ assertArrayEquals(expectedRow, matrix.getRow(rowIndex));
48
+ }
49
+
50
+ @Ignore("Remove to run test")
51
+ @Test
52
+ public void extractRowFromNonSquareMatrixTest() {
53
+ String matrixAsString = "1 2 3\n4 5 6\n7 8 9\n8 7 6";
54
+ int rowIndex = 2;
55
+ int[] expectedRow = {7, 8, 9};
56
+
57
+ Matrix matrix = new Matrix(matrixAsString);
58
+
59
+ assertArrayEquals(expectedRow, matrix.getRow(rowIndex));
60
+ }
61
+
62
+ @Ignore("Remove to run test")
63
+ @Test
64
+ public void extractColumnFromOneNumberMatrixTest() {
65
+ String matrixAsString = "1";
66
+ int columnIndex = 0;
67
+ int[] expectedColumn = {1};
68
+
69
+ Matrix matrix = new Matrix(matrixAsString);
70
+
71
+ assertArrayEquals(expectedColumn, matrix.getColumn(columnIndex));
72
+ }
73
+
74
+ @Ignore("Remove to run test")
75
+ @Test
76
+ public void extractColumnMatrixTest() {
77
+ String matrixAsString = "1 2 3\n4 5 6\n7 8 9";
78
+ int columnIndex = 2;
79
+ int[] expectedColumn = {3, 6, 9};
80
+
81
+ Matrix matrix = new Matrix(matrixAsString);
82
+
83
+ assertArrayEquals(expectedColumn, matrix.getColumn(columnIndex));
84
+ }
85
+
86
+ @Ignore("Remove to run test")
87
+ @Test
88
+ public void extractColumnFromNonSquareMatrixTest() {
89
+ String matrixAsString = "1 2 3\n4 5 6\n7 8 9\n8 7 6";
90
+ int columnIndex = 2;
91
+ int[] expectedColumn = {3, 6, 9, 6};
92
+
93
+ Matrix matrix = new Matrix(matrixAsString);
94
+
95
+ assertArrayEquals(expectedColumn, matrix.getColumn(columnIndex));
96
+ }
97
+
98
+ @Ignore("Remove to run test")
99
+ @Test
100
+ public void extractColumnFromDiffWidthsMatrixTest() {
101
+ String matrixAsString = "89 1903 3\n18 3 1\n9 4 800";
102
+ int columnIndex = 1;
103
+ int[] expectedColumn = {1903, 3, 4};
104
+
105
+ Matrix matrix = new Matrix(matrixAsString);
106
+
107
+ assertArrayEquals(expectedColumn, matrix.getColumn(columnIndex));
108
+ }
207
109
  }