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
@@ -5,7 +5,7 @@ Use lenses to update nested records (specific to languages with immutable data).
5
5
  Updating fields of nested records is kind of annoying in Haskell. One solution
6
6
  is to use [lenses](https://wiki.haskell.org/Lens). Implement several record
7
7
  accessing functions using lenses, you may use any library you want. The test
8
- suite also allows you to avoid lenses alltogether so you can experiment with
8
+ suite also allows you to avoid lenses altogether so you can experiment with
9
9
  different approaches.
10
10
 
11
11
 
@@ -5,19 +5,12 @@ Detect palindrome products in a given range.
5
5
  A palindromic number is a number that remains the same when its digits are
6
6
  reversed. For example, `121` is a palindromic number but `112` is not.
7
7
 
8
- Given the definition of a palindromic number, we define a palindrome _product_
9
- to be the product `c`, such that `a * b = c`, where `c` is a palindromic number and
10
- `a` and `b` are integers (possibly, but _not_ necessarily palindromic numbers).
8
+ Given a range of numbers, find the largest and smallest palindromes which
9
+ are products of numbers within that range.
11
10
 
12
- For example, the palindromic number 9009 can be written as the palindrome
13
- product: `91 * 99 = 9009`.
14
-
15
- It's possible (and indeed common) for a palindrome product to be the product
16
- of multiple combinations of numbers. For example, the palindrome product `9` has
17
- the factors `(1, 9)` and `(3, 3)`.
18
-
19
- Write a program that given a range of integers, returns the smallest and largest
20
- palindromic product of factors within that range, along with all the factors in the range for that product.
11
+ Your solution should return the largest and smallest palindromes, along with the
12
+ factors of each within the range. If the largest or smallest palindrome has more
13
+ than one pair of factors within the range, then return all the pairs.
21
14
 
22
15
  ## Example 1
23
16
 
@@ -8,9 +8,6 @@ multiples of either 3 or 5, we get 3, 5, 6 and 9, 10, 12, 15, and 18.
8
8
 
9
9
  The sum of these multiples is 78.
10
10
 
11
- Given a number, find the sum of the multiples of a given set of numbers,
12
- up to but not including that number.
13
-
14
11
 
15
12
  ## Getting Started
16
13
 
@@ -43,6 +43,18 @@
43
43
  "Export Modifiers",
44
44
  "Vectors"
45
45
  ]
46
+ },
47
+ {
48
+ "uuid": "612f5f98-09a6-9d80-5820-edeec5ce1e1544073ed",
49
+ "slug": "accumulate",
50
+ "core": false,
51
+ "unlocked_by": null,
52
+ "difficulty": 1,
53
+ "topics": [
54
+ "Functions",
55
+ "Lists",
56
+ "Map"
57
+ ]
46
58
  }
47
59
  ]
48
60
  }
@@ -0,0 +1,5 @@
1
+ package accumulate
2
+
3
+ sourcedir = src
4
+ modules = Accumulate, Test.Accumulate
5
+ tests = Test.Accumulate.runTests
@@ -0,0 +1,23 @@
1
+ idris ?= idris
2
+ pkg := Accumulate
3
+
4
+ .PHONY: build clean clobber install rebuild test
5
+
6
+ all: test
7
+
8
+ build:
9
+ @ ${idris} --build ${pkg}.ipkg
10
+
11
+ clean:
12
+ @ ${idris} --clean ${pkg}.ipkg
13
+
14
+ clobber: clean
15
+ @ find . -name '*.ibc' -delete
16
+
17
+ install:
18
+ @ ${idris} --install ${pkg}.ipkg
19
+
20
+ rebuild: clean build
21
+
22
+ test:
23
+ @ ${idris} --testpkg ${pkg}.ipkg
@@ -0,0 +1,32 @@
1
+ # Accumulate
2
+
3
+ Implement the `accumulate` operation, which, given a collection and an
4
+ operation to perform on each element of the collection, returns a new
5
+ collection containing the result of applying that operation to each element of
6
+ the input collection.
7
+
8
+ Given the collection of numbers:
9
+
10
+ - 1, 2, 3, 4, 5
11
+
12
+ And the operation:
13
+
14
+ - square a number (`x => x * x`)
15
+
16
+ Your code should be able to produce the collection of squares:
17
+
18
+ - 1, 4, 9, 16, 25
19
+
20
+ Check out the test suite to see the expected function signature.
21
+
22
+ ## Restrictions
23
+
24
+ Keep your hands off that collect/map/fmap/whatchamacallit functionality
25
+ provided by your standard library!
26
+ Solve this one yourself using other basic tools instead.
27
+ ## Source
28
+
29
+ Conversation with James Edward Gray II [https://twitter.com/jeg2](https://twitter.com/jeg2)
30
+
31
+ ## Submitting Incomplete Solutions
32
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,6 @@
1
+ module Accumulate
2
+
3
+ export
4
+ accumulate : (Int -> Int) -> List Int -> List Int
5
+ accumulate f [] = []
6
+ accumulate f (x::xs) = f x :: accumulate f xs
@@ -0,0 +1,35 @@
1
+ module Test.Accumulate
2
+
3
+ import Accumulate
4
+
5
+ %access export
6
+
7
+ assertEq : Eq a => String -> (given : a) -> (expected : a) -> IO ()
8
+ assertEq label g e = putStrLn $ if g == e then label ++ ": Test Passed" else label ++ ": Test Failed"
9
+
10
+ testEmptyListDoesNothing : IO ()
11
+ testEmptyListDoesNothing = assertEq "empty list does nothing" (accumulate (\x => x) []) []
12
+
13
+ testIdentityFunctionDoesNothing : IO ()
14
+ testIdentityFunctionDoesNothing = assertEq "identity function does nothing" (accumulate (\x => x) [1,2,3]) [1,2,3]
15
+
16
+ testSquareFunctionDoublesInput : IO ()
17
+ testSquareFunctionDoublesInput = assertEq "square function doubles input" (accumulate (\x => x * x) [1,2,3]) [1,4,9]
18
+
19
+ testCubeFunctionTriplesInput : IO ()
20
+ testCubeFunctionTriplesInput = assertEq "cube function triples input" (accumulate (\x => x * x * x) [1,2,3]) [1,8,27]
21
+
22
+ testIncrementFunctionAddsOneToAllInput : IO ()
23
+ testIncrementFunctionAddsOneToAllInput = assertEq "increment function adds 1 to input" (accumulate (\x => x + 1) [1,2,3]) [2,3,4]
24
+
25
+ testDecrementFunctionAddsOneToAllInput : IO ()
26
+ testDecrementFunctionAddsOneToAllInput = assertEq "decrement function subtracts 1 from input" (accumulate (\x => x - 1) [1,2,3]) [0,1,2]
27
+
28
+ runTests : IO ()
29
+ runTests = do
30
+ testEmptyListDoesNothing
31
+ testIdentityFunctionDoesNothing
32
+ testSquareFunctionDoublesInput
33
+ testCubeFunctionTriplesInput
34
+ testIncrementFunctionAddsOneToAllInput
35
+ testDecrementFunctionAddsOneToAllInput
@@ -49,13 +49,10 @@
49
49
  },
50
50
  {
51
51
  "alumnus": false,
52
- "avatar_url": null,
53
- "bio": null,
52
+ "bio": "I'm a software developer working for Softwire, a UK based software company. I love programming in pretty much any language (possibly with the exception of C++) but Java is probably the language I have the most experience with.",
54
53
  "github_username": "FridaTveit",
55
- "link_text": null,
56
- "link_url": null,
57
- "name": null,
58
- "show_on_website": false
54
+ "name": "Frida Johanne Tveit",
55
+ "show_on_website": true
59
56
  }
60
57
  ]
61
- }
58
+ }
@@ -263,7 +263,11 @@
263
263
  "core": true,
264
264
  "difficulty": 4,
265
265
  "slug": "rotational-cipher",
266
- "topics": null,
266
+ "topics": [
267
+ "integers",
268
+ "strings",
269
+ "cryptography"
270
+ ],
267
271
  "unlocked_by": null,
268
272
  "uuid": "9eb41883-55ef-4681-b5ac-5c2259302772"
269
273
  },
@@ -307,7 +311,7 @@
307
311
  "lists",
308
312
  "loops",
309
313
  "integers"
310
- ],
314
+ ],
311
315
  "unlocked_by": "triangle",
312
316
  "uuid": "2c69db99-648d-4bd7-8012-1fbdeff6ca0a"
313
317
  },
@@ -315,7 +319,16 @@
315
319
  "core": true,
316
320
  "difficulty": 4,
317
321
  "slug": "saddle-points",
318
- "topics": null,
322
+ "topics": [
323
+ "arrays",
324
+ "conditionals",
325
+ "integers",
326
+ "lists",
327
+ "loops",
328
+ "mathematics",
329
+ "matrices",
330
+ "sets"
331
+ ],
319
332
  "unlocked_by": null,
320
333
  "uuid": "8dfc2f0d-1141-46e9-95e2-6f35ccf6f160"
321
334
  },
@@ -324,12 +337,12 @@
324
337
  "difficulty": 4,
325
338
  "slug": "diamond",
326
339
  "topics": [
327
- "strings",
328
- "loops",
329
- "arrays",
330
- "lists",
331
- "text_formatting"
332
- ],
340
+ "strings",
341
+ "loops",
342
+ "arrays",
343
+ "lists",
344
+ "text_formatting"
345
+ ],
333
346
  "unlocked_by": "two-fer",
334
347
  "uuid": "ecbd997b-86f4-4e11-9ff0-706ac2899415"
335
348
  },
@@ -350,7 +363,12 @@
350
363
  "core": true,
351
364
  "difficulty": 5,
352
365
  "slug": "flatten-array",
353
- "topics": null,
366
+ "topics": [
367
+ "arrays",
368
+ "lists",
369
+ "loops",
370
+ "recursion"
371
+ ],
354
372
  "unlocked_by": null,
355
373
  "uuid": "a732a838-8170-458a-a85e-d6b4c46f97a1"
356
374
  },
@@ -481,7 +499,10 @@
481
499
  "core": false,
482
500
  "difficulty": 5,
483
501
  "slug": "bracket-push",
484
- "topics": null,
502
+ "topics": [
503
+ "stacks",
504
+ "strings"
505
+ ],
485
506
  "unlocked_by": "flatten-array",
486
507
  "uuid": "85aa50ac-0141-49eb-bc6f-62f3f7a97647"
487
508
  },
@@ -503,7 +524,11 @@
503
524
  "core": false,
504
525
  "difficulty": 5,
505
526
  "slug": "atbash-cipher",
506
- "topics": null,
527
+ "topics": [
528
+ "strings",
529
+ "cryptography",
530
+ "security"
531
+ ],
507
532
  "unlocked_by": "rotational-cipher",
508
533
  "uuid": "d36ce010-210f-4e9a-9d6c-cb933e0a59af"
509
534
  },
@@ -558,10 +583,10 @@
558
583
  "difficulty": 6,
559
584
  "slug": "food-chain",
560
585
  "topics": [
561
- "arrays",
562
- "lists",
563
- "strings"
564
- ],
586
+ "arrays",
587
+ "lists",
588
+ "strings"
589
+ ],
565
590
  "unlocked_by": "two-fer",
566
591
  "uuid": "dd3e6fd6-5359-4978-acd7-c39374cead4d"
567
592
  },
@@ -622,7 +647,12 @@
622
647
  "core": false,
623
648
  "difficulty": 6,
624
649
  "slug": "robot-simulator",
625
- "topics": null,
650
+ "topics": [
651
+ "classes",
652
+ "logic",
653
+ "loops",
654
+ "enumerations"
655
+ ],
626
656
  "unlocked_by": "secret-handshake",
627
657
  "uuid": "993bde9d-7774-4e7a-a381-9eee75f28ecb"
628
658
  },
@@ -690,6 +720,20 @@
690
720
  "unlocked_by": "scrabble-score",
691
721
  "uuid": "4b3f7771-c642-4278-a3d9-2fb958f26361"
692
722
  },
723
+ {
724
+ "core": false,
725
+ "difficulty": 6,
726
+ "slug": "tournament",
727
+ "topics": [
728
+ "loops",
729
+ "maps",
730
+ "sorting",
731
+ "parsing",
732
+ "text_formatting"
733
+ ],
734
+ "unlocked_by": "matrix",
735
+ "uuid": "99191d53-0fed-f680-de7a-55cfb872de17bc58629"
736
+ },
693
737
  {
694
738
  "core": false,
695
739
  "difficulty": 7,
@@ -748,7 +792,12 @@
748
792
  "core": false,
749
793
  "difficulty": 7,
750
794
  "slug": "meetup",
751
- "topics": null,
795
+ "topics": [
796
+ "conditionals",
797
+ "dates",
798
+ "loops",
799
+ "enumerations"
800
+ ],
752
801
  "unlocked_by": "gigasecond",
753
802
  "uuid": "602511d5-7e89-4def-b072-4dd311816810"
754
803
  },
@@ -756,7 +805,14 @@
756
805
  "core": false,
757
806
  "difficulty": 7,
758
807
  "slug": "crypto-square",
759
- "topics": null,
808
+ "topics": [
809
+ "strings",
810
+ "text_formatting",
811
+ "mathematics",
812
+ "cryptography",
813
+ "security",
814
+ "lists"
815
+ ],
760
816
  "unlocked_by": "rotational-cipher",
761
817
  "uuid": "162bebdc-9bf2-43c0-8460-a91f5fc16147"
762
818
  },
@@ -776,7 +832,14 @@
776
832
  "core": false,
777
833
  "difficulty": 7,
778
834
  "slug": "clock",
779
- "topics": null,
835
+ "topics": [
836
+ "equality",
837
+ "integers",
838
+ "logic",
839
+ "object_oriented_programming",
840
+ "strings",
841
+ "time"
842
+ ],
780
843
  "unlocked_by": "saddle-points",
781
844
  "uuid": "97c8fcd4-85b6-41cb-9de2-b4e1b4951222"
782
845
  },
@@ -820,7 +883,14 @@
820
883
  "core": false,
821
884
  "difficulty": 8,
822
885
  "slug": "simple-cipher",
823
- "topics": null,
886
+ "topics": [
887
+ "strings",
888
+ "cryptography",
889
+ "security",
890
+ "mathematics",
891
+ "randomness",
892
+ "exception_handling"
893
+ ],
824
894
  "unlocked_by": "rotational-cipher",
825
895
  "uuid": "f654831f-c34b-44f5-9dd5-054efbb486f2"
826
896
  },
@@ -856,7 +926,14 @@
856
926
  "core": false,
857
927
  "difficulty": 8,
858
928
  "slug": "palindrome-products",
859
- "topics": null,
929
+ "topics": [
930
+ "conditionals",
931
+ "integers",
932
+ "lists",
933
+ "loops",
934
+ "maps",
935
+ "mathematics"
936
+ ],
860
937
  "unlocked_by": "saddle-points",
861
938
  "uuid": "873c05de-b5f5-4c5b-97f0-d1ede8a82832"
862
939
  },
@@ -5,7 +5,7 @@ import java.util.LinkedList;
5
5
  import java.util.List;
6
6
  import java.util.Queue;
7
7
 
8
- public class BST<T extends Comparable<T>> {
8
+ public class BinarySearchTree<T extends Comparable<T>> {
9
9
 
10
10
  public static class Node<T> {
11
11
 
@@ -6,15 +6,21 @@ import static org.junit.Assert.assertEquals;
6
6
  import static org.junit.Assert.assertNotNull;
7
7
  import org.junit.Ignore;
8
8
  import org.junit.Test;
9
+ import org.junit.Before;
9
10
 
10
- public class BSTTest {
11
+ public class BinarySearchTreeTest {
12
+ private BinarySearchTree<Integer> binarySearchTree;
13
+
14
+ @Before
15
+ public void setUp() {
16
+ binarySearchTree = new BinarySearchTree<>();
17
+ }
11
18
 
12
19
  @Test
13
20
  public void dataIsRetained() {
14
- BST<Integer> bst = new BST<>();
15
21
  final int actual = 4;
16
- bst.insert(actual);
17
- final BST.Node<Integer> root = bst.getRoot();
22
+ binarySearchTree.insert(actual);
23
+ final BinarySearchTree.Node<Integer> root = binarySearchTree.getRoot();
18
24
  assertNotNull(root);
19
25
  final int expected = root.getData();
20
26
  assertEquals(expected, actual);
@@ -23,16 +29,15 @@ public class BSTTest {
23
29
  @Ignore("Remove to run test")
24
30
  @Test
25
31
  public void insertsLess() {
26
- BST<Integer> bst = new BST<>();
27
32
  final int expectedRoot = 4;
28
33
  final int expectedLeft = 2;
29
34
 
30
- bst.insert(expectedRoot);
31
- bst.insert(expectedLeft);
35
+ binarySearchTree.insert(expectedRoot);
36
+ binarySearchTree.insert(expectedLeft);
32
37
 
33
- final BST.Node<Integer> root = bst.getRoot();
38
+ final BinarySearchTree.Node<Integer> root = binarySearchTree.getRoot();
34
39
  assertNotNull(root);
35
- final BST.Node<Integer> left = root.getLeft();
40
+ final BinarySearchTree.Node<Integer> left = root.getLeft();
36
41
  assertNotNull(left);
37
42
 
38
43
  final int actualRoot = root.getData();
@@ -44,16 +49,15 @@ public class BSTTest {
44
49
  @Ignore("Remove to run test")
45
50
  @Test
46
51
  public void insertsSame() {
47
- BST<Integer> bst = new BST<>();
48
52
  final int expectedRoot = 4;
49
53
  final int expectedLeft = 4;
50
54
 
51
- bst.insert(expectedRoot);
52
- bst.insert(expectedLeft);
55
+ binarySearchTree.insert(expectedRoot);
56
+ binarySearchTree.insert(expectedLeft);
53
57
 
54
- final BST.Node<Integer> root = bst.getRoot();
58
+ final BinarySearchTree.Node<Integer> root = binarySearchTree.getRoot();
55
59
  assertNotNull(root);
56
- final BST.Node<Integer> left = root.getLeft();
60
+ final BinarySearchTree.Node<Integer> left = root.getLeft();
57
61
  assertNotNull(left);
58
62
 
59
63
  final int actualRoot = root.getData();
@@ -65,16 +69,15 @@ public class BSTTest {
65
69
  @Ignore("Remove to run test")
66
70
  @Test
67
71
  public void insertsRight() {
68
- BST<Integer> bst = new BST<>();
69
72
  final int expectedRoot = 4;
70
73
  final int expectedRight = 5;
71
74
 
72
- bst.insert(expectedRoot);
73
- bst.insert(expectedRight);
75
+ binarySearchTree.insert(expectedRoot);
76
+ binarySearchTree.insert(expectedRight);
74
77
 
75
- final BST.Node<Integer> root = bst.getRoot();
78
+ final BinarySearchTree.Node<Integer> root = binarySearchTree.getRoot();
76
79
  assertNotNull(root);
77
- final BST.Node<Integer> right = root.getRight();
80
+ final BinarySearchTree.Node<Integer> right = root.getRight();
78
81
  assertNotNull(right);
79
82
 
80
83
  final int actualRoot = root.getData();
@@ -86,7 +89,6 @@ public class BSTTest {
86
89
  @Ignore("Remove to run test")
87
90
  @Test
88
91
  public void createsComplexTree() {
89
- BST<Integer> bst = new BST<>();
90
92
  List<Integer> expected = Collections.unmodifiableList(
91
93
  Arrays.asList(4, 2, 6, 1, 3, 5, 7)
92
94
  );
@@ -94,60 +96,56 @@ public class BSTTest {
94
96
  List<Integer> treeData = Collections.unmodifiableList(
95
97
  Arrays.asList(4, 2, 6, 1, 3, 7, 5)
96
98
  );
97
- treeData.forEach(bst::insert);
99
+ treeData.forEach(binarySearchTree::insert);
98
100
 
99
- List<Integer> actual = bst.getAsLevelOrderList();
101
+ List<Integer> actual = binarySearchTree.getAsLevelOrderList();
100
102
  assertEquals(expected, actual);
101
103
  }
102
104
 
103
105
  @Ignore("Remove to run test")
104
106
  @Test
105
107
  public void sortsSingleElement() {
106
- BST<Integer> bst = new BST<>();
107
108
  List<Integer> expected = Collections.unmodifiableList(
108
109
  Collections.singletonList(4)
109
110
  );
110
111
 
111
- bst.insert(4);
112
+ binarySearchTree.insert(4);
112
113
 
113
- List<Integer> actual = bst.getAsSortedList();
114
+ List<Integer> actual = binarySearchTree.getAsSortedList();
114
115
  assertEquals(expected, actual);
115
116
  }
116
117
 
117
118
  @Ignore("Remove to run test")
118
119
  @Test
119
120
  public void sortsCollectionOfTwoIfSecondInsertedIsSmallerThanFirst() {
120
- BST<Integer> bst = new BST<>();
121
121
  List<Integer> expected = Collections.unmodifiableList(
122
122
  Arrays.asList(2, 4)
123
123
  );
124
124
 
125
- bst.insert(4);
126
- bst.insert(2);
125
+ binarySearchTree.insert(4);
126
+ binarySearchTree.insert(2);
127
127
 
128
- List<Integer> actual = bst.getAsSortedList();
128
+ List<Integer> actual = binarySearchTree.getAsSortedList();
129
129
  assertEquals(expected, actual);
130
130
  }
131
131
 
132
132
  @Ignore("Remove to run test")
133
133
  @Test
134
134
  public void sortsCollectionOfTwoIfSecondInsertedIsBiggerThanFirst() {
135
- BST<Integer> bst = new BST<>();
136
135
  List<Integer> expected = Collections.unmodifiableList(
137
136
  Arrays.asList(4, 5)
138
137
  );
139
138
 
140
- bst.insert(4);
141
- bst.insert(5);
139
+ binarySearchTree.insert(4);
140
+ binarySearchTree.insert(5);
142
141
 
143
- List<Integer> actual = bst.getAsSortedList();
142
+ List<Integer> actual = binarySearchTree.getAsSortedList();
144
143
  assertEquals(expected, actual);
145
144
  }
146
145
 
147
146
  @Ignore("Remove to run test")
148
147
  @Test
149
148
  public void iteratesOverComplexTree() {
150
- BST<Integer> bst = new BST<>();
151
149
  List<Integer> expected = Collections.unmodifiableList(
152
150
  Arrays.asList(1, 2, 3, 4, 5, 6, 7)
153
151
  );
@@ -155,9 +153,9 @@ public class BSTTest {
155
153
  List<Integer> treeData = Collections.unmodifiableList(
156
154
  Arrays.asList(4, 2, 1, 3, 6, 7, 5)
157
155
  );
158
- treeData.forEach(bst::insert);
156
+ treeData.forEach(binarySearchTree::insert);
159
157
 
160
- List<Integer> actual = bst.getAsSortedList();
158
+ List<Integer> actual = binarySearchTree.getAsSortedList();
161
159
  assertEquals(expected, actual);
162
160
  }
163
161
  }
@@ -9,21 +9,25 @@ class GridPosition {
9
9
  this.y = y;
10
10
  }
11
11
 
12
- /*
13
- * This equals method is of deliberately narrow scope (only allows comparison with another GridPosition) to increase
14
- * readability. In general, one should provide a full implementation of Object.equals(Object obj) and a
15
- * corresponding implementation of Object.hashCode(). See
16
- *
17
- * https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)
18
- *
19
- * and
20
- *
21
- * https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
22
- *
23
- * for more information.
24
- */
25
- boolean equals(final GridPosition gridPosition) {
26
- return this.x == gridPosition.x && this.y == gridPosition.y;
12
+ @Override
13
+ public int hashCode() {
14
+ final int prime = 31;
15
+ int result = 1;
16
+ result = prime * result + x;
17
+ result = prime * result + y;
18
+ return result;
27
19
  }
28
20
 
21
+ @Override
22
+ public boolean equals(Object obj) {
23
+ if (this == obj) {
24
+ return true;
25
+ } else if (obj == null || getClass() != obj.getClass()) {
26
+ return false;
27
+ } else if (x != ((GridPosition) obj).x || y != ((GridPosition)obj).y) {
28
+ return false;
29
+ } else {
30
+ return true;
31
+ }
32
+ }
29
33
  }
@@ -1,4 +1,4 @@
1
- class MatrixCoordinate {
1
+ class MatrixCoordinate implements Comparable<MatrixCoordinate> {
2
2
  private final int row;
3
3
  private final int col;
4
4
 
@@ -30,4 +30,10 @@ class MatrixCoordinate {
30
30
  result = 31 * result + col;
31
31
  return result;
32
32
  }
33
+
34
+ @Override
35
+ public int compareTo(MatrixCoordinate o) {
36
+ int rowComparison = Integer.compare(row, o.row);
37
+ return (rowComparison == 0) ? Integer.compare(col, o.col) : rowComparison;
38
+ }
33
39
  }
@@ -1,4 +1,4 @@
1
- class MatrixCoordinate {
1
+ class MatrixCoordinate implements Comparable<MatrixCoordinate> {
2
2
  private final int row;
3
3
  private final int col;
4
4
 
@@ -30,4 +30,10 @@ class MatrixCoordinate {
30
30
  result = 31 * result + col;
31
31
  return result;
32
32
  }
33
+
34
+ @Override
35
+ public int compareTo(MatrixCoordinate o) {
36
+ int rowComparison = Integer.compare(row, o.row);
37
+ return (rowComparison == 0) ? Integer.compare(col, o.col) : rowComparison;
38
+ }
33
39
  }