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,4 +1,4 @@
1
- // This file was auto-generated based on version 1.2.0 of the canonical data.
1
+ // This file was auto-generated based on version 1.3.0 of the canonical data.
2
2
 
3
3
  module ComplexNumbersTest
4
4
 
@@ -166,3 +166,9 @@ let ``Exponential of a purely real number`` () =
166
166
  real sut |> should (equalWithin 0.000000001) Math.E
167
167
  imaginary sut |> should (equalWithin 0.000000001) 0.0
168
168
 
169
+ [<Fact(Skip = "Remove to run test")>]
170
+ let ``Exponential of a number with real and imaginary part`` () =
171
+ let sut = exp (create (Math.Log(2.0)) Math.PI)
172
+ real sut |> should (equalWithin 0.000000001) -2.0
173
+ imaginary sut |> should (equalWithin 0.000000001) 0.0
174
+
@@ -12,7 +12,6 @@ let ``Input cells have a value`` () =
12
12
  let reactor = new Reactor()
13
13
  let input = reactor.createInputCell 10
14
14
  input.Value |> should equal 10
15
-
16
15
 
17
16
  [<Fact(Skip = "Remove to run test")>]
18
17
  let ``An input cell's value can be set`` () =
@@ -20,7 +19,6 @@ let ``An input cell's value can be set`` () =
20
19
  let input = reactor.createInputCell 4
21
20
  input.Value <- 20
22
21
  input.Value |> should equal 20
23
-
24
22
 
25
23
  [<Fact(Skip = "Remove to run test")>]
26
24
  let ``Compute cells calculate initial value`` () =
@@ -28,7 +26,6 @@ let ``Compute cells calculate initial value`` () =
28
26
  let input = reactor.createInputCell 1
29
27
  let output = reactor.createComputeCell [input] (fun values -> values.[0] + 1)
30
28
  output.Value |> should equal 2
31
-
32
29
 
33
30
  [<Fact(Skip = "Remove to run test")>]
34
31
  let ``Compute cells take inputs in the right order`` () =
@@ -37,7 +34,6 @@ let ``Compute cells take inputs in the right order`` () =
37
34
  let two = reactor.createInputCell 2
38
35
  let output = reactor.createComputeCell [one; two] (fun values -> values.[0] + values.[1] * 10)
39
36
  output.Value |> should equal 21
40
-
41
37
 
42
38
  [<Fact(Skip = "Remove to run test")>]
43
39
  let ``Compute cells update value when dependencies are changed`` () =
@@ -46,7 +42,6 @@ let ``Compute cells update value when dependencies are changed`` () =
46
42
  let output = reactor.createComputeCell [input] (fun values -> values.[0] + 1)
47
43
  input.Value <- 3
48
44
  output.Value |> should equal 4
49
-
50
45
 
51
46
  [<Fact(Skip = "Remove to run test")>]
52
47
  let ``Compute cells can depend on other compute cells`` () =
@@ -58,7 +53,6 @@ let ``Compute cells can depend on other compute cells`` () =
58
53
  output.Value |> should equal 32
59
54
  input.Value <- 3
60
55
  output.Value |> should equal 96
61
-
62
56
 
63
57
  [<Fact(Skip = "Remove to run test")>]
64
58
  let ``Compute cells fire callbacks`` () =
@@ -70,7 +64,6 @@ let ``Compute cells fire callbacks`` () =
70
64
  output.Changed.AddHandler callback1Handler
71
65
  input.Value <- 3
72
66
  callback1 |> should equal [4]
73
-
74
67
 
75
68
  [<Fact(Skip = "Remove to run test")>]
76
69
  let ``Callback cells only fire on change`` () =
@@ -84,7 +77,6 @@ let ``Callback cells only fire on change`` () =
84
77
  callback1 |> should equal List.empty<int>
85
78
  input.Value <- 4
86
79
  callback1 |> should equal [222]
87
-
88
80
 
89
81
  [<Fact(Skip = "Remove to run test")>]
90
82
  let ``Callbacks can be added and removed`` () =
@@ -106,7 +98,6 @@ let ``Callbacks can be added and removed`` () =
106
98
  callback1 |> should equal [32]
107
99
  callback2 |> should equal [32; 42]
108
100
  callback3 |> should equal [42]
109
-
110
101
 
111
102
  [<Fact(Skip = "Remove to run test")>]
112
103
  let ``Removing a callback multiple times doesn't interfere with other callbacks`` () =
@@ -125,7 +116,6 @@ let ``Removing a callback multiple times doesn't interfere with other callbacks`
125
116
  input.Value <- 2
126
117
  callback1 |> should equal List.empty<int>
127
118
  callback2 |> should equal [3]
128
-
129
119
 
130
120
  [<Fact(Skip = "Remove to run test")>]
131
121
  let ``Callbacks should only be called once even if multiple dependencies change`` () =
@@ -140,7 +130,6 @@ let ``Callbacks should only be called once even if multiple dependencies change`
140
130
  output.Changed.AddHandler callback1Handler
141
131
  input.Value <- 4
142
132
  callback1 |> should equal [10]
143
-
144
133
 
145
134
  [<Fact(Skip = "Remove to run test")>]
146
135
  let ``Callbacks should not be called if dependencies change but output value doesn't change`` () =
@@ -157,5 +146,4 @@ let ``Callbacks should not be called if dependencies change but output value doe
157
146
  input.Value <- 4
158
147
  input.Value <- 5
159
148
  callback1 |> should equal List.empty<int>
160
-
161
149
 
@@ -11,13 +11,17 @@ let intervals = [('m', 1); ('M', 2); ('A', 3)] |> Map.ofList
11
11
 
12
12
  let skipInterval interval scale = List.skip (Map.find interval intervals) scale
13
13
 
14
- let pitches tonic pattern =
14
+ let pitches tonic intervals =
15
15
  let scale = if List.contains tonic flatKeys then flatChromaticScale else chromaticScale
16
16
  let index = List.findIndex (fun pitch -> String.Equals(pitch, tonic, StringComparison.InvariantCultureIgnoreCase)) scale
17
17
  let shiftedScale = shift index scale
18
-
19
- pattern
20
- |> List.ofSeq
21
- |> List.fold (fun (acc, remainder) item -> (List.head remainder :: acc, skipInterval item remainder)) ([], shiftedScale)
22
- |> fst
23
- |> List.rev
18
+
19
+ match intervals with
20
+ | None ->
21
+ shiftedScale
22
+ | Some x ->
23
+ x
24
+ |> List.ofSeq
25
+ |> List.fold (fun (acc, remainder) item -> (List.head remainder :: acc, skipInterval item remainder)) ([], shiftedScale)
26
+ |> fst
27
+ |> List.rev
@@ -1,3 +1,3 @@
1
1
  module ScaleGenerator
2
2
 
3
- let pitches tonic pattern = failwith "You need to implement this function."
3
+ let pitches tonic intervals = failwith "You need to implement this function."
@@ -1,92 +1,77 @@
1
- // This file was created manually and its version is 1.0.0.
1
+ // This file was auto-generated based on version 1.0.0 of the canonical data.
2
2
 
3
3
  module ScaleGeneratorTest
4
4
 
5
- open Xunit
6
5
  open FsUnit.Xunit
6
+ open Xunit
7
7
 
8
8
  open ScaleGenerator
9
9
 
10
10
  [<Fact>]
11
- let ``Major scale`` () =
12
- let major = pitches "C" "MMmMMMm"
13
- let expected = ["C"; "D"; "E"; "F"; "G"; "A"; "B"]
14
- major |> should equal expected
11
+ let ``Chromatic scale with sharps`` () =
12
+ pitches "C" None |> should equal ["C"; "C#"; "D"; "D#"; "E"; "F"; "F#"; "G"; "G#"; "A"; "A#"; "B"]
13
+
14
+ [<Fact(Skip = "Remove to run test")>]
15
+ let ``Chromatic scale with flats`` () =
16
+ pitches "F" None |> should equal ["F"; "Gb"; "G"; "Ab"; "A"; "Bb"; "B"; "C"; "Db"; "D"; "Eb"; "E"]
17
+
18
+ [<Fact(Skip = "Remove to run test")>]
19
+ let ``Simple major scale`` () =
20
+ pitches "C" (Some "MMmMMMm") |> should equal ["C"; "D"; "E"; "F"; "G"; "A"; "B"]
15
21
 
16
22
  [<Fact(Skip = "Remove to run test")>]
17
- let ``Another major scale`` () =
18
- let major = pitches "G" "MMmMMMm"
19
- let expected = ["G"; "A"; "B"; "C"; "D"; "E"; "F#"]
20
- major |> should equal expected
23
+ let ``Major scale with sharps`` () =
24
+ pitches "G" (Some "MMmMMMm") |> should equal ["G"; "A"; "B"; "C"; "D"; "E"; "F#"]
21
25
 
22
26
  [<Fact(Skip = "Remove to run test")>]
23
- let ``Minor scale`` () =
24
- let minor = pitches "f#" "MmMMmMM"
25
- let expected = ["F#"; "G#"; "A"; "B"; "C#"; "D"; "E"]
26
- minor |> should equal expected
27
+ let ``Major scale with flats`` () =
28
+ pitches "F" (Some "MMmMMMm") |> should equal ["F"; "G"; "A"; "Bb"; "C"; "D"; "E"]
27
29
 
28
30
  [<Fact(Skip = "Remove to run test")>]
29
- let ``Another minor scale`` () =
30
- let minor = pitches "bb" "MmMMmMM"
31
- let expected = ["Bb"; "C"; "Db"; "Eb"; "F"; "Gb"; "Ab"]
32
- minor |> should equal expected
33
-
31
+ let ``Minor scale with sharps`` () =
32
+ pitches "f#" (Some "MmMMmMM") |> should equal ["F#"; "G#"; "A"; "B"; "C#"; "D"; "E"]
33
+
34
+ [<Fact(Skip = "Remove to run test")>]
35
+ let ``Minor scale with flats`` () =
36
+ pitches "bb" (Some "MmMMmMM") |> should equal ["Bb"; "C"; "Db"; "Eb"; "F"; "Gb"; "Ab"]
37
+
34
38
  [<Fact(Skip = "Remove to run test")>]
35
39
  let ``Dorian mode`` () =
36
- let dorian = pitches "d" "MmMMMmM"
37
- let expected = ["D"; "E"; "F"; "G"; "A"; "B"; "C"]
38
- dorian |> should equal expected
40
+ pitches "d" (Some "MmMMMmM") |> should equal ["D"; "E"; "F"; "G"; "A"; "B"; "C"]
39
41
 
40
42
  [<Fact(Skip = "Remove to run test")>]
41
43
  let ``Mixolydian mode`` () =
42
- let mixolydian = pitches "Eb" "MMmMMmM"
43
- let expected = ["Eb"; "F"; "G"; "Ab"; "Bb"; "C"; "Db"]
44
- mixolydian |> should equal expected
44
+ pitches "Eb" (Some "MMmMMmM") |> should equal ["Eb"; "F"; "G"; "Ab"; "Bb"; "C"; "Db"]
45
45
 
46
46
  [<Fact(Skip = "Remove to run test")>]
47
47
  let ``Lydian mode`` () =
48
- let lydian = pitches "a" "MMMmMMm"
49
- let expected = ["A"; "B"; "C#"; "D#"; "E"; "F#"; "G#"]
50
- lydian |> should equal expected
48
+ pitches "a" (Some "MMMmMMm") |> should equal ["A"; "B"; "C#"; "D#"; "E"; "F#"; "G#"]
51
49
 
52
50
  [<Fact(Skip = "Remove to run test")>]
53
51
  let ``Phrygian mode`` () =
54
- let phrygian = pitches "e" "mMMMmMM"
55
- let expected = ["E"; "F"; "G"; "A"; "B"; "C"; "D"]
56
- phrygian |> should equal expected
52
+ pitches "e" (Some "mMMMmMM") |> should equal ["E"; "F"; "G"; "A"; "B"; "C"; "D"]
57
53
 
58
54
  [<Fact(Skip = "Remove to run test")>]
59
55
  let ``Locrian mode`` () =
60
- let locrian = pitches "g" "mMMmMMM"
61
- let expected = ["G"; "Ab"; "Bb"; "C"; "Db"; "Eb"; "F"]
62
- locrian |> should equal expected
56
+ pitches "g" (Some "mMMmMMM") |> should equal ["G"; "Ab"; "Bb"; "C"; "Db"; "Eb"; "F"]
63
57
 
64
58
  [<Fact(Skip = "Remove to run test")>]
65
59
  let ``Harmonic minor`` () =
66
- let harmonicMinor = pitches "d" "MmMMmAm"
67
- let expected = ["D"; "E"; "F"; "G"; "A"; "Bb"; "Db"]
68
- harmonicMinor |> should equal expected
60
+ pitches "d" (Some "MmMMmAm") |> should equal ["D"; "E"; "F"; "G"; "A"; "Bb"; "Db"]
69
61
 
70
62
  [<Fact(Skip = "Remove to run test")>]
71
63
  let ``Octatonic`` () =
72
- let octatonic = pitches "C" "MmMmMmMm"
73
- let expected = ["C"; "D"; "D#"; "F"; "F#"; "G#"; "A"; "B"]
74
- octatonic |> should equal expected
64
+ pitches "C" (Some "MmMmMmMm") |> should equal ["C"; "D"; "D#"; "F"; "F#"; "G#"; "A"; "B"]
75
65
 
76
66
  [<Fact(Skip = "Remove to run test")>]
77
67
  let ``Hexatonic`` () =
78
- let hexatonic = pitches "Db" "MMMMMM"
79
- let expected = ["Db"; "Eb"; "F"; "G"; "A"; "B"]
80
- hexatonic |> should equal expected
68
+ pitches "Db" (Some "MMMMMM") |> should equal ["Db"; "Eb"; "F"; "G"; "A"; "B"]
81
69
 
82
70
  [<Fact(Skip = "Remove to run test")>]
83
71
  let ``Pentatonic`` () =
84
- let pentatonic = pitches "A" "MMAMA"
85
- let expected = ["A"; "B"; "C#"; "E"; "F#"]
86
- pentatonic |> should equal expected
72
+ pitches "A" (Some "MMAMA") |> should equal ["A"; "B"; "C#"; "E"; "F#"]
87
73
 
88
74
  [<Fact(Skip = "Remove to run test")>]
89
75
  let ``Enigmatic`` () =
90
- let enigmatic = pitches "G" "mAMMMmm"
91
- let expected = ["G"; "G#"; "B"; "C#"; "D#"; "F"; "F#"]
92
- enigmatic |> should equal expected
76
+ pitches "G" (Some "mAMMMmm") |> should equal ["G"; "G#"; "B"; "C#"; "D#"; "F"; "F#"]
77
+
@@ -12,7 +12,7 @@ type TestMethod =
12
12
 
13
13
  type TestMethodBody =
14
14
  { Arrange: string list
15
- Assert: string }
15
+ Assert: string list }
16
16
 
17
17
  type TestMethodBodyAssert =
18
18
  { Sut: string
@@ -56,7 +56,7 @@ type GeneratorExercise() =
56
56
  abstract member RenderExpected : CanonicalDataCase * string * obj -> string
57
57
  abstract member RenderInput : CanonicalDataCase * string * obj -> string
58
58
  abstract member RenderArrange : CanonicalDataCase -> string list
59
- abstract member RenderAssert : CanonicalDataCase -> string
59
+ abstract member RenderAssert : CanonicalDataCase -> string list
60
60
  abstract member RenderSut : CanonicalDataCase -> string
61
61
  abstract member RenderSutParameters : CanonicalDataCase -> string list
62
62
  abstract member RenderSutParameter : CanonicalDataCase * string * obj -> string
@@ -252,7 +252,8 @@ type GeneratorExercise() =
252
252
 
253
253
  canonicalDataCase
254
254
  |> this.ToTestMethodBodyAssert
255
- |> renderPartialTemplate template
255
+ |> renderPartialTemplate template
256
+ |> List.singleton
256
257
 
257
258
  default this.RenderSut canonicalDataCase =
258
259
  let parameters = this.RenderSutParameters canonicalDataCase
@@ -26,24 +26,23 @@ type Allergies() =
26
26
 
27
27
  let toAllergen (jToken: JToken) = sprintf "Allergen.%s" (jToken.ToString() |> String.humanize)
28
28
 
29
- override this.RenderTestMethodBody canonicalDataCase =
30
- if (canonicalDataCase.Property = "allergicTo") then
31
- let renderAssertion (jToken: JToken) =
32
- let updatedInput =
33
- canonicalDataCase.Input
34
- |> Map.add "substance" (jToken.["substance"] |> toAllergen |> box)
35
-
36
- { canonicalDataCase with
37
- Input = updatedInput
38
- Expected = jToken.["result"].ToObject<bool>() |> box }
39
- |> this.RenderAssert
40
- |> indent 1
29
+ let renderAllergicToAssert canonicalDataCase (jToken: JToken) =
30
+ let substance = jToken.["substance"] |> toAllergen
31
+ let score = canonicalDataCase.Input.["score"] :?> int64
32
+ let sut = sprintf "allergicTo %d %s" score substance
33
+ let expected = jToken.Value<bool>("result") |> formatBool
34
+
35
+ { Sut = sut; Expected = expected }
36
+ |> renderPartialTemplate "AssertEqual"
41
37
 
38
+ override __.RenderAssert canonicalDataCase =
39
+ match canonicalDataCase.Property with
40
+ | "allergicTo" ->
42
41
  canonicalDataCase.Expected :?> JArray
43
- |> Seq.map renderAssertion
44
- |> String.concat "\n"
45
- else
46
- base.RenderTestMethodBody canonicalDataCase
42
+ |> Seq.map (renderAllergicToAssert canonicalDataCase)
43
+ |> Seq.toList
44
+ | _ ->
45
+ base.RenderAssert canonicalDataCase
47
46
 
48
47
  override __.RenderExpected (canonicalDataCase, key, value) =
49
48
  if (canonicalDataCase.Property = "list") then
@@ -118,6 +117,60 @@ type BinarySearch() =
118
117
  | _ ->
119
118
  base.RenderValueWithoutIdentifier (canonicalDataCase, key, value)
120
119
 
120
+ type BinarySearchTree() =
121
+ inherit GeneratorExercise()
122
+
123
+ let rec renderAssertions previousPaths (tree: JObject) =
124
+ let previousPath = previousPaths |> List.rev |> String.concat " |> "
125
+ let rootPath = List.length previousPaths = 1
126
+
127
+ let renderDataAssertions =
128
+ let dataPath = if rootPath then "data" else "Option.map data"
129
+ let data = tree.["data"]
130
+
131
+ match data.Type with
132
+ | JTokenType.Null ->
133
+ let expected = if rootPath then failwith "Invalid data" else "None"
134
+ [ sprintf "%s |> %s |> should equal %s" previousPath dataPath expected ]
135
+ | _ ->
136
+ let data = (data :?> JValue).ToObject<int>()
137
+ let expected = if rootPath then string data else sprintf "(Some %d)" data
138
+ [ sprintf "%s |> %s |> should equal %s" previousPath dataPath expected ]
139
+
140
+ let renderNodeAssertions nodeName (node: JToken) =
141
+ let nodePath = if rootPath then nodeName else sprintf "Option.bind %s" nodeName
142
+
143
+ match node.Type with
144
+ | JTokenType.Null ->
145
+ [ sprintf "%s |> %s |> should equal None" previousPath nodePath ]
146
+ | _ ->
147
+ renderAssertions (nodePath :: previousPaths) (node :?> JObject)
148
+
149
+ [ renderDataAssertions
150
+ renderNodeAssertions "left" tree.["left"]
151
+ renderNodeAssertions "right" tree.["right"] ]
152
+ |> List.concat
153
+
154
+ override __.RenderAssert canonicalDataCase =
155
+ match canonicalDataCase.Property with
156
+ | "data" ->
157
+ canonicalDataCase.Expected :?> JObject
158
+ |> renderAssertions ["treeData"]
159
+ | _ -> base.RenderAssert canonicalDataCase
160
+
161
+ override __.RenderInput (_, _, value) =
162
+ value :?> JArray
163
+ |> Seq.map string
164
+ |> formatList
165
+ |> sprintf "create %s"
166
+
167
+ override __.RenderExpected (canonicalDataCase, key, value) =
168
+ match value with
169
+ | :? JArray as jArray -> jArray |> Seq.map string |> formatList
170
+ | _ -> base.RenderExpected (canonicalDataCase, key, value)
171
+
172
+ override this.PropertiesWithIdentifier canonicalDataCase = this.PropertiesUsedAsSutParameter canonicalDataCase
173
+
121
174
  type Bob() =
122
175
  inherit GeneratorExercise()
123
176
 
@@ -136,7 +189,7 @@ type Bowling() =
136
189
 
137
190
  override __.RenderSut _ ="score game"
138
191
 
139
- override __.RenderSetup canonicalDataCase =
192
+ override __.RenderSetup _ =
140
193
  "let rollMany rolls game = List.fold (fun game pins -> roll pins game) game rolls"
141
194
 
142
195
  override __.RenderArrange canonicalDataCase =
@@ -180,7 +233,7 @@ type CircularBuffer() =
180
233
 
181
234
  override __.AdditionalNamespaces = [ "System" ]
182
235
 
183
- override __.RenderAssert _ = ""
236
+ override __.RenderAssert _ = []
184
237
 
185
238
  member __.ExceptionCheck command =
186
239
  sprintf "(fun () -> %s |> ignore) |> should throw typeof<Exception>" command
@@ -273,10 +326,11 @@ type ComplexNumbers() =
273
326
 
274
327
  let renderNumber (input: JToken) =
275
328
  match string input with
276
- | "e" -> "Math.E"
277
- | "pi" -> "Math.PI"
278
- | int when int.IndexOf('.') = -1 -> sprintf "%s.0" int
279
- | float -> float
329
+ | "e" -> "Math.E"
330
+ | "pi" -> "Math.PI"
331
+ | "ln(2)" -> "(Math.Log(2.0))"
332
+ | i when i.IndexOf('.') = -1 -> sprintf "%s.0" i
333
+ | float -> float
280
334
 
281
335
  let renderComplexNumber (input: JArray) =
282
336
  sprintf "(create %s %s)" (renderNumber input.[0]) (renderNumber input.[1])
@@ -294,9 +348,8 @@ type ComplexNumbers() =
294
348
  { Sut = sprintf "%s sut" testedFunction; Expected = expected }
295
349
  |> renderPartialTemplate "AssertEqualWithin"
296
350
 
297
- [ renderAssertion "real" (renderNumber jArray.[0])
298
- renderAssertion "imaginary" (renderNumber jArray.[1]) |> indent 1 ]
299
- |> String.concat "\n"
351
+ [ jArray.[0] |> renderNumber |> renderAssertion "real"
352
+ jArray.[1] |> renderNumber |> renderAssertion "imaginary" ]
300
353
  | _ ->
301
354
  base.RenderAssert(canonicalDataCase)
302
355
 
@@ -1012,10 +1065,7 @@ type React() =
1012
1065
  )
1013
1066
  |> Seq.toList
1014
1067
 
1015
- override __.RenderAssert _ =
1016
- // skip this method
1017
- // because for this task we have multiple assert statements
1018
- ""
1068
+ override __.RenderAssert _ = []
1019
1069
 
1020
1070
  override this.RenderArrange canonicalDataCase =
1021
1071
  let initialVars = this.RenderCells canonicalDataCase
@@ -1157,6 +1207,22 @@ type Say() =
1157
1207
 
1158
1208
  override __.RenderInput (_, _, value) = sprintf "%sL" (string value)
1159
1209
 
1210
+ type ScaleGenerator() =
1211
+ inherit GeneratorExercise()
1212
+
1213
+ override __.MapCanonicalDataCaseInput (canonicalDataCase, properties) =
1214
+ let input = base.MapCanonicalDataCaseInput (canonicalDataCase, properties)
1215
+ match Map.tryFind "intervals" input with
1216
+ | Some _ -> input
1217
+ | None -> Map.add "intervals" null input
1218
+
1219
+ override __.RenderInput (canonicalDataCase, key, value) =
1220
+ match key with
1221
+ | "intervals" -> value |> Option.ofObj |> formatValue |> parenthesizeOption
1222
+ | _ -> base.RenderInput (canonicalDataCase, key, value)
1223
+
1224
+ override __.PropertiesUsedAsSutParameter _ = ["tonic"; "intervals"]
1225
+
1160
1226
  type ScrabbleScore() =
1161
1227
  inherit GeneratorExercise()
1162
1228
 
@@ -1,3 +1,3 @@
1
1
  [<Fact{% if Skip %}(Skip = "Remove to run test"){% endif %}>]
2
2
  let ``{{ Name }}`` () =
3
- {{ Body }}
3
+ {{ Body }}
@@ -1,4 +1,6 @@
1
1
  {%- for arrange in Arrange -%}
2
2
  {{ arrange | indent }}
3
3
  {%- endfor -%}
4
- {{ Assert | indent }}
4
+ {%- for assert in Assert -%}
5
+ {{ assert | indent }}
6
+ {%- endfor -%}
@@ -1,3 +1,3 @@
1
1
  [<Fact{% if Skip %}(Skip = "Remove to run test"){% endif %}>]
2
2
  member this.``{{ Name }}`` () =
3
- {{ Body }}
3
+ {{ Body }}
@@ -1,4 +1,6 @@
1
1
  {%- for arrange in Arrange -%}
2
2
  {{ arrange | indent | indent }}
3
3
  {%- endfor -%}
4
- {{ Assert | indent | indent }}
4
+ {%- for assert in Assert -%}
5
+ {{ assert | indent | indent }}
6
+ {%- endfor -%}
@@ -165,10 +165,9 @@ func BenchmarkNewList(b *testing.B) {
165
165
  }
166
166
 
167
167
  func BenchmarkListSize(b *testing.B) {
168
+ list := New(array1To10)
169
+ b.ResetTimer()
168
170
  for i := 0; i < b.N; i++ {
169
- b.StopTimer()
170
- list := New(array1To10)
171
- b.StartTimer()
172
171
  _ = list.Size()
173
172
  }
174
173
  }
@@ -176,35 +175,40 @@ func BenchmarkListSize(b *testing.B) {
176
175
  func BenchmarkListPush(b *testing.B) {
177
176
  for i := 0; i < b.N; i++ {
178
177
  b.StopTimer()
179
- list := New(array1To10)
178
+ list := New([]int{})
180
179
  b.StartTimer()
181
- list.Push(11)
180
+ for k := 0; k < 1000; k++ {
181
+ list.Push(k)
182
+ }
182
183
  }
183
184
  }
184
185
 
185
186
  func BenchmarkListPop(b *testing.B) {
186
187
  for i := 0; i < b.N; i++ {
187
188
  b.StopTimer()
188
- list := New(array1To10)
189
+ list := New([]int{})
190
+ for k := 0; k < 1000; k++ {
191
+ list.Push(k)
192
+ }
189
193
  b.StartTimer()
190
- _, _ = list.Pop()
194
+ for k := 0; k < 1000; k++ {
195
+ _, _ = list.Pop()
196
+ }
191
197
  }
192
198
  }
193
199
 
194
200
  func BenchmarkListToArray(b *testing.B) {
201
+ list := New(array1To10)
202
+ b.ResetTimer()
195
203
  for i := 0; i < b.N; i++ {
196
- b.StopTimer()
197
- list := New(array1To10)
198
- b.StartTimer()
199
204
  _ = list.Array()
200
205
  }
201
206
  }
202
207
 
203
208
  func BenchmarkListReverse(b *testing.B) {
209
+ list := New(array1To10)
210
+ b.ResetTimer()
204
211
  for i := 0; i < b.N; i++ {
205
- b.StopTimer()
206
- list := New(array1To10)
207
- b.StartTimer()
208
212
  _ = list.Reverse()
209
213
  }
210
214
  }
@@ -314,6 +314,16 @@
314
314
  "topics": [
315
315
  ]
316
316
  },
317
+ {
318
+ "uuid": "f750e380-fe16-42c0-8b3d-8acd7e443a6e",
319
+ "slug": "protein-translation",
320
+ "core": false,
321
+ "unlocked_by": null,
322
+ "difficulty": 3,
323
+ "topics": [
324
+ "Maybe"
325
+ ]
326
+ },
317
327
  {
318
328
  "uuid": "67c53230-82e8-4207-a811-abec27bef381",
319
329
  "slug": "anagram",
@@ -1,5 +1,5 @@
1
1
  name: all-your-base
2
- version: 2.1.0.6
2
+ version: 2.3.0.7
3
3
 
4
4
  dependencies:
5
5
  - base
@@ -104,7 +104,7 @@ cases = [ Case { description = "single bit one to decimal"
104
104
  }
105
105
  , Case { description = "input base is one"
106
106
  , inputBase = 1
107
- , inputDigits = []
107
+ , inputDigits = [0]
108
108
  , outputBase = 10
109
109
  , outputDigits = Nothing
110
110
  }
@@ -1,5 +1,5 @@
1
1
  name: bowling
2
- version: 1.1.0.5
2
+ version: 1.2.0.6
3
3
 
4
4
  dependencies:
5
5
  - base
@@ -136,5 +136,13 @@ cases = [ Case { description = "should be able to score a game with all zeros"
136
136
  , rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3]
137
137
  , expected = Left IncompleteGame
138
138
  }
139
+ , Case { description = "cannot roll after bonus roll for spare"
140
+ , rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 2, 2]
141
+ , expected = Left $ InvalidRoll 21 2
142
+ }
143
+ , Case { description = "cannot roll after bonus rolls for strike"
144
+ , rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 3, 2, 2]
145
+ , expected = Left $ InvalidRoll 21 2
146
+ }
139
147
  ]
140
148
 
@@ -1,5 +1,5 @@
1
1
  name: complex-numbers
2
- version: 1.2.0.2
2
+ version: 1.3.0.3
3
3
 
4
4
  dependencies:
5
5
  - base
@@ -9,8 +9,8 @@ oneRow :: Char -> (Int, Int) -> String
9
9
  oneRow c (0, y) = pad y ++ [c] ++ pad y
10
10
  oneRow c (x, y) = pad y ++ [c] ++ pad x ++ [c] ++ pad y
11
11
 
12
- diamond :: Char -> [String]
13
- diamond = (\x -> x ++ tail (reverse x)) . mkTop . subtract 64 . ord
12
+ diamond :: Char -> Maybe [String]
13
+ diamond = Just . (\x -> x ++ tail (reverse x)) . mkTop . subtract 64 . ord
14
14
  where rows x = zip (0 : take (x-1) [1, 3..]) [x-1, x-2..0]
15
15
  mkTop = zipWith oneRow abc . rows
16
16
  abc = map chr [65..90]
@@ -1,5 +1,5 @@
1
1
  name: diamond
2
- version: 1.1.0.2
2
+ version: 1.1.0.3
3
3
 
4
4
  dependencies:
5
5
  - base