trackler 2.2.1.44 → 2.2.1.45

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 (452) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/isbn-verifier/canonical-data.json +88 -0
  4. data/problem-specifications/exercises/isbn-verifier/description.md +35 -0
  5. data/problem-specifications/exercises/isbn-verifier/metadata.yml +4 -0
  6. data/problem-specifications/exercises/robot-simulator/canonical-data.json +125 -32
  7. data/problem-specifications/exercises/sum-of-multiples/description.md +0 -3
  8. data/problem-specifications/exercises/two-bucket/canonical-data.json +3 -3
  9. data/tracks/c/config.json +235 -237
  10. data/tracks/c/exercises/acronym/README.md +0 -1
  11. data/tracks/c/exercises/all-your-base/README.md +1 -1
  12. data/tracks/c/exercises/allergies/README.md +0 -1
  13. data/tracks/c/exercises/atbash-cipher/README.md +2 -1
  14. data/tracks/c/exercises/beer-song/README.md +1 -1
  15. data/tracks/c/exercises/binary/README.md +2 -0
  16. data/tracks/c/exercises/grains/README.md +0 -1
  17. data/tracks/c/exercises/isogram/README.md +2 -1
  18. data/tracks/c/exercises/leap/README.md +1 -1
  19. data/tracks/c/exercises/meetup/README.md +1 -2
  20. data/tracks/c/exercises/nucleotide-count/README.md +8 -22
  21. data/tracks/c/exercises/palindrome-products/README.md +12 -6
  22. data/tracks/c/exercises/pangram/README.md +1 -1
  23. data/tracks/c/exercises/pascals-triangle/README.md +1 -1
  24. data/tracks/c/exercises/perfect-numbers/README.md +2 -2
  25. data/tracks/c/exercises/phone-number/README.md +3 -2
  26. data/tracks/c/exercises/roman-numerals/README.md +1 -1
  27. data/tracks/c/exercises/scrabble-score/README.md +3 -1
  28. data/tracks/c/exercises/space-age/README.md +2 -1
  29. data/tracks/c/exercises/triangle/README.md +9 -6
  30. data/tracks/c/exercises/word-count/README.md +1 -2
  31. data/tracks/csharp/exercises/accumulate/Accumulate.csproj +2 -2
  32. data/tracks/csharp/exercises/acronym/Acronym.csproj +2 -2
  33. data/tracks/csharp/exercises/all-your-base/AllYourBase.csproj +2 -2
  34. data/tracks/csharp/exercises/allergies/Allergies.csproj +2 -2
  35. data/tracks/csharp/exercises/alphametics/Alphametics.csproj +2 -2
  36. data/tracks/csharp/exercises/anagram/Anagram.csproj +2 -2
  37. data/tracks/csharp/exercises/atbash-cipher/AtbashCipher.csproj +2 -2
  38. data/tracks/csharp/exercises/bank-account/BankAccount.csproj +2 -2
  39. data/tracks/csharp/exercises/beer-song/BeerSong.csproj +2 -2
  40. data/tracks/csharp/exercises/binary-search/BinarySearch.csproj +2 -2
  41. data/tracks/csharp/exercises/binary-search-tree/BinarySearchTree.csproj +2 -2
  42. data/tracks/csharp/exercises/bob/Bob.csproj +2 -2
  43. data/tracks/csharp/exercises/book-store/BookStore.csproj +2 -2
  44. data/tracks/csharp/exercises/bowling/Bowling.csproj +2 -2
  45. data/tracks/csharp/exercises/bracket-push/BracketPush.csproj +2 -2
  46. data/tracks/csharp/exercises/change/Change.csproj +2 -2
  47. data/tracks/csharp/exercises/circular-buffer/CircularBuffer.csproj +2 -2
  48. data/tracks/csharp/exercises/clock/Clock.csproj +2 -2
  49. data/tracks/csharp/exercises/collatz-conjecture/CollatzConjecture.csproj +2 -2
  50. data/tracks/csharp/exercises/complex-numbers/ComplexNumbers.csproj +2 -2
  51. data/tracks/csharp/exercises/connect/Connect.cs +1 -1
  52. data/tracks/csharp/exercises/connect/Connect.csproj +2 -2
  53. data/tracks/csharp/exercises/connect/ConnectTest.cs +120 -85
  54. data/tracks/csharp/exercises/connect/Example.cs +11 -7
  55. data/tracks/csharp/exercises/crypto-square/CryptoSquare.csproj +2 -2
  56. data/tracks/csharp/exercises/custom-set/CustomSet.csproj +2 -2
  57. data/tracks/csharp/exercises/diamond/Diamond.csproj +2 -2
  58. data/tracks/csharp/exercises/difference-of-squares/DifferenceOfSquares.csproj +2 -2
  59. data/tracks/csharp/exercises/diffie-hellman/DiffieHellman.csproj +2 -2
  60. data/tracks/csharp/exercises/dominoes/Dominoes.csproj +2 -2
  61. data/tracks/csharp/exercises/dot-dsl/DotDsl.csproj +2 -2
  62. data/tracks/csharp/exercises/error-handling/ErrorHandling.csproj +2 -2
  63. data/tracks/csharp/exercises/etl/Etl.csproj +2 -2
  64. data/tracks/csharp/exercises/flatten-array/FlattenArray.csproj +2 -2
  65. data/tracks/csharp/exercises/food-chain/FoodChain.csproj +2 -2
  66. data/tracks/csharp/exercises/forth/Forth.csproj +2 -2
  67. data/tracks/csharp/exercises/gigasecond/Gigasecond.csproj +2 -2
  68. data/tracks/csharp/exercises/go-counting/GoCounting.csproj +2 -2
  69. data/tracks/csharp/exercises/grade-school/GradeSchool.csproj +2 -2
  70. data/tracks/csharp/exercises/grains/Grains.csproj +2 -2
  71. data/tracks/csharp/exercises/grep/Grep.csproj +2 -2
  72. data/tracks/csharp/exercises/hamming/Hamming.csproj +2 -2
  73. data/tracks/csharp/exercises/hangman/Hangman.csproj +2 -2
  74. data/tracks/csharp/exercises/hello-world/HelloWorld.csproj +2 -2
  75. data/tracks/csharp/exercises/house/House.csproj +2 -2
  76. data/tracks/csharp/exercises/isogram/Isogram.csproj +2 -2
  77. data/tracks/csharp/exercises/kindergarten-garden/KindergartenGarden.csproj +2 -2
  78. data/tracks/csharp/exercises/largest-series-product/LargestSeriesProduct.csproj +2 -2
  79. data/tracks/csharp/exercises/leap/Leap.csproj +2 -2
  80. data/tracks/csharp/exercises/ledger/Ledger.csproj +2 -2
  81. data/tracks/csharp/exercises/linked-list/LinkedList.csproj +2 -2
  82. data/tracks/csharp/exercises/list-ops/ListOps.csproj +2 -2
  83. data/tracks/csharp/exercises/luhn/Luhn.csproj +2 -2
  84. data/tracks/csharp/exercises/markdown/Markdown.csproj +2 -2
  85. data/tracks/csharp/exercises/matrix/Matrix.csproj +2 -2
  86. data/tracks/csharp/exercises/meetup/Meetup.csproj +2 -2
  87. data/tracks/csharp/exercises/minesweeper/Minesweeper.csproj +2 -2
  88. data/tracks/csharp/exercises/nth-prime/NthPrime.csproj +2 -2
  89. data/tracks/csharp/exercises/nucleotide-count/NucleotideCount.csproj +2 -2
  90. data/tracks/csharp/exercises/ocr-numbers/OcrNumbers.csproj +2 -2
  91. data/tracks/csharp/exercises/palindrome-products/PalindromeProducts.csproj +2 -2
  92. data/tracks/csharp/exercises/pangram/Pangram.csproj +2 -2
  93. data/tracks/csharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.csproj +2 -2
  94. data/tracks/csharp/exercises/pascals-triangle/PascalsTriangle.csproj +2 -2
  95. data/tracks/csharp/exercises/perfect-numbers/PerfectNumbers.csproj +2 -2
  96. data/tracks/csharp/exercises/phone-number/PhoneNumber.csproj +2 -2
  97. data/tracks/csharp/exercises/pig-latin/PigLatin.csproj +2 -2
  98. data/tracks/csharp/exercises/poker/Poker.csproj +2 -2
  99. data/tracks/csharp/exercises/pov/Pov.csproj +2 -2
  100. data/tracks/csharp/exercises/prime-factors/PrimeFactors.csproj +2 -2
  101. data/tracks/csharp/exercises/protein-translation/ProteinTranslation.csproj +2 -2
  102. data/tracks/csharp/exercises/proverb/Proverb.csproj +2 -2
  103. data/tracks/csharp/exercises/pythagorean-triplet/PythagoreanTriplet.csproj +2 -2
  104. data/tracks/csharp/exercises/queen-attack/QueenAttack.csproj +2 -2
  105. data/tracks/csharp/exercises/rail-fence-cipher/RailFenceCipher.csproj +2 -2
  106. data/tracks/csharp/exercises/raindrops/Raindrops.csproj +2 -2
  107. data/tracks/csharp/exercises/react/React.csproj +2 -2
  108. data/tracks/csharp/exercises/rectangles/Rectangles.csproj +2 -2
  109. data/tracks/csharp/exercises/rna-transcription/RnaTranscription.csproj +2 -2
  110. data/tracks/csharp/exercises/robot-name/RobotName.csproj +2 -2
  111. data/tracks/csharp/exercises/robot-simulator/RobotSimulator.csproj +2 -2
  112. data/tracks/csharp/exercises/roman-numerals/RomanNumerals.csproj +2 -2
  113. data/tracks/csharp/exercises/rotational-cipher/RotationalCipher.csproj +2 -2
  114. data/tracks/csharp/exercises/run-length-encoding/RunLengthEncoding.csproj +2 -2
  115. data/tracks/csharp/exercises/saddle-points/SaddlePoints.csproj +2 -2
  116. data/tracks/csharp/exercises/say/Say.csproj +2 -2
  117. data/tracks/csharp/exercises/scale-generator/ScaleGenerator.csproj +2 -2
  118. data/tracks/csharp/exercises/scrabble-score/ScrabbleScore.csproj +2 -2
  119. data/tracks/csharp/exercises/secret-handshake/SecretHandshake.csproj +2 -2
  120. data/tracks/csharp/exercises/series/Series.csproj +2 -2
  121. data/tracks/csharp/exercises/series/SeriesTest.cs +17 -17
  122. data/tracks/csharp/exercises/sgf-parsing/SgfParsing.csproj +2 -2
  123. data/tracks/csharp/exercises/sieve/Sieve.csproj +2 -2
  124. data/tracks/csharp/exercises/simple-cipher/SimpleCipher.csproj +2 -2
  125. data/tracks/csharp/exercises/simple-linked-list/SimpleLinkedList.csproj +2 -2
  126. data/tracks/csharp/exercises/space-age/SpaceAge.csproj +2 -2
  127. data/tracks/csharp/exercises/spiral-matrix/SpiralMatrix.csproj +2 -2
  128. data/tracks/csharp/exercises/strain/Strain.csproj +2 -2
  129. data/tracks/csharp/exercises/sublist/Sublist.csproj +2 -2
  130. data/tracks/csharp/exercises/sum-of-multiples/SumOfMultiples.csproj +2 -2
  131. data/tracks/csharp/exercises/tournament/Tournament.csproj +2 -2
  132. data/tracks/csharp/exercises/transpose/Transpose.csproj +2 -2
  133. data/tracks/csharp/exercises/tree-building/TreeBuilding.csproj +2 -2
  134. data/tracks/csharp/exercises/triangle/Triangle.cs +0 -11
  135. data/tracks/csharp/exercises/triangle/Triangle.csproj +2 -2
  136. data/tracks/csharp/exercises/triangle/TriangleTest.cs +17 -17
  137. data/tracks/csharp/exercises/twelve-days/TwelveDays.csproj +2 -2
  138. data/tracks/csharp/exercises/two-bucket/TwoBucket.csproj +2 -2
  139. data/tracks/csharp/exercises/two-fer/TwoFer.csproj +2 -2
  140. data/tracks/csharp/exercises/variable-length-quantity/VariableLengthQuantity.csproj +2 -2
  141. data/tracks/csharp/exercises/word-count/WordCount.csproj +2 -2
  142. data/tracks/csharp/exercises/word-search/WordSearch.csproj +2 -2
  143. data/tracks/csharp/exercises/wordy/Wordy.csproj +2 -2
  144. data/tracks/csharp/exercises/zebra-puzzle/ZebraPuzzle.csproj +2 -2
  145. data/tracks/csharp/exercises/zipper/Zipper.csproj +2 -2
  146. data/tracks/csharp/generators/Exercises/Connect.cs +47 -0
  147. data/tracks/csharp/generators/Exercises/Triangle.cs +1 -1
  148. data/tracks/dart/config/maintainers.json +27 -1
  149. data/tracks/dart/pubspec.yaml +3 -0
  150. data/tracks/dart/tool/create-exercise +144 -5
  151. data/tracks/elm/.gitattributes +1 -0
  152. data/tracks/elm/bin/install-elm-format +9 -3
  153. data/tracks/elm/config.json +30 -0
  154. data/tracks/elm/exercises/all-your-base/AllYourBase.elm +1 -0
  155. data/tracks/elm/exercises/all-your-base/AllYourBase.example.elm +68 -0
  156. data/tracks/elm/exercises/all-your-base/README.md +65 -0
  157. data/tracks/elm/exercises/all-your-base/elm-package.json +15 -0
  158. data/tracks/elm/exercises/all-your-base/tests/Tests.elm +53 -0
  159. data/tracks/elm/exercises/all-your-base/tests/elm-package.json +16 -0
  160. data/tracks/elm/exercises/collatz-conjecture/CollatzConjecture.elm +2 -0
  161. data/tracks/elm/exercises/collatz-conjecture/CollatzConjecture.example.elm +19 -0
  162. data/tracks/elm/exercises/collatz-conjecture/elm-package.json +15 -0
  163. data/tracks/elm/exercises/collatz-conjecture/package.json +14 -0
  164. data/tracks/elm/exercises/collatz-conjecture/tests/Tests.elm +38 -0
  165. data/tracks/elm/exercises/collatz-conjecture/tests/elm-package.json +16 -0
  166. data/tracks/elm/exercises/isogram/Isogram.elm +1 -0
  167. data/tracks/elm/exercises/isogram/Isogram.example.elm +76 -0
  168. data/tracks/elm/exercises/isogram/README.md +50 -0
  169. data/tracks/elm/exercises/isogram/elm-package.json +14 -0
  170. data/tracks/elm/exercises/isogram/package.json +14 -0
  171. data/tracks/elm/exercises/isogram/tests/Tests.elm +46 -0
  172. data/tracks/elm/exercises/isogram/tests/elm-package.json +16 -0
  173. data/tracks/fsharp/.gitignore +2 -1
  174. data/tracks/fsharp/exercises/accumulate/Accumulate.fsproj +3 -2
  175. data/tracks/fsharp/exercises/acronym/Acronym.fs +1 -1
  176. data/tracks/fsharp/exercises/acronym/Acronym.fsproj +3 -2
  177. data/tracks/fsharp/exercises/acronym/AcronymTest.fs +13 -38
  178. data/tracks/fsharp/exercises/acronym/Example.fs +1 -1
  179. data/tracks/fsharp/exercises/all-your-base/AllYourBase.fsproj +3 -2
  180. data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +64 -61
  181. data/tracks/fsharp/exercises/all-your-base/Example.fs +4 -1
  182. data/tracks/fsharp/exercises/allergies/Allergies.fs +2 -2
  183. data/tracks/fsharp/exercises/allergies/Allergies.fsproj +3 -2
  184. data/tracks/fsharp/exercises/allergies/AllergiesTest.fs +28 -37
  185. data/tracks/fsharp/exercises/allergies/Example.fs +3 -3
  186. data/tracks/fsharp/exercises/alphametics/Alphametics.fsproj +3 -2
  187. data/tracks/fsharp/exercises/anagram/Anagram.fsproj +3 -2
  188. data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fs +4 -2
  189. data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fsproj +3 -2
  190. data/tracks/fsharp/exercises/atbash-cipher/AtbashCipherTest.fs +38 -42
  191. data/tracks/fsharp/exercises/atbash-cipher/Example.fs +5 -3
  192. data/tracks/fsharp/exercises/bank-account/BankAccount.fsproj +3 -2
  193. data/tracks/fsharp/exercises/beer-song/BeerSong.fsproj +3 -2
  194. data/tracks/fsharp/exercises/beer-song/BeerSongTest.fs +36 -32
  195. data/tracks/fsharp/exercises/beer-song/Example.fs +2 -2
  196. data/tracks/fsharp/exercises/binary-search/BinarySearch.fsproj +3 -2
  197. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fsproj +3 -2
  198. data/tracks/fsharp/exercises/bob/Bob.fs +1 -1
  199. data/tracks/fsharp/exercises/bob/Bob.fsproj +3 -2
  200. data/tracks/fsharp/exercises/bob/BobTest.fs +64 -20
  201. data/tracks/fsharp/exercises/bob/Example.fs +3 -4
  202. data/tracks/fsharp/exercises/book-store/BookStore.fs +1 -1
  203. data/tracks/fsharp/exercises/book-store/BookStore.fsproj +3 -2
  204. data/tracks/fsharp/exercises/book-store/BookStoreTest.fs +32 -25
  205. data/tracks/fsharp/exercises/book-store/Example.fs +1 -1
  206. data/tracks/fsharp/exercises/bowling/Bowling.fsproj +3 -2
  207. data/tracks/fsharp/exercises/bracket-push/BracketPush.fs +1 -1
  208. data/tracks/fsharp/exercises/bracket-push/BracketPush.fsproj +3 -2
  209. data/tracks/fsharp/exercises/bracket-push/BracketPushTest.fs +24 -25
  210. data/tracks/fsharp/exercises/bracket-push/Example.fs +1 -1
  211. data/tracks/fsharp/exercises/change/Change.fs +1 -1
  212. data/tracks/fsharp/exercises/change/Change.fsproj +3 -2
  213. data/tracks/fsharp/exercises/change/ChangeTest.fs +42 -18
  214. data/tracks/fsharp/exercises/change/Example.fs +7 -4
  215. data/tracks/fsharp/exercises/circular-buffer/CircularBuffer.fsproj +3 -2
  216. data/tracks/fsharp/exercises/clock/Clock.fsproj +3 -2
  217. data/tracks/fsharp/exercises/connect/Connect.fsproj +3 -2
  218. data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fs +1 -40
  219. data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fsproj +3 -2
  220. data/tracks/fsharp/exercises/crypto-square/CryptoSquareTest.fs +16 -40
  221. data/tracks/fsharp/exercises/crypto-square/Example.fs +13 -16
  222. data/tracks/fsharp/exercises/custom-set/CustomSet.fs +12 -12
  223. data/tracks/fsharp/exercises/custom-set/CustomSet.fsproj +3 -2
  224. data/tracks/fsharp/exercises/diamond/Diamond.fsproj +3 -2
  225. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fs +2 -2
  226. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fsproj +3 -2
  227. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquaresTest.fs +24 -20
  228. data/tracks/fsharp/exercises/difference-of-squares/Example.fs +3 -3
  229. data/tracks/fsharp/exercises/diffie-hellman/DiffieHellman.fsproj +3 -2
  230. data/tracks/fsharp/exercises/dominoes/Dominoes.fsproj +3 -2
  231. data/tracks/fsharp/exercises/dot-dsl/DotDsl.fsproj +3 -2
  232. data/tracks/fsharp/exercises/error-handling/ErrorHandling.fsproj +3 -2
  233. data/tracks/fsharp/exercises/etl/Etl.fsproj +3 -2
  234. data/tracks/fsharp/exercises/food-chain/FoodChain.fsproj +3 -2
  235. data/tracks/fsharp/exercises/forth/Forth.fsproj +3 -2
  236. data/tracks/fsharp/exercises/gigasecond/Example.fs +1 -3
  237. data/tracks/fsharp/exercises/gigasecond/Gigasecond.fs +1 -1
  238. data/tracks/fsharp/exercises/gigasecond/Gigasecond.fsproj +3 -2
  239. data/tracks/fsharp/exercises/gigasecond/GigasecondTest.fs +21 -12
  240. data/tracks/fsharp/exercises/go-counting/GoCounting.fsproj +3 -2
  241. data/tracks/fsharp/exercises/grade-school/GradeSchool.fsproj +3 -2
  242. data/tracks/fsharp/exercises/grains/Grains.fsproj +3 -2
  243. data/tracks/fsharp/exercises/grep/Grep.fsproj +3 -2
  244. data/tracks/fsharp/exercises/hamming/Hamming.fsproj +3 -2
  245. data/tracks/fsharp/exercises/hangman/Hangman.fsproj +3 -2
  246. data/tracks/fsharp/exercises/hello-world/HelloWorld.fsproj +3 -2
  247. data/tracks/fsharp/exercises/hello-world/HelloWorldTest.fs +6 -3
  248. data/tracks/fsharp/exercises/house/House.fsproj +3 -2
  249. data/tracks/fsharp/exercises/isogram/Example.fs +1 -1
  250. data/tracks/fsharp/exercises/isogram/Isogram.fs +1 -1
  251. data/tracks/fsharp/exercises/isogram/Isogram.fsproj +3 -2
  252. data/tracks/fsharp/exercises/isogram/IsogramTest.fs +16 -40
  253. data/tracks/fsharp/exercises/kindergarten-garden/Example.fs +6 -4
  254. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fs +3 -5
  255. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fsproj +3 -2
  256. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGardenTest.fs +100 -47
  257. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fsproj +3 -2
  258. data/tracks/fsharp/exercises/leap/Example.fs +2 -2
  259. data/tracks/fsharp/exercises/leap/Leap.fs +2 -2
  260. data/tracks/fsharp/exercises/leap/Leap.fsproj +3 -2
  261. data/tracks/fsharp/exercises/leap/LeapTest.fs +19 -15
  262. data/tracks/fsharp/exercises/ledger/Ledger.fsproj +3 -2
  263. data/tracks/fsharp/exercises/lens-person/LensPerson.fsproj +3 -2
  264. data/tracks/fsharp/exercises/linked-list/LinkedList.fsproj +3 -2
  265. data/tracks/fsharp/exercises/list-ops/ListOps.fsproj +3 -2
  266. data/tracks/fsharp/exercises/luhn/Luhn.fsproj +3 -2
  267. data/tracks/fsharp/exercises/luhn/LuhnTest.fs +30 -65
  268. data/tracks/fsharp/exercises/markdown/Markdown.fsproj +3 -2
  269. data/tracks/fsharp/exercises/matrix/Matrix.fsproj +3 -2
  270. data/tracks/fsharp/exercises/meetup/Meetup.fsproj +3 -2
  271. data/tracks/fsharp/exercises/minesweeper/Example.fs +9 -11
  272. data/tracks/fsharp/exercises/minesweeper/Minesweeper.fsproj +3 -2
  273. data/tracks/fsharp/exercises/minesweeper/MinesweeperTest.fs +117 -80
  274. data/tracks/fsharp/exercises/nth-prime/NthPrime.fsproj +3 -2
  275. data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fsproj +3 -2
  276. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbers.fsproj +3 -2
  277. data/tracks/fsharp/exercises/palindrome-products/PalindromeProducts.fsproj +3 -2
  278. data/tracks/fsharp/exercises/pangram/Pangram.fsproj +3 -2
  279. data/tracks/fsharp/exercises/pangram/PangramTest.fs +15 -27
  280. data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.fsproj +3 -2
  281. data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangle.fsproj +3 -2
  282. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fsproj +3 -2
  283. data/tracks/fsharp/exercises/phone-number/PhoneNumber.fsproj +3 -2
  284. data/tracks/fsharp/exercises/pig-latin/Example.fs +1 -1
  285. data/tracks/fsharp/exercises/pig-latin/PigLatin.fsproj +3 -2
  286. data/tracks/fsharp/exercises/pig-latin/PigLatinTest.fs +64 -26
  287. data/tracks/fsharp/exercises/poker/Poker.fsproj +3 -2
  288. data/tracks/fsharp/exercises/pov/Pov.fsproj +3 -2
  289. data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fsproj +3 -2
  290. data/tracks/fsharp/exercises/protein-translation/ProteinTranslation.fsproj +3 -2
  291. data/tracks/fsharp/exercises/proverb/Proverb.fsproj +3 -2
  292. data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTriplet.fsproj +3 -2
  293. data/tracks/fsharp/exercises/queen-attack/Example.fs +3 -1
  294. data/tracks/fsharp/exercises/queen-attack/QueenAttack.fs +2 -0
  295. data/tracks/fsharp/exercises/queen-attack/QueenAttack.fsproj +3 -2
  296. data/tracks/fsharp/exercises/queen-attack/QueenAttackTest.fs +50 -20
  297. data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipher.fsproj +3 -2
  298. data/tracks/fsharp/exercises/raindrops/Raindrops.fsproj +3 -2
  299. data/tracks/fsharp/exercises/raindrops/RaindropsTest.fs +77 -37
  300. data/tracks/fsharp/exercises/react/React.fsproj +3 -2
  301. data/tracks/fsharp/exercises/rectangles/Rectangles.fsproj +3 -2
  302. data/tracks/fsharp/exercises/rna-transcription/Example.fs +15 -7
  303. data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fs +2 -2
  304. data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fsproj +3 -2
  305. data/tracks/fsharp/exercises/rna-transcription/RnaTranscriptionTest.fs +29 -14
  306. data/tracks/fsharp/exercises/robot-name/RobotName.fsproj +3 -2
  307. data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fsproj +3 -2
  308. data/tracks/fsharp/exercises/roman-numerals/Example.fs +2 -2
  309. data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fs +2 -2
  310. data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fsproj +3 -2
  311. data/tracks/fsharp/exercises/roman-numerals/RomanNumeralsTest.fs +79 -26
  312. data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncoding.fsproj +3 -2
  313. data/tracks/fsharp/exercises/saddle-points/SaddlePoints.fsproj +3 -2
  314. data/tracks/fsharp/exercises/say/Say.fsproj +3 -2
  315. data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fsproj +3 -2
  316. data/tracks/fsharp/exercises/scrabble-score/ScrabbleScore.fsproj +3 -2
  317. data/tracks/fsharp/exercises/scrabble-score/ScrabbleScoreTest.fs +33 -17
  318. data/tracks/fsharp/exercises/secret-handshake/SecretHandshake.fsproj +3 -2
  319. data/tracks/fsharp/exercises/series/Series.fsproj +3 -2
  320. data/tracks/fsharp/exercises/sgf-parsing/SgfParsing.fsproj +3 -2
  321. data/tracks/fsharp/exercises/sieve/Sieve.fsproj +3 -2
  322. data/tracks/fsharp/exercises/simple-cipher/SimpleCipher.fsproj +3 -2
  323. data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedList.fsproj +3 -2
  324. data/tracks/fsharp/exercises/space-age/SpaceAge.fsproj +3 -2
  325. data/tracks/fsharp/exercises/strain/Strain.fsproj +3 -2
  326. data/tracks/fsharp/exercises/sublist/Sublist.fsproj +3 -2
  327. data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiples.fsproj +3 -2
  328. data/tracks/fsharp/exercises/tournament/Tournament.fsproj +3 -2
  329. data/tracks/fsharp/exercises/transpose/Transpose.fsproj +3 -2
  330. data/tracks/fsharp/exercises/tree-building/TreeBuilding.fsproj +3 -2
  331. data/tracks/fsharp/exercises/triangle/Triangle.fsproj +3 -2
  332. data/tracks/fsharp/exercises/twelve-days/TwelveDays.fsproj +3 -2
  333. data/tracks/fsharp/exercises/two-bucket/TwoBucket.fsproj +3 -2
  334. data/tracks/fsharp/exercises/two-fer/TwoFer.fsproj +3 -2
  335. data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantity.fsproj +3 -2
  336. data/tracks/fsharp/exercises/word-count/WordCount.fsproj +3 -2
  337. data/tracks/fsharp/exercises/word-search/WordSearch.fsproj +3 -2
  338. data/tracks/fsharp/exercises/wordy/Wordy.fsproj +3 -2
  339. data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzle.fsproj +3 -2
  340. data/tracks/fsharp/exercises/zipper/Zipper.fsproj +3 -2
  341. data/tracks/fsharp/generators/Common.fs +96 -0
  342. data/tracks/fsharp/generators/Exercise.fs +250 -0
  343. data/tracks/fsharp/generators/Generators.fs +210 -0
  344. data/tracks/fsharp/generators/Generators.fsproj +32 -0
  345. data/tracks/fsharp/generators/Generators.sln +24 -0
  346. data/tracks/fsharp/generators/Input.fs +99 -0
  347. data/tracks/fsharp/generators/Options.fs +31 -0
  348. data/tracks/fsharp/generators/Output.fs +224 -0
  349. data/tracks/fsharp/generators/Program.fs +35 -0
  350. data/tracks/fsharp/generators/Properties/launchSettings.json +8 -0
  351. data/tracks/fsharp/generators/Templates/_AssertEmpty.liquid +1 -0
  352. data/tracks/fsharp/generators/Templates/_AssertEqual.liquid +1 -0
  353. data/tracks/fsharp/generators/Templates/_TestClass.liquid +13 -0
  354. data/tracks/fsharp/generators/Templates/_TestMethod.liquid +3 -0
  355. data/tracks/fsharp/generators/Templates/_TestMethodBody.liquid +4 -0
  356. data/tracks/go/.travis.yml +3 -3
  357. data/tracks/groovy/CONTRIBUTING.md +2 -2
  358. data/tracks/groovy/config.json +12 -0
  359. data/tracks/groovy/exercises/scrabble-score/Example.groovy +18 -0
  360. data/tracks/groovy/exercises/scrabble-score/README.md +63 -0
  361. data/tracks/groovy/exercises/scrabble-score/ScrabbleScore.groovy +7 -0
  362. data/tracks/groovy/exercises/scrabble-score/ScrabbleScoreSpec.groovy +45 -0
  363. data/tracks/groovy/exercises/two-fer/TwoFer.groovy +2 -2
  364. data/tracks/haskell/exercises/change/README.md +1 -1
  365. data/tracks/haskell/exercises/lens-person/README.md +1 -1
  366. data/tracks/haskell/exercises/palindrome-products/README.md +5 -12
  367. data/tracks/haskell/exercises/sum-of-multiples/README.md +0 -3
  368. data/tracks/idris/config.json +12 -0
  369. data/tracks/idris/exercises/accumulate/Accumulate.ipkg +5 -0
  370. data/tracks/idris/exercises/accumulate/Makefile +23 -0
  371. data/tracks/idris/exercises/accumulate/README.md +32 -0
  372. data/tracks/idris/exercises/accumulate/src/Example.idr +6 -0
  373. data/tracks/idris/exercises/accumulate/src/Test/Accumulate.idr +35 -0
  374. data/tracks/java/config/maintainers.json +4 -7
  375. data/tracks/java/config.json +99 -22
  376. data/tracks/java/exercises/binary-search-tree/.meta/src/reference/java/{BST.java → BinarySearchTree.java} +1 -1
  377. data/tracks/java/exercises/binary-search-tree/src/test/java/{BSTTest.java → BinarySearchTreeTest.java} +34 -36
  378. data/tracks/java/exercises/robot-simulator/src/main/java/GridPosition.java +19 -15
  379. data/tracks/java/exercises/saddle-points/.meta/src/reference/java/MatrixCoordinate.java +7 -1
  380. data/tracks/java/exercises/saddle-points/src/main/java/MatrixCoordinate.java +7 -1
  381. data/tracks/java/exercises/settings.gradle +1 -0
  382. data/tracks/java/exercises/tournament/.meta/src/reference/java/Result.java +5 -0
  383. data/tracks/java/exercises/tournament/.meta/src/reference/java/TeamResult.java +41 -0
  384. data/tracks/java/exercises/tournament/.meta/src/reference/java/Tournament.java +62 -0
  385. data/tracks/java/exercises/tournament/README.md +78 -0
  386. data/tracks/java/exercises/tournament/build.gradle +18 -0
  387. data/tracks/java/{.Rhistory → exercises/tournament/src/main/java/.keep} +0 -0
  388. data/tracks/java/exercises/tournament/src/test/java/TournamentTest.java +160 -0
  389. data/tracks/php/config.json +14 -0
  390. data/tracks/php/exercises/collatz-conjecture/collatz-conjecture_test.php +44 -0
  391. data/tracks/php/exercises/collatz-conjecture/example.php +18 -0
  392. data/tracks/python/exercises/circular-buffer/circular_buffer.py +1 -1
  393. data/tracks/python/exercises/clock/clock.py +1 -1
  394. data/tracks/python/exercises/etl/etl.py +1 -1
  395. data/tracks/python/exercises/grade-school/grade_school.py +1 -1
  396. data/tracks/python/exercises/grains/grains.py +2 -2
  397. data/tracks/python/exercises/kindergarten-garden/kindergarten_garden.py +1 -1
  398. data/tracks/python/exercises/linked-list/linked_list.py +1 -1
  399. data/tracks/python/exercises/rectangles/rectangles.py +1 -1
  400. data/tracks/python/exercises/sum-of-multiples/sum_of_multiples.py +1 -1
  401. data/tracks/rust/exercises/bob/tests/bob.rs +1 -0
  402. data/tracks/rust/exercises/crypto-square/tests/crypto-square.rs +7 -0
  403. data/tracks/rust/exercises/gigasecond/tests/gigasecond.rs +1 -1
  404. data/tracks/rust/exercises/phone-number/Cargo.lock +1 -1
  405. data/tracks/rust/exercises/phone-number/Cargo.toml +1 -1
  406. data/tracks/rust/exercises/phone-number/example.rs +17 -23
  407. data/tracks/rust/exercises/phone-number/tests/phone-number.rs +31 -40
  408. data/tracks/rust/exercises/say/tests/say.rs +2 -0
  409. data/tracks/rust/exercises/sum-of-multiples/README.md +0 -3
  410. data/tracks/scala/config.json +11 -0
  411. data/tracks/scala/exercises/collatz-conjecture/README.md +43 -0
  412. data/tracks/scala/exercises/collatz-conjecture/build.sbt +3 -0
  413. data/tracks/scala/exercises/collatz-conjecture/example.scala +17 -0
  414. data/tracks/scala/exercises/collatz-conjecture/src/main/scala/.keep +0 -0
  415. data/tracks/scala/exercises/collatz-conjecture/src/test/scala/CollatzConjectureTest.scala +34 -0
  416. data/tracks/scala/testgen/src/main/scala/CollatzConjectureTestGenerator.scala +35 -0
  417. data/tracks/scheme/config.json +8 -0
  418. data/tracks/scheme/exercises/word-count/README.md +19 -0
  419. data/tracks/scheme/exercises/word-count/example.scm +27 -0
  420. data/tracks/scheme/exercises/word-count/word-count-test.scm +90 -0
  421. data/tracks/scheme/exercises/word-count/word-count.scm +5 -0
  422. data/tracks/sml/README.md +20 -1
  423. data/tracks/sml/bin/generate +74 -20
  424. data/tracks/sml/exercises/binary/README.md +23 -5
  425. data/tracks/sml/exercises/binary/binary.sml +2 -0
  426. data/tracks/sml/exercises/binary/example.sml +10 -21
  427. data/tracks/sml/exercises/binary/test.sml +55 -30
  428. data/tracks/sml/exercises/binary/testlib.sml +159 -0
  429. data/tracks/sml/exercises/flatten-array/HINTS.md +8 -0
  430. data/tracks/sml/exercises/flatten-array/README.md +31 -6
  431. data/tracks/sml/exercises/flatten-array/example.sml +3 -4
  432. data/tracks/sml/exercises/flatten-array/flatten-array.sml +4 -5
  433. data/tracks/sml/exercises/flatten-array/test.sml +76 -52
  434. data/tracks/sml/exercises/flatten-array/testlib.sml +159 -0
  435. data/tracks/sml/exercises/nth-prime/HINTS.md +9 -0
  436. data/tracks/sml/exercises/nth-prime/README.md +32 -5
  437. data/tracks/sml/exercises/nth-prime/example.sml +28 -46
  438. data/tracks/sml/exercises/nth-prime/nth-prime.sml +1 -1
  439. data/tracks/sml/exercises/nth-prime/test.sml +19 -63
  440. data/tracks/sml/exercises/nth-prime/testlib.sml +159 -0
  441. data/tracks/sml/exercises/raindrops/README.md +21 -5
  442. data/tracks/typescript/config.json +14 -0
  443. data/tracks/typescript/exercises/triangle/README.md +55 -0
  444. data/tracks/typescript/exercises/triangle/package.json +36 -0
  445. data/tracks/typescript/exercises/triangle/triangle.example.ts +56 -0
  446. data/tracks/typescript/exercises/triangle/triangle.test.ts +79 -0
  447. data/tracks/typescript/exercises/triangle/triangle.ts +12 -0
  448. data/tracks/typescript/exercises/triangle/tsconfig.json +22 -0
  449. data/tracks/typescript/exercises/triangle/tslint.json +127 -0
  450. data/tracks/typescript/exercises/triangle/yarn.lock +2305 -0
  451. metadata +85 -6
  452. data/tracks/d/exercises/crypto-square/.dub/dub.json +0 -6
@@ -0,0 +1,24 @@
1
+ Microsoft Visual Studio Solution File, Format Version 12.00
2
+ # Visual Studio 15
3
+ VisualStudioVersion = 15.0.26730.12
4
+ MinimumVisualStudioVersion = 15.0.26124.0
5
+ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Generators", "Generators.fsproj", "{083C3030-8EC9-4EB7-BBD2-989BD4CE28FE}"
6
+ EndProject
7
+ Global
8
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
9
+ Debug|Any CPU = Debug|Any CPU
10
+ Release|Any CPU = Release|Any CPU
11
+ EndGlobalSection
12
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
13
+ {083C3030-8EC9-4EB7-BBD2-989BD4CE28FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
14
+ {083C3030-8EC9-4EB7-BBD2-989BD4CE28FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
15
+ {083C3030-8EC9-4EB7-BBD2-989BD4CE28FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
16
+ {083C3030-8EC9-4EB7-BBD2-989BD4CE28FE}.Release|Any CPU.Build.0 = Release|Any CPU
17
+ EndGlobalSection
18
+ GlobalSection(SolutionProperties) = preSolution
19
+ HideSolutionNode = FALSE
20
+ EndGlobalSection
21
+ GlobalSection(ExtensibilityGlobals) = postSolution
22
+ SolutionGuid = {57678E76-BB77-4CB6-AD28-77C5DC345BDE}
23
+ EndGlobalSection
24
+ EndGlobal
@@ -0,0 +1,99 @@
1
+ module Generators.Input
2
+
3
+ open System
4
+ open System.IO
5
+ open System.Collections.Generic
6
+ open Serilog
7
+ open LibGit2Sharp
8
+ open Newtonsoft.Json
9
+ open Newtonsoft.Json.Linq
10
+ open Newtonsoft.Json.Serialization
11
+ open Humanizer
12
+ open Options
13
+
14
+ let [<Literal>] private ProblemSpecificationsGitUrl = "https://github.com/exercism/problem-specifications.git";
15
+ let [<Literal>] private ProblemSpecificationsBranch = "master";
16
+ let [<Literal>] private ProblemSpecificationsRemote = "origin";
17
+ let [<Literal>] private ProblemSpecificationsRemoteBranch = ProblemSpecificationsRemote + "/" + ProblemSpecificationsBranch;
18
+
19
+ let private cloneRepository options =
20
+ if (Directory.Exists(options.CanonicalDataDirectory)) then
21
+ ()
22
+ else
23
+ Log.Information("Cloning repository...")
24
+
25
+ Repository.Clone(ProblemSpecificationsGitUrl, options.CanonicalDataDirectory) |> ignore
26
+
27
+ Log.Information("Repository cloned.")
28
+
29
+ let private updateToLatestVersion options =
30
+ Log.Information("Updating repository to latest version...");
31
+
32
+ use repository = new Repository(options.CanonicalDataDirectory)
33
+
34
+ Commands.Fetch(repository, ProblemSpecificationsRemote, Seq.empty, FetchOptions(), null)
35
+
36
+ let remoteBranch = repository.Branches.[ProblemSpecificationsRemoteBranch];
37
+ repository.Reset(ResetMode.Hard, remoteBranch.Tip);
38
+
39
+ Log.Information("Updated repository to latest version.");
40
+
41
+ let private downloadData options =
42
+ if options.SkipUpdateCanonicalData then
43
+ ()
44
+ else
45
+ cloneRepository options
46
+ updateToLatestVersion options
47
+
48
+ let private readCanonicalData options exercise =
49
+ let exerciseCanonicalDataPath = Path.Combine(options.CanonicalDataDirectory, "exercises", exercise, "canonical-data.json")
50
+ File.ReadAllText(exerciseCanonicalDataPath)
51
+
52
+ let jsonSerializerSettings = JsonSerializerSettings()
53
+ let jsonSerializer = JsonSerializer()
54
+
55
+ type CanonicalDataConverter() =
56
+ inherit JsonConverter()
57
+
58
+ let createCanonicalDataCasePropertiesFromJToken (jToken: JToken) =
59
+ jToken.ToObject<IDictionary<string, obj>>()
60
+ |> Dict.toMap
61
+
62
+ let createDescriptionPathFromJToken (jToken: JToken): string list =
63
+ let descriptionFromJToken (currentToken: JToken) =
64
+ match currentToken.SelectToken("description") with
65
+ | null -> None
66
+ | description -> Some (description.ToObject<string>())
67
+
68
+ jToken
69
+ |> Json.parentsAndSelf
70
+ |> List.choose descriptionFromJToken
71
+
72
+ let createCanonicalDataCaseFromJToken (jToken: JToken) =
73
+ { Properties = createCanonicalDataCasePropertiesFromJToken jToken
74
+ DescriptionPath = createDescriptionPathFromJToken jToken }
75
+
76
+ let createCanonicalDataCasesFromJToken (jToken: JToken) =
77
+ jToken.["cases"].SelectTokens("$..*[?(@.property)]")
78
+ |> Seq.map createCanonicalDataCaseFromJToken
79
+ |> Seq.toList
80
+
81
+ let createCanonicalDataFromJToken (jToken: JToken) =
82
+ { Exercise = jToken.["exercise"].Value<string>()
83
+ Version = jToken.["version"].Value<string>()
84
+ Cases = createCanonicalDataCasesFromJToken jToken }
85
+
86
+ override this.WriteJson(writer: JsonWriter, value: obj, serializer: JsonSerializer) = failwith "Not supported"
87
+
88
+ override this.ReadJson(reader: JsonReader, objectType: Type, existingValue: obj, serializer: JsonSerializer) =
89
+ let jToken = JToken.ReadFrom(reader)
90
+ createCanonicalDataFromJToken jToken :> obj
91
+
92
+ override this.CanConvert(objectType: Type) = objectType = typeof<CanonicalData>
93
+
94
+ let convertCanonicalData canonicalDataContents =
95
+ JsonConvert.DeserializeObject<CanonicalData>(canonicalDataContents, CanonicalDataConverter())
96
+
97
+ let parseCanonicalData options =
98
+ downloadData options
99
+ readCanonicalData options >> convertCanonicalData
@@ -0,0 +1,31 @@
1
+ module Generators.Options
2
+
3
+ open System
4
+ open System.IO
5
+ open CommandLine
6
+ open Serilog
7
+ open Humanizer
8
+
9
+ type Options = {
10
+ [<CommandLine.Option('e', "exercises", Required = false,
11
+ HelpText = "Exercises to generate (if not specified, defaults to all exercises).")>] Exercises : seq<string>;
12
+ [<CommandLine.Option('d', "canonicaldatadirectory", Required = false,
13
+ HelpText = "Canonical data directory. If the directory does not exist, the canonical data will be downloaded.")>] CanonicalDataDirectory : string;
14
+ [<CommandLine.Option('s', "skipupdatecanonicaldata", Required = false,
15
+ HelpText = "Don't update the canonical data.")>] SkipUpdateCanonicalData : bool;
16
+ }
17
+
18
+ let private normalizeOptions options =
19
+ if options.CanonicalDataDirectory <> "" then
20
+ options
21
+ else
22
+ let appDataDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
23
+ let defaultCanonicalDataDirectory = Path.Combine(appDataDirectory, "exercism", "problem-specifications")
24
+ { options with CanonicalDataDirectory = defaultCanonicalDataDirectory }
25
+
26
+ let parseOptions argv =
27
+ let result = CommandLine.Parser.Default.ParseArguments<Options>(argv)
28
+ match result with
29
+ | :? Parsed<Options> as parsed -> Result.Ok(normalizeOptions parsed.Value)
30
+ | :? NotParsed<Options> as notParsed -> Result.Error(notParsed.Errors |> Seq.map string)
31
+ | _ -> Result.Error(seq { yield "Invalid parsing result" })
@@ -0,0 +1,224 @@
1
+ module Generators.Output
2
+
3
+ open System
4
+ open System.Collections.Generic
5
+ open System.IO
6
+ open System.Reflection
7
+ open FSharp.Reflection
8
+ open DotLiquid
9
+ open DotLiquid.FileSystems
10
+ open Newtonsoft.Json.Linq
11
+ open Input
12
+
13
+ let indent level value =
14
+ let indentation = String.replicate level " "
15
+ sprintf "%s%s" indentation value
16
+
17
+ let parenthesize value = sprintf "(%s)" value
18
+
19
+ let backwardPipe value = sprintf "<| %s" value
20
+
21
+ let backwardPipeConditional test value = if test value then backwardPipe value else value
22
+
23
+ let addTypeAnnotation typeAnnotation value = sprintf "%s: %s" value typeAnnotation
24
+
25
+ let escapeSpecialCharacters (str: string) =
26
+ str.Replace("\n", "\\n")
27
+ .Replace("\t", "\\t")
28
+ .Replace("\r", "\\r")
29
+ .Replace("\"", "\\\"")
30
+
31
+ let formatString str =
32
+ str
33
+ |> escapeSpecialCharacters
34
+ |> sprintf "\"%s\""
35
+
36
+ let formatBool b = if b then "true" else "false"
37
+
38
+ let formatDateTime (dateTime: DateTime) =
39
+ if dateTime.TimeOfDay = TimeSpan.Zero then
40
+ sprintf "DateTime(%d, %d, %d)" dateTime.Year dateTime.Month dateTime.Day
41
+ else
42
+ sprintf "DateTime(%d, %d, %d, %d, %d, %d)" dateTime.Year dateTime.Month dateTime.Day dateTime.Hour dateTime.Minute dateTime.Second
43
+
44
+ let formatTimeSpan (timeSpan: TimeSpan) =
45
+ sprintf "TimeSpan(%d, %d, %d)" timeSpan.Hours timeSpan.Minutes timeSpan.Seconds
46
+
47
+ let normalizeJArray (jArray: JArray): obj list =
48
+ let toBoxedList seq =
49
+ seq
50
+ |> Seq.map box
51
+ |> List.ofSeq
52
+
53
+ if jArray.Count = 0 then
54
+ []
55
+ else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Integer) then
56
+ jArray.Values<int>() |> toBoxedList
57
+ else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Float) then
58
+ jArray.Values<float>() |> toBoxedList
59
+ else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Boolean) then
60
+ jArray.Values<bool>() |> toBoxedList
61
+ else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.String) then
62
+ jArray.Values<string>() |> toBoxedList
63
+ else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Date) then
64
+ jArray.Values<DateTime>() |> toBoxedList
65
+ else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.TimeSpan) then
66
+ jArray.Values<TimeSpan>() |> toBoxedList
67
+ else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Object) then
68
+ jArray.Children() |> Seq.map (fun jObject -> jObject.ToObject<Dictionary<string, obj>>()) |> toBoxedList
69
+ else
70
+ jArray.Values<obj>() |> toBoxedList
71
+
72
+ let formatToken (jToken: JToken) =
73
+ match jToken.Type with
74
+ | JTokenType.Integer -> jToken.ToObject<int>() |> string
75
+ | JTokenType.Float -> jToken.ToObject<float>() |> string
76
+ | JTokenType.Boolean -> jToken.ToObject<bool>() |> formatBool
77
+ | JTokenType.String -> jToken.ToObject<string>() |> formatString
78
+ | JTokenType.Date -> jToken.ToObject<DateTime>() |> formatDateTime
79
+ | JTokenType.TimeSpan -> jToken.ToObject<TimeSpan>() |> formatTimeSpan
80
+ | _ -> string jToken
81
+
82
+ let formatJArray (jArray: JArray) =
83
+ jArray
84
+ |> normalizeJArray
85
+ |> sprintf "%A"
86
+
87
+ let formatTuple tuple = sprintf "%A" tuple
88
+
89
+ let formatRecord record = sprintf "%A" record
90
+
91
+ let formatOption option =
92
+ match option with
93
+ | None -> "None"
94
+ | Some x -> sprintf "Some %s" x
95
+
96
+ let formatResult result =
97
+ match result with
98
+ | Ok x -> sprintf "Ok %s" x
99
+ | Error y -> sprintf "Error %s" y
100
+
101
+ let rec formatValue (value: obj) =
102
+ match value with
103
+ | :? string as s ->
104
+ formatString s
105
+ | :? bool as b ->
106
+ formatBool b
107
+ | :? DateTime as dateTime ->
108
+ formatDateTime dateTime
109
+ | :? JArray as jArray ->
110
+ formatJArray jArray
111
+ | :? JToken as jToken ->
112
+ formatToken jToken
113
+ | :? Option<obj> as option ->
114
+ option |> Option.map formatValue |> formatOption
115
+ | :? Result<obj, obj> as result ->
116
+ result |> Result.map formatValue |> Result.mapError formatValue |> formatResult
117
+ | _ when FSharpType.IsTuple (value.GetType()) ->
118
+ formatTuple value
119
+ | _ when FSharpType.IsRecord (value.GetType()) ->
120
+ formatRecord value
121
+ | _ ->
122
+ string value
123
+
124
+ let formatCollection formatString collection =
125
+ collection
126
+ |> String.concat "; "
127
+ |> sprintf formatString
128
+
129
+ let formatList sequence = formatCollection "[%s]" sequence
130
+
131
+ let formatArray sequence = formatCollection "[|%s|]" sequence
132
+
133
+ let formatSequence sequence = formatCollection "seq {%s}" sequence
134
+
135
+ let formatMultiLineCollection (openPrefix, closePostfix) collection =
136
+ match Seq.length collection with
137
+ | 0 ->
138
+ sprintf "%s%s" openPrefix closePostfix
139
+ | 1 ->
140
+ sprintf "%s%s%s" openPrefix (Seq.head collection) closePostfix
141
+ | length ->
142
+ let lineIndent = String(' ', String.length openPrefix)
143
+
144
+ let formatLine i line =
145
+ match i with
146
+ | 0 ->
147
+ sprintf "%s %s" openPrefix line
148
+ | _ when i = length - 1 ->
149
+ sprintf "%s %s %s" lineIndent line closePostfix
150
+ | _ ->
151
+ sprintf "%s %s" lineIndent line
152
+
153
+ collection
154
+ |> Seq.mapi formatLine
155
+ |> Seq.toList
156
+ |> List.map (indent 2)
157
+ |> String.concat "\n"
158
+ |> sprintf "\n%s"
159
+
160
+ let formatMultiLineList sequence = formatMultiLineCollection ("[", "]") sequence
161
+
162
+ let formatMultiLineArray sequence = formatMultiLineCollection ("[|", "|]") sequence
163
+
164
+ let formatMultiLineSequence sequence = formatMultiLineCollection ("seq {", "}") sequence
165
+
166
+ let formatMultiLineString strings =
167
+ let length = Seq.length strings
168
+ let formatLine i line =
169
+ match i = length - 1 with
170
+ | true -> line
171
+ | false -> sprintf "%s +" line
172
+
173
+ strings
174
+ |> Seq.mapi formatLine
175
+ |> Seq.toList
176
+
177
+ type OutputFilter() =
178
+ static member Format (input: string) = formatValue input
179
+
180
+ static member Indent (input: string) = indent 1 input
181
+
182
+ let private fileSystem = EmbeddedFileSystem(Assembly.GetExecutingAssembly(), "")
183
+ Template.RegisterFilter(OutputFilter().GetType())
184
+ Template.FileSystem <- fileSystem :> DotLiquid.FileSystems.IFileSystem
185
+
186
+ let private registrations = Dictionary<_,_>()
187
+ let rec private registerTypeTree templateDataType =
188
+ if registrations.ContainsKey templateDataType then ()
189
+ elif FSharpType.IsRecord templateDataType then
190
+ let properties = templateDataType.GetProperties(BindingFlags.Instance ||| BindingFlags.Public)
191
+ Template.RegisterSafeType(templateDataType, [| for p in properties -> p.Name |])
192
+ registrations.[templateDataType] <- true
193
+ for p in properties do registerTypeTree p.PropertyType
194
+ elif templateDataType.IsGenericType then
195
+ let t = templateDataType.GetGenericTypeDefinition()
196
+ if t = typedefof<seq<_>> || t = typedefof<list<_>> then
197
+ registrations.[templateDataType] <- true
198
+ registerTypeTree (templateDataType.GetGenericArguments().[0])
199
+ elif t = typedefof<IDictionary<_,_>> || t = typedefof<Map<_,_>> then
200
+ registrations.[templateDataType] <- true
201
+ registerTypeTree (templateDataType.GetGenericArguments().[0])
202
+ registerTypeTree (templateDataType.GetGenericArguments().[1])
203
+ elif t = typedefof<option<_>> then
204
+ Template.RegisterSafeType(templateDataType, [|"Value"; "IsSome"; "IsNone";|])
205
+ registrations.[templateDataType] <- true
206
+ registerTypeTree (templateDataType.GetGenericArguments().[0])
207
+ elif templateDataType.IsArray then
208
+ registrations.[templateDataType] <- true
209
+ registerTypeTree (templateDataType.GetElementType())
210
+ else
211
+ let properties = templateDataType.GetProperties(BindingFlags.Instance ||| BindingFlags.Public)
212
+ Template.RegisterSafeType(templateDataType, [| for p in properties -> p.Name |])
213
+ registrations.[templateDataType] <- true
214
+ for p in properties do registerTypeTree p.PropertyType
215
+
216
+ let renderInlineTemplate template data =
217
+ data.GetType() |> registerTypeTree
218
+
219
+ let parsedTemplate = Template.Parse template
220
+ parsedTemplate.Render(Hash.FromAnonymousObject(data))
221
+
222
+ let renderPartialTemplate templateName data =
223
+ let template = sprintf "{%% include \"%s\" %%}" templateName
224
+ renderInlineTemplate template data
@@ -0,0 +1,35 @@
1
+ module Generators.Program
2
+
3
+ open Serilog
4
+ open Exercise
5
+ open Input
6
+ open Options
7
+
8
+ let regenerateTestClass options =
9
+ let parseCanonicalData' = parseCanonicalData options
10
+
11
+ fun (exercise: Exercise) ->
12
+ let canonicalData = parseCanonicalData' exercise.Name
13
+ exercise.Regenerate(canonicalData)
14
+
15
+ let regenerateTestClasses options =
16
+ Log.Information("Re-generating test classes...")
17
+
18
+ let regenerateTestClass' = regenerateTestClass options
19
+
20
+ createExercises options.Exercises
21
+ |> Seq.iter regenerateTestClass'
22
+
23
+ Log.Information("Re-generated test classes.")
24
+
25
+ [<EntryPoint>]
26
+ let main argv =
27
+ Logging.setupLogger()
28
+
29
+ match parseOptions argv with
30
+ | Result.Ok(options) ->
31
+ regenerateTestClasses options
32
+ 0
33
+ | Result.Error(errors) ->
34
+ Log.Error("Error(s) parsing commandline arguments: {Errors}", errors)
35
+ 1
@@ -0,0 +1,8 @@
1
+ {
2
+ "profiles": {
3
+ "Generators": {
4
+ "commandName": "Project",
5
+ "commandLineArgs": "-e allergies"
6
+ }
7
+ }
8
+ }
@@ -0,0 +1 @@
1
+ {{ Sut }} |> should be Empty
@@ -0,0 +1 @@
1
+ {{ Sut }} |> should equal {{ Expected }}
@@ -0,0 +1,13 @@
1
+ // This file was auto-generated based on version {{ Version }} of the canonical data.
2
+
3
+ module {{ TestModuleName }}
4
+
5
+ {%- for namespace in Namespaces -%}
6
+ open {{ namespace }}
7
+ {%- endfor -%}
8
+
9
+ open {{ TestedModuleName }}
10
+
11
+ {%- for method in Methods -%}
12
+ {{ method }}
13
+ {%- endfor -%}
@@ -0,0 +1,3 @@
1
+ [<Fact{% if Skip %}(Skip = "Remove to run test"){% endif %}>]
2
+ let ``{{ Name }}`` () =
3
+ {{ Body }}
@@ -0,0 +1,4 @@
1
+ {%- for arrange in Arrange -%}
2
+ {{ arrange | indent }}
3
+ {%- endfor -%}
4
+ {{ Assert | indent }}
@@ -18,8 +18,8 @@ sudo: false
18
18
  # but since Travis only runs five jobs at a time throughout all of Exercism,
19
19
  # it is better citizenship to not test the additional versions.
20
20
  go:
21
- - 1.8.3
22
- - 1.9
21
+ - 1.8.x
22
+ - 1.x
23
23
  - tip
24
24
 
25
25
  # Travis runs in a 64 bit environment but beginning with Go 1.5, building a
@@ -61,7 +61,7 @@ script:
61
61
  matrix:
62
62
  include:
63
63
  # Keep this in sync with the latest version.
64
- - go: 1.8
64
+ - go: 1.x
65
65
  env: STATIC_CHECKERS=1
66
66
  allow_failures:
67
67
  - go: tip
@@ -13,7 +13,7 @@ This guide might be helpful before you start implementing the exercise: [Porting
13
13
  It's expected that your code follows the official Style guide: http://groovy-lang.org/style-guide.html
14
14
 
15
15
  ### Testing
16
- Instead of using JUnit we prefer [Spok](https://github.com/spockframework/spock) ~for consistency~ because it's an awesome framework!
16
+ Instead of using JUnit we prefer [Spock](https://github.com/spockframework/spock) ~for consistency~ because it's an awesome framework!
17
17
 
18
18
  ## Pull Requests
19
- It would be awesome if you follow this [simple guidelines](https://github.com/exercism/docs/blob/master/contributing/pull-request-guidelines.md) while creating your PR, but it isn't required.
19
+ It would be awesome if you follow this [simple guidelines](https://github.com/exercism/docs/blob/master/contributing/pull-request-guidelines.md) while creating your PR, but it isn't required.
@@ -2,6 +2,7 @@
2
2
  "language": "Groovy",
3
3
  "checklist_issue": 9,
4
4
  "active": false,
5
+ "blurb": "Groovy is an unopinionated, multi-paradigm language that enhances Java with the intent to make your code less verbose, yet still allows you utilize the power of the JVM.",
5
6
  "test_pattern": "(Spec)[.]groovy",
6
7
  "foregone": [
7
8
 
@@ -152,6 +153,17 @@
152
153
  "string manipulation",
153
154
  "regular expressions"
154
155
  ]
156
+ },
157
+ {
158
+ "uuid": "1d098fb3-0a27-5380-3849-73f2ca77ff2f84ca698",
159
+ "slug": "scrabble-score",
160
+ "core": false,
161
+ "unlocked_by": null,
162
+ "difficulty": 3,
163
+ "topics": [
164
+ "strings",
165
+ "mathematics"
166
+ ]
155
167
  }
156
168
  ]
157
169
  }
@@ -0,0 +1,18 @@
1
+ class ScrabbleScore {
2
+
3
+ static final letterValues = [
4
+ 'D': 2, 'G': 2,
5
+ 'B': 3, 'C': 3, 'M': 3, 'P': 3,
6
+ 'F': 4, 'H': 4, 'V': 4, 'W': 4, 'Y': 4,
7
+ 'K': 5,
8
+ 'J': 8, 'X': 8,
9
+ 'Q': 10, 'Z': 10
10
+ ].withDefault { 1 }
11
+
12
+ static scoreWord(String word) {
13
+ word.toUpperCase().inject(0) { total, letter ->
14
+ total + letterValues[letter]
15
+ }
16
+ }
17
+
18
+ }
@@ -0,0 +1,63 @@
1
+ ## Scrabble Score
2
+
3
+ Given a word, compute the scrabble score for that word.
4
+
5
+ ## Letter Values
6
+
7
+ You'll need these:
8
+
9
+ ```text
10
+ Letter Value
11
+ A, E, I, O, U, L, N, R, S, T 1
12
+ D, G 2
13
+ B, C, M, P 3
14
+ F, H, V, W, Y 4
15
+ K 5
16
+ J, X 8
17
+ Q, Z 10
18
+ ```
19
+
20
+ ## Examples
21
+
22
+ "cabbage" should be scored as worth 14 points:
23
+
24
+ - 3 points for C
25
+ - 1 point for A, twice
26
+ - 3 points for B, twice
27
+ - 2 points for G
28
+ - 1 point for E
29
+
30
+ And to total:
31
+
32
+ - `3 + 2*1 + 2*3 + 2 + 1`
33
+ - = `3 + 2 + 6 + 3`
34
+ - = `5 + 9`
35
+ - = 14
36
+
37
+ ## Extensions
38
+
39
+ - You can play a double or a triple letter.
40
+ - You can play a double or a triple word.
41
+
42
+ ## Source
43
+
44
+ Inspired by the Extreme Startup game. [https://github.com/rchatley/extreme_startup](https://github.com/rchatley/extreme_startup)
45
+
46
+ ## Need help?
47
+
48
+ For installation and learning resources, refer to the
49
+ [exercism help page](http://exercism.io/languages/groovy).
50
+
51
+ ## Running the Tests
52
+ Run the tests by executing the test script.
53
+
54
+ ```
55
+ $ groovy ./ScrabbleScoreSpec.groovy
56
+ ```
57
+
58
+ After the first test(s) pass, continue by commenting out or removing the `@Ignore` annotations on other tests.
59
+
60
+ When all tests pass, congratulations!
61
+
62
+ ## Submitting Incomplete Solutions
63
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,7 @@
1
+ class ScrabbleScore {
2
+
3
+ static scoreWord(String word) {
4
+ throw new UnsupportedOperationException('scoreWord method not implemented.')
5
+ }
6
+
7
+ }
@@ -0,0 +1,45 @@
1
+ @Grab('org.spockframework:spock-core:1.0-groovy-2.4')
2
+ import spock.lang.*
3
+
4
+ class ScrabbleScoreSpec extends Specification {
5
+
6
+ def 'lowercase letter'() {
7
+ expect:
8
+ ScrabbleScore.scoreWord('a') == 1
9
+ }
10
+
11
+ def 'uppercase letter'() {
12
+ expect:
13
+ ScrabbleScore.scoreWord('A') == 1
14
+ }
15
+
16
+ def 'valuable letter'() {
17
+ expect:
18
+ ScrabbleScore.scoreWord('f') == 4
19
+ }
20
+
21
+ def 'empty input'() {
22
+ expect:
23
+ ScrabbleScore.scoreWord('') == 0
24
+ }
25
+
26
+ @Unroll
27
+ def 'score for word #word should be #expectedScore'() {
28
+ when:
29
+ def score = ScrabbleScore.scoreWord(word)
30
+
31
+ then:
32
+ score == expectedScore
33
+
34
+ where:
35
+ word | expectedScore
36
+ 'at' | 2
37
+ 'zoo' | 12
38
+ 'street' | 6
39
+ 'quirky' | 22
40
+ 'OxyphenButazone' | 41
41
+ 'pinata' | 8
42
+ 'abcdefghijklmnopqrstuvwxyz' | 87
43
+ }
44
+
45
+ }
@@ -1,6 +1,6 @@
1
1
  class TwoFer {
2
2
 
3
3
  static String twoFer(String name) {
4
- throw UnsupportedOperionExcetion('Method is not implemented')
4
+ throw new UnsupportedOperationException('Method is not implemented')
5
5
  }
6
- }
6
+ }
@@ -71,7 +71,7 @@ one, head over there and create an issue. We'll do our best to help you!
71
71
 
72
72
  ## Source
73
73
 
74
- Software Craftsmanship - Kata-logue [http://craftsmanship.sv.cmu.edu/exercises/coin-change-kata](http://craftsmanship.sv.cmu.edu/exercises/coin-change-kata)
74
+ Software Craftsmanship - Coin Change Kata [https://web.archive.org/web/20130115115225/http://craftsmanship.sv.cmu.edu:80/exercises/coin-change-kata](https://web.archive.org/web/20130115115225/http://craftsmanship.sv.cmu.edu:80/exercises/coin-change-kata)
75
75
 
76
76
  ## Submitting Incomplete Solutions
77
77
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.