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
@@ -6,15 +6,19 @@
6
6
 
7
7
  (defun contains-alpha-chars-p (msg)
8
8
  (some #'(lambda (c) (char-not-greaterp #\a c #\z))
9
- (coerce msg 'list)))
9
+ (coerce msg 'list)))
10
10
 
11
- (defun silence-p (msg) (equal "" (string-trim '(#\Space) msg)))
11
+ (defun silence-p (msg) (equal "" (string-trim '(#\Space #\Newline #\Tab #\Page) msg)))
12
12
  (defun shouting-p (msg) (and (contains-alpha-chars-p msg)
13
- (equal msg (string-upcase msg))))
14
- (defun questioning-p (msg) (equal #\? (char msg (1- (length msg)))))
13
+ (equal msg (string-upcase msg))))
14
+ (defun questioning-p (msg)
15
+ (let ((msg (string-trim '(#\Space #\Newline #\Tab #\Page) msg)))
16
+ (equal #\? (char msg (1- (length msg))))))
15
17
 
16
18
  (defun response-for (msg)
17
19
  (cond ((silence-p msg) "Fine. Be that way!")
18
- ((shouting-p msg) "Whoa, chill out!")
19
- ((questioning-p msg) "Sure.")
20
- (t "Whatever.")))
20
+ ((and (shouting-p msg)
21
+ (questioning-p msg)) "Calm down, I know what I'm doing!")
22
+ ((shouting-p msg) "Whoa, chill out!")
23
+ ((questioning-p msg) "Sure.")
24
+ (t "Whatever.")))
@@ -15,7 +15,7 @@ as separate command-line tools.
15
15
  ### Prerequisite: A Modern C++11 Compiler
16
16
 
17
17
  This language track requires a compiler with [C++11](http://en.wikipedia.org/wiki/C%2B%2B11)
18
- support, which was release in 2011. All major compilers released in the last few years should
18
+ support, which was released in 2011. All major compilers released in the last few years should
19
19
  be compatible, so as long as you are on a fairly recent version you should be fine.
20
20
  Specifically, GCC version 5.1 or later, Clang version 3.8 or later, or Visual
21
21
  Studio 2015 or later.
@@ -25,6 +25,6 @@ BOOST_AUTO_TEST_CASE(turn_of_the_21st_century)
25
25
 
26
26
  BOOST_AUTO_TEST_CASE(turn_of_the_25th_century)
27
27
  {
28
- BOOST_REQUIRE(leap::is_leap_year(2400));;
28
+ BOOST_REQUIRE(leap::is_leap_year(2400));
29
29
  }
30
30
  #endif
@@ -32,7 +32,7 @@ defmodule PigLatin do
32
32
  end
33
33
 
34
34
  defp consonant_prefix_and_rest(word) do
35
- if Regex.match?(~r/^yt|xr/, word) do
35
+ if Regex.match?(~r/^[yx][bcdfghjklmnpqrstvwxy]+/, word) do
36
36
  ["", word]
37
37
  else
38
38
  ~r/^(s?qu|(?:[^aeiou]*))?([aeiou].*)$/
@@ -40,4 +40,3 @@ defmodule PigLatin do
40
40
  end
41
41
  end
42
42
  end
43
-
@@ -82,7 +82,7 @@ defmodule PigLatinTest do
82
82
  end
83
83
  end
84
84
 
85
- describe "some letter clusters are treated like a single consonant" do
85
+ describe "consecutive consonants are treated like a single consonant" do
86
86
  @tag :pending
87
87
  test "word beginning with ch" do
88
88
  assert PigLatin.translate("chair") == "airchay"
@@ -114,16 +114,26 @@ defmodule PigLatinTest do
114
114
  end
115
115
  end
116
116
 
117
- describe "some letter clusters are treated like a single vowel" do
117
+ describe "'x' and 'y', when followed by a consonant, are treated like a vowel" do
118
118
  @tag :pending
119
- test "word beginning with yt" do
119
+ test "word beginning with y, followed by a consonant" do
120
120
  assert PigLatin.translate("yttria") == "yttriaay"
121
121
  end
122
122
 
123
+ @tag :pending
124
+ test "word beginning with y, followed by another consonant" do
125
+ assert PigLatin.translate("yddria") == "yddriaay"
126
+ end
127
+
123
128
  @tag :pending
124
129
  test "word beginning with xr" do
125
130
  assert PigLatin.translate("xray") == "xrayay"
126
131
  end
132
+
133
+ @tag :pending
134
+ test "word beginning with xb" do
135
+ assert PigLatin.translate("xbot") == "xbotay"
136
+ end
127
137
  end
128
138
 
129
139
  describe "phrases are translated" do
@@ -133,4 +143,3 @@ defmodule PigLatinTest do
133
143
  end
134
144
  end
135
145
  end
136
-
@@ -323,7 +323,7 @@
323
323
  ]
324
324
  },
325
325
  {
326
- "uuid": "1f52ab74-02d5-db80-8f95-521aba04d183e704422",
326
+ "uuid": "0edd5fa2-f1db-4572-9810-55a2c6729753",
327
327
  "slug": "collatz-conjecture",
328
328
  "core": false,
329
329
  "unlocked_by": null,
@@ -333,7 +333,7 @@
333
333
  ]
334
334
  },
335
335
  {
336
- "uuid": "7890045d-0cf5-1980-21ae-7bd0228ad2a2993ae82",
336
+ "uuid": "bdb8364b-d8b2-4d58-a824-1035cddedb42",
337
337
  "slug": "all-your-base",
338
338
  "core": false,
339
339
  "unlocked_by": null,
@@ -343,7 +343,7 @@
343
343
  ]
344
344
  },
345
345
  {
346
- "uuid": "a730ca85-057d-db80-e44e-25b8028acede6337cca",
346
+ "uuid": "b7e456d7-e383-4e03-9126-c9b57c1287e1",
347
347
  "slug": "pascals-triangle",
348
348
  "core": false,
349
349
  "unlocked_by": null,
@@ -354,7 +354,7 @@
354
354
  ]
355
355
  },
356
356
  {
357
- "uuid": "5f540090-061e-2f80-40a8-d9782700ed2efdf8965",
357
+ "uuid": "6b6e9f4d-9c45-4d8c-9e8e-b2144204d2da",
358
358
  "slug": "isogram",
359
359
  "core": false,
360
360
  "unlocked_by": null,
@@ -6,7 +6,9 @@ import String
6
6
 
7
7
  hey : String -> String
8
8
  hey remark =
9
- if isShouting remark then
9
+ if isShouting remark && isQuestion remark then
10
+ "Calm down, I know what I'm doing!"
11
+ else if isShouting remark then
10
12
  "Whoa, chill out!"
11
13
  else if isQuestion remark then
12
14
  "Sure."
@@ -6,6 +6,8 @@ Bob answers 'Sure.' if you ask him a question.
6
6
 
7
7
  He answers 'Whoa, chill out!' if you yell at him.
8
8
 
9
+ He answers 'Calm down, I know what I'm doing!' if you yell a question at him.
10
+
9
11
  He says 'Fine. Be that way!' if you address him without actually saying
10
12
  anything.
11
13
 
@@ -61,7 +61,7 @@ tests =
61
61
  test "forceful questions" <|
62
62
  \() ->
63
63
  Expect.equal
64
- "Whoa, chill out!"
64
+ "Calm down, I know what I'm doing!"
65
65
  (Bob.hey "WHAT THE HELL WERE YOU THINKING?")
66
66
  , skip <|
67
67
  test "shouting numbers" <|
@@ -1,28 +1,43 @@
1
1
  module PhoneNumber exposing (..)
2
2
 
3
- import String
3
+ import List exposing (head, map)
4
+ import Maybe exposing (andThen)
5
+ import Regex exposing (HowMany(..), Regex, find, regex)
6
+ import String exposing (concat, length, slice, startsWith)
4
7
 
5
8
 
6
- nums =
7
- [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' ]
9
+ matchesFormat : Regex -> String -> Bool
10
+ matchesFormat regex string =
11
+ case find (AtMost 1) regex string |> head of
12
+ Just found ->
13
+ True
8
14
 
15
+ Nothing ->
16
+ False
9
17
 
10
- getNumber : String -> Maybe String
11
- getNumber text =
12
- getValidNum (String.filter isDigit text)
13
-
14
-
15
- isDigit : Char -> Bool
16
- isDigit char =
17
- List.any (\n -> n == char) nums
18
18
 
19
-
20
- getValidNum : String -> Maybe String
21
- getValidNum num =
22
- if String.length num == 10 then
23
- Just num
24
- else if (String.length num == 11) && (String.left 1 num == "1") then
25
- Just (String.dropLeft 1 num)
19
+ getNumber : String -> Maybe String
20
+ getNumber phoneNumber =
21
+ let
22
+ numberFormat =
23
+ regex "^\\D*(\\+?1\\s*[\\-\\.]?\\s*)?((\\([2-9]\\d{2}\\))|([2-9]\\d{2}))\\s*[\\-\\.]?\\s*[2-9]\\d{2}\\s*[\\-\\.]?\\s*\\d{4}\\D*$"
24
+
25
+ numbers =
26
+ regex "\\d"
27
+
28
+ dropCountryCode matchedNumbers =
29
+ case matchedNumbers of
30
+ "1" :: nums ->
31
+ nums
32
+
33
+ _ ->
34
+ matchedNumbers
35
+
36
+ stripNumber =
37
+ concat << dropCountryCode << map .match << find All numbers
38
+ in
39
+ if phoneNumber |> matchesFormat numberFormat then
40
+ Just <| stripNumber <| phoneNumber
26
41
  else
27
42
  Nothing
28
43
 
@@ -9,38 +9,59 @@ tests : Test
9
9
  tests =
10
10
  describe "PhoneNumber"
11
11
  [ test "cleans number" <|
12
- \() -> Expect.equal (Just "1234567890") (getNumber "(123) 456-7890")
12
+ \() -> Expect.equal (Just "2234567890") (getNumber "(223) 456-7890")
13
+ , skip <|
14
+ test "invalid when empty" <|
15
+ \() -> Expect.equal Nothing (getNumber "")
13
16
  , skip <|
14
17
  test "cleans number with dots" <|
15
- \() -> Expect.equal (Just "1234567890") (getNumber "123.456.7890")
18
+ \() -> Expect.equal (Just "2234567890") (getNumber "223.456.7890")
19
+ , skip <|
20
+ test "invalid when 9 digits" <|
21
+ \() -> Expect.equal Nothing (getNumber "223456789")
22
+ , skip <|
23
+ test "cleans number with multiple spaces" <|
24
+ \() -> Expect.equal (Just "2234567890") (getNumber "223 456 7890")
25
+ , skip <|
26
+ test "invalid when 12 digits" <|
27
+ \() -> Expect.equal Nothing (getNumber "223456789012")
16
28
  , skip <|
17
29
  test "valid when 11 digits and first is 1" <|
18
- \() -> Expect.equal (Just "1234567890") (getNumber "11234567890")
30
+ \() -> Expect.equal (Just "2234567890") (getNumber "12234567890")
19
31
  , skip <|
20
- test "invalid when 11 digits" <|
21
- \() -> Expect.equal Nothing (getNumber "21234567890")
32
+ test "invalid when 11 digits and first is not 1" <|
33
+ \() -> Expect.equal Nothing (getNumber "22234567890")
22
34
  , skip <|
23
- test "invalid when 9 digits" <|
24
- \() -> Expect.equal Nothing (getNumber "123456789")
35
+ test "valid when 11 digits and first is 1 with punctuation" <|
36
+ \() -> Expect.equal (Just "2234567890") (getNumber "+1 (223) 456-7890")
25
37
  , skip <|
26
- test "invalid when 12 digits" <|
27
- \() -> Expect.equal Nothing (getNumber "123456789012")
38
+ test "invalid with letters" <|
39
+ \() -> Expect.equal Nothing (getNumber "223-abc-789012")
28
40
  , skip <|
29
- test "invalid when empty" <|
30
- \() -> Expect.equal Nothing (getNumber "")
41
+ test "invalid with multiple punctuation marks" <|
42
+ \() -> Expect.equal Nothing (getNumber "223-@:!-789012")
31
43
  , skip <|
32
- test "invalid when no digits present" <|
33
- \() -> Expect.equal Nothing (getNumber " (-) ")
44
+ test "invalid when area code starts with 1" <|
45
+ \() -> Expect.equal Nothing (getNumber "(123) 456-7890")
46
+ , skip <|
47
+ test "invalid when area code starts with 0" <|
48
+ \() -> Expect.equal Nothing (getNumber "(023) 456-7890")
34
49
  , skip <|
35
- test "valid with leading characters" <|
36
- \() -> Expect.equal (Just "1234567890") (getNumber "my number is 123 456 7890")
50
+ test "invalid when exchange code starts with 1" <|
51
+ \() -> Expect.equal Nothing (getNumber "(223) 156-7890")
37
52
  , skip <|
38
- test "valid with trailing characters" <|
39
- \() -> Expect.equal (Just "1234567890") (getNumber "123 456 7890 - bob")
53
+ test "invalid when exchange code starts with 0" <|
54
+ \() -> Expect.equal Nothing (getNumber "(223) 056-7890")
55
+ , skip <|
56
+ test "invalid when N in exchange code is 1" <|
57
+ \() -> Expect.equal Nothing (getNumber "2341567890")
58
+ , skip <|
59
+ test "invalid when no digits present" <|
60
+ \() -> Expect.equal Nothing (getNumber " (-) ")
40
61
  , skip <|
41
62
  test "pretty print" <|
42
- \() -> Expect.equal (Just "(123) 456-7890") (prettyPrint "1234567890")
63
+ \() -> Expect.equal (Just "(223) 456-7890") (prettyPrint "2234567890")
43
64
  , skip <|
44
65
  test "pretty print with full us phone number" <|
45
- \() -> Expect.equal (Just "(123) 456-7890") (prettyPrint "11234567890")
66
+ \() -> Expect.equal (Just "(223) 456-7890") (prettyPrint "12234567890")
46
67
  ]
@@ -9,26 +9,26 @@ tests : Test
9
9
  tests =
10
10
  describe "SpaceAge"
11
11
  [ test "age in earth years" <|
12
- \() -> Expect.equal 32 (round (ageOn Earth 1000000000))
12
+ \() -> Expect.equal 32 (round (ageOn Earth 1000000000.0))
13
13
  , skip <|
14
14
  test "age in mercury years" <|
15
- \() -> Expect.equal 281 (round (ageOn Mercury 2134835688))
15
+ \() -> Expect.equal 281 (round (ageOn Mercury 2134835688.0))
16
16
  , skip <|
17
17
  test "age in venus years" <|
18
- \() -> Expect.equal 10 (round (ageOn Venus 189839836))
18
+ \() -> Expect.equal 10 (round (ageOn Venus 189839836.0))
19
19
  , skip <|
20
20
  test "age on mars" <|
21
- \() -> Expect.equal 39 (round (ageOn Mars 2329871239))
21
+ \() -> Expect.equal 39 (round (ageOn Mars 2329871239.0))
22
22
  , skip <|
23
23
  test "age on jupiter" <|
24
- \() -> Expect.equal 2 (round (ageOn Jupiter 901876382))
24
+ \() -> Expect.equal 2 (round (ageOn Jupiter 901876382.0))
25
25
  , skip <|
26
26
  test "age on saturn" <|
27
- \() -> Expect.equal 3 (round (ageOn Saturn 3000000000))
27
+ \() -> Expect.equal 3 (round (ageOn Saturn 3000000000.0))
28
28
  , skip <|
29
29
  test "age on uranus" <|
30
- \() -> Expect.equal 1 (round (ageOn Uranus 3210123456))
30
+ \() -> Expect.equal 1 (round (ageOn Uranus 3210123456.0))
31
31
  , skip <|
32
32
  test "age on neptune" <|
33
- \() -> Expect.equal 2 (round (ageOn Neptune 8210123456))
33
+ \() -> Expect.equal 2 (round (ageOn Neptune 8210123456.0))
34
34
  ]
@@ -1,4 +1,4 @@
1
- // This file was auto-generated based on version 2.1.0 of the canonical data.
1
+ // This file was auto-generated based on version 2.3.0 of the canonical data.
2
2
 
3
3
  module AllYourBaseTest
4
4
 
@@ -105,7 +105,7 @@ let ``Leading zeros`` () =
105
105
 
106
106
  [<Fact(Skip = "Remove to run test")>]
107
107
  let ``Input base is one`` () =
108
- let digits = []
108
+ let digits = [0]
109
109
  let inputBase = 1
110
110
  let outputBase = 10
111
111
  let expected = None
@@ -4,12 +4,8 @@ let left node = failwith "You need to implement this function."
4
4
 
5
5
  let right node = failwith "You need to implement this function."
6
6
 
7
- let value node = failwith "You need to implement this function."
7
+ let data node = failwith "You need to implement this function."
8
8
 
9
- let singleton value = failwith "You need to implement this function."
9
+ let create items = failwith "You need to implement this function."
10
10
 
11
- let rec insert newValue tree = failwith "You need to implement this function."
12
-
13
- let toList tree = failwith "You need to implement this function."
14
-
15
- let fromList xs = failwith "You need to implement this function."
11
+ let sortedData node = failwith "You need to implement this function."
@@ -1,61 +1,87 @@
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 BinarySearchTreeTest
4
4
 
5
- open Xunit
6
5
  open FsUnit.Xunit
6
+ open Xunit
7
+
7
8
  open BinarySearchTree
8
9
 
9
10
  [<Fact>]
10
11
  let ``Data is retained`` () =
11
- let tree = singleton 4
12
- tree |> value |> should equal <| Some 4
12
+ let treeData = create [4]
13
+ treeData |> data |> should equal 4
14
+ treeData |> left |> should equal None
15
+ treeData |> right |> should equal None
13
16
 
14
17
  [<Fact(Skip = "Remove to run test")>]
15
- let ``Inserting less`` () =
16
- let tree = singleton 4 |> insert 2
17
- tree |> value |> should equal <| Some 4
18
- tree |> left |> Option.bind value |> should equal <| Some 2
18
+ let ``Can create complex tree`` () =
19
+ let treeData = create [4; 2; 6; 1; 3; 5; 7]
20
+ treeData |> data |> should equal 4
21
+ treeData |> left |> Option.map data |> should equal (Some 2)
22
+ treeData |> left |> Option.bind left |> Option.map data |> should equal (Some 1)
23
+ treeData |> left |> Option.bind left |> Option.bind left |> should equal None
24
+ treeData |> left |> Option.bind left |> Option.bind right |> should equal None
25
+ treeData |> left |> Option.bind right |> Option.map data |> should equal (Some 3)
26
+ treeData |> left |> Option.bind right |> Option.bind left |> should equal None
27
+ treeData |> left |> Option.bind right |> Option.bind right |> should equal None
28
+ treeData |> right |> Option.map data |> should equal (Some 6)
29
+ treeData |> right |> Option.bind left |> Option.map data |> should equal (Some 5)
30
+ treeData |> right |> Option.bind left |> Option.bind left |> should equal None
31
+ treeData |> right |> Option.bind left |> Option.bind right |> should equal None
32
+ treeData |> right |> Option.bind right |> Option.map data |> should equal (Some 7)
33
+ treeData |> right |> Option.bind right |> Option.bind left |> should equal None
34
+ treeData |> right |> Option.bind right |> Option.bind right |> should equal None
19
35
 
20
36
  [<Fact(Skip = "Remove to run test")>]
21
- let ``Inserting same`` () =
22
- let tree = singleton 4 |> insert 4
23
- tree |> value |> should equal <| Some 4
24
- tree |> left |> Option.bind value |> should equal <| Some 4
37
+ let ``Smaller number at left node`` () =
38
+ let treeData = create [4; 2]
39
+ treeData |> data |> should equal 4
40
+ treeData |> left |> Option.map data |> should equal (Some 2)
41
+ treeData |> left |> Option.bind left |> should equal None
42
+ treeData |> left |> Option.bind right |> should equal None
43
+ treeData |> right |> should equal None
25
44
 
26
45
  [<Fact(Skip = "Remove to run test")>]
27
- let ``Inserting greater`` () =
28
- let tree = singleton 4 |> insert 5
29
- tree |> value |> should equal <| Some 4
30
- tree |> right |> Option.bind value |> should equal <| Some 5
46
+ let ``Same number at left node`` () =
47
+ let treeData = create [4; 4]
48
+ treeData |> data |> should equal 4
49
+ treeData |> left |> Option.map data |> should equal (Some 4)
50
+ treeData |> left |> Option.bind left |> should equal None
51
+ treeData |> left |> Option.bind right |> should equal None
52
+ treeData |> right |> should equal None
31
53
 
32
54
  [<Fact(Skip = "Remove to run test")>]
33
- let ``Complex tree`` () =
34
- let tree = fromList [4; 2; 6; 1; 3; 7; 5]
35
- tree |> value |> should equal <| Some 4
36
- tree |> left |> Option.bind value |> should equal <| Some 2
37
- tree |> left |> Option.bind (fun x -> x |> left) |> Option.bind value |> should equal <| Some 1
38
- tree |> left |> Option.bind (fun x -> x |> right) |> Option.bind value |> should equal <| Some 3
39
- tree |> right |> Option.bind value |> should equal <| Some 6
40
- tree |> right |> Option.bind (fun x -> x |> left) |> Option.bind value |> should equal <| Some 5
41
- tree |> right |> Option.bind (fun x -> x |> right) |> Option.bind value |> should equal <| Some 7
55
+ let ``Greater number at right node`` () =
56
+ let treeData = create [4; 5]
57
+ treeData |> data |> should equal 4
58
+ treeData |> left |> should equal None
59
+ treeData |> right |> Option.map data |> should equal (Some 5)
60
+ treeData |> right |> Option.bind left |> should equal None
61
+ treeData |> right |> Option.bind right |> should equal None
42
62
 
43
63
  [<Fact(Skip = "Remove to run test")>]
44
- let ``Iterating one element`` () =
45
- let elements = singleton 4 |> toList
46
- elements |> should equal [4]
64
+ let ``Can sort single number`` () =
65
+ let treeData = create [2]
66
+ sortedData treeData |> should equal [2]
47
67
 
48
68
  [<Fact(Skip = "Remove to run test")>]
49
- let ``Iterating over smaller element`` () =
50
- let elements = fromList [4; 2] |> toList
51
- elements |> should equal [2; 4]
69
+ let ``Can sort if second number is smaller than first`` () =
70
+ let treeData = create [2; 1]
71
+ sortedData treeData |> should equal [1; 2]
52
72
 
53
73
  [<Fact(Skip = "Remove to run test")>]
54
- let ``Iterating over larger element`` () =
55
- let elements = fromList [4; 5] |> toList
56
- elements |> should equal [4; 5]
74
+ let ``Can sort if second number is same as first`` () =
75
+ let treeData = create [2; 2]
76
+ sortedData treeData |> should equal [2; 2]
57
77
 
58
78
  [<Fact(Skip = "Remove to run test")>]
59
- let ``Iterating over complex element`` () =
60
- let elements = fromList [4; 2; 1; 3; 6; 7; 5] |> toList
61
- elements |> should equal [1; 2; 3; 4; 5; 6; 7]
79
+ let ``Can sort if second number is greater than first`` () =
80
+ let treeData = create [2; 3]
81
+ sortedData treeData |> should equal [2; 3]
82
+
83
+ [<Fact(Skip = "Remove to run test")>]
84
+ let ``Can sort complex tree`` () =
85
+ let treeData = create [2; 1; 3; 6; 7; 5]
86
+ sortedData treeData |> should equal [1; 2; 3; 5; 6; 7]
87
+
@@ -4,11 +4,11 @@ type Node = { left: Node option; value: int; right: Node option }
4
4
 
5
5
  let left node = node.left
6
6
  let right node = node.right
7
- let value node = Some node.value
7
+ let data node = node.value
8
8
 
9
- let singleton value = { left = None; right = None; value = value }
9
+ let private singleton value = { left = None; right = None; value = value }
10
10
 
11
- let rec insert newValue (tree: Node) =
11
+ let rec private insert newValue (tree: Node) =
12
12
  let loop newValue =
13
13
  function
14
14
  | Some x -> Some <| insert newValue x
@@ -20,7 +20,7 @@ let rec insert newValue (tree: Node) =
20
20
  | _ ->
21
21
  { tree with right = loop newValue tree.right }
22
22
 
23
- let toList tree =
23
+ let sortedData tree =
24
24
  let rec loop =
25
25
  function
26
26
  | Some node -> loop node.left @ [node.value] @ loop node.right
@@ -28,7 +28,7 @@ let toList tree =
28
28
 
29
29
  loop <| Some tree
30
30
 
31
- let fromList =
31
+ let create =
32
32
  function
33
33
  | [] -> failwith "Cannot create tree from empty list."
34
34
  | x::xs -> List.fold (fun acc elem -> insert elem acc) (singleton x) xs
@@ -12,7 +12,6 @@ open CircularBuffer
12
12
  let ``Reading empty buffer should fail`` () =
13
13
  let buffer1 = mkCircularBuffer 1
14
14
  (fun () -> read buffer1 |> ignore) |> should throw typeof<Exception>
15
-
16
15
 
17
16
  [<Fact(Skip = "Remove to run test")>]
18
17
  let ``Can read an item just written`` () =
@@ -20,7 +19,6 @@ let ``Can read an item just written`` () =
20
19
  let buffer2 = write 1 buffer1
21
20
  let (val3, _) = read buffer2
22
21
  val3 |> should equal 1
23
-
24
22
 
25
23
  [<Fact(Skip = "Remove to run test")>]
26
24
  let ``Each item may only be read once`` () =
@@ -29,7 +27,6 @@ let ``Each item may only be read once`` () =
29
27
  let (val3, buffer3) = read buffer2
30
28
  val3 |> should equal 1
31
29
  (fun () -> read buffer3 |> ignore) |> should throw typeof<Exception>
32
-
33
30
 
34
31
  [<Fact(Skip = "Remove to run test")>]
35
32
  let ``Items are read in the order they are written`` () =
@@ -40,14 +37,12 @@ let ``Items are read in the order they are written`` () =
40
37
  val4 |> should equal 1
41
38
  let (val5, _) = read buffer4
42
39
  val5 |> should equal 2
43
-
44
40
 
45
41
  [<Fact(Skip = "Remove to run test")>]
46
42
  let ``Full buffer can't be written to`` () =
47
43
  let buffer1 = mkCircularBuffer 1
48
44
  let buffer2 = write 1 buffer1
49
45
  (fun () -> write 2 buffer2 |> ignore) |> should throw typeof<Exception>
50
-
51
46
 
52
47
  [<Fact(Skip = "Remove to run test")>]
53
48
  let ``A read frees up capacity for another write`` () =
@@ -58,7 +53,6 @@ let ``A read frees up capacity for another write`` () =
58
53
  let buffer4 = write 2 buffer3
59
54
  let (val5, _) = read buffer4
60
55
  val5 |> should equal 2
61
-
62
56
 
63
57
  [<Fact(Skip = "Remove to run test")>]
64
58
  let ``Read position is maintained even across multiple writes`` () =
@@ -72,7 +66,6 @@ let ``Read position is maintained even across multiple writes`` () =
72
66
  val6 |> should equal 2
73
67
  let (val7, _) = read buffer6
74
68
  val7 |> should equal 3
75
-
76
69
 
77
70
  [<Fact(Skip = "Remove to run test")>]
78
71
  let ``Items cleared out of buffer can't be read`` () =
@@ -80,7 +73,6 @@ let ``Items cleared out of buffer can't be read`` () =
80
73
  let buffer2 = write 1 buffer1
81
74
  let buffer3 = clear buffer2
82
75
  (fun () -> read buffer3 |> ignore) |> should throw typeof<Exception>
83
-
84
76
 
85
77
  [<Fact(Skip = "Remove to run test")>]
86
78
  let ``Clear frees up capacity for another write`` () =
@@ -90,7 +82,6 @@ let ``Clear frees up capacity for another write`` () =
90
82
  let buffer4 = write 2 buffer3
91
83
  let (val5, _) = read buffer4
92
84
  val5 |> should equal 2
93
-
94
85
 
95
86
  [<Fact(Skip = "Remove to run test")>]
96
87
  let ``Clear does nothing on empty buffer`` () =
@@ -99,7 +90,6 @@ let ``Clear does nothing on empty buffer`` () =
99
90
  let buffer3 = write 1 buffer2
100
91
  let (val4, _) = read buffer3
101
92
  val4 |> should equal 1
102
-
103
93
 
104
94
  [<Fact(Skip = "Remove to run test")>]
105
95
  let ``Overwrite acts like write on non-full buffer`` () =
@@ -110,7 +100,6 @@ let ``Overwrite acts like write on non-full buffer`` () =
110
100
  val4 |> should equal 1
111
101
  let (val5, _) = read buffer4
112
102
  val5 |> should equal 2
113
-
114
103
 
115
104
  [<Fact(Skip = "Remove to run test")>]
116
105
  let ``Overwrite replaces the oldest item on full buffer`` () =
@@ -122,7 +111,6 @@ let ``Overwrite replaces the oldest item on full buffer`` () =
122
111
  val5 |> should equal 2
123
112
  let (val6, _) = read buffer5
124
113
  val6 |> should equal 3
125
-
126
114
 
127
115
  [<Fact(Skip = "Remove to run test")>]
128
116
  let ``Overwrite replaces the oldest item remaining in buffer following a read`` () =
@@ -140,5 +128,4 @@ let ``Overwrite replaces the oldest item remaining in buffer following a read``
140
128
  val9 |> should equal 4
141
129
  let (val10, _) = read buffer9
142
130
  val10 |> should equal 5
143
-
144
131