trackler 2.2.1.40 → 2.2.1.41

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 (376) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/lib/trackler/version.rb +1 -1
  4. data/problem-specifications/exercises/dot-dsl/metadata.yml +1 -0
  5. data/problem-specifications/exercises/etl/metadata.yml +1 -0
  6. data/problem-specifications/exercises/isogram/canonical-data.json +3 -3
  7. data/problem-specifications/exercises/ocr-numbers/metadata.yml +1 -0
  8. data/problem-specifications/exercises/pascals-triangle/metadata.yml +1 -0
  9. data/problem-specifications/exercises/pov/metadata.yml +1 -0
  10. data/problem-specifications/exercises/rna-transcription/metadata.yml +1 -0
  11. data/problem-specifications/exercises/sgf-parsing/metadata.yml +1 -0
  12. data/tracks/c/exercises/all-your-base/src/example.c +14 -14
  13. data/tracks/c/exercises/all-your-base/src/example.h +2 -2
  14. data/tracks/ceylon/exercises/hamming/source/hamming/HammingTest.ceylon +1 -1
  15. data/tracks/ceylon/exercises/rna-transcription/source/rnatranscription/{RNAtest.ceylon → RNATest.ceylon} +0 -0
  16. data/tracks/cfml/.git +1 -0
  17. data/tracks/cfml/.gitignore +5 -0
  18. data/tracks/cfml/.travis.yml +18 -0
  19. data/tracks/cfml/CONTRIBUTING.md +10 -0
  20. data/tracks/cfml/LICENSE +21 -0
  21. data/tracks/cfml/README.md +92 -0
  22. data/tracks/cfml/bin/fetch-configlet +32 -0
  23. data/tracks/cfml/config/exercise_readme.go.tmpl +16 -0
  24. data/tracks/cfml/config/maintainers.json +13 -0
  25. data/tracks/cfml/config.json +223 -0
  26. data/tracks/cfml/docs/ABOUT.md +10 -0
  27. data/tracks/cfml/docs/EXERCISE_README_INSERT.md +15 -0
  28. data/tracks/cfml/docs/INSTALLATION.md +35 -0
  29. data/tracks/cfml/docs/LEARNING.md +37 -0
  30. data/tracks/cfml/docs/RESOURCES.md +29 -0
  31. data/tracks/cfml/docs/SNIPPET.txt +8 -0
  32. data/tracks/cfml/docs/TESTS.md +13 -0
  33. data/tracks/cfml/exercises/acronym/.meta/HINTS.md +0 -0
  34. data/tracks/cfml/exercises/acronym/Acronym.cfc +13 -0
  35. data/tracks/cfml/exercises/acronym/AcronymTest.cfc +43 -0
  36. data/tracks/cfml/exercises/acronym/Solution.cfc +22 -0
  37. data/tracks/cfml/exercises/acronym/SolutionTest.cfc +7 -0
  38. data/tracks/cfml/exercises/acronym/TestRunner.cfc +103 -0
  39. data/tracks/cfml/exercises/acronym/box.json +8 -0
  40. data/tracks/cfml/exercises/acronym/index.cfm +37 -0
  41. data/tracks/cfml/exercises/atbash-cipher/.meta/HINTS.md +0 -0
  42. data/tracks/cfml/exercises/atbash-cipher/AtbashCipher.cfc +14 -0
  43. data/tracks/cfml/exercises/atbash-cipher/AtbashCipherTest.cfc +71 -0
  44. data/tracks/cfml/exercises/atbash-cipher/Solution.cfc +56 -0
  45. data/tracks/cfml/exercises/atbash-cipher/SolutionTest.cfc +7 -0
  46. data/tracks/cfml/exercises/atbash-cipher/TestRunner.cfc +103 -0
  47. data/tracks/cfml/exercises/atbash-cipher/box.json +8 -0
  48. data/tracks/cfml/exercises/atbash-cipher/index.cfm +37 -0
  49. data/tracks/cfml/exercises/bob/.meta/HINTS.md +0 -0
  50. data/tracks/cfml/exercises/bob/Bob.cfc +13 -0
  51. data/tracks/cfml/exercises/bob/BobTest.cfc +115 -0
  52. data/tracks/cfml/exercises/bob/Solution.cfc +27 -0
  53. data/tracks/cfml/exercises/bob/SolutionTest.cfc +7 -0
  54. data/tracks/cfml/exercises/bob/TestRunner.cfc +103 -0
  55. data/tracks/cfml/exercises/bob/box.json +8 -0
  56. data/tracks/cfml/exercises/bob/index.cfm +37 -0
  57. data/tracks/cfml/exercises/diamond/.meta/HINTS.md +0 -0
  58. data/tracks/cfml/exercises/diamond/Diamond.cfc +13 -0
  59. data/tracks/cfml/exercises/diamond/DiamondTest.cfc +35 -0
  60. data/tracks/cfml/exercises/diamond/Solution.cfc +35 -0
  61. data/tracks/cfml/exercises/diamond/SolutionTest.cfc +7 -0
  62. data/tracks/cfml/exercises/diamond/TestRunner.cfc +103 -0
  63. data/tracks/cfml/exercises/diamond/box.json +8 -0
  64. data/tracks/cfml/exercises/diamond/index.cfm +37 -0
  65. data/tracks/cfml/exercises/difference-of-squares/.meta/HINTS.md +0 -0
  66. data/tracks/cfml/exercises/difference-of-squares/DifferenceOfSquares.cfc +18 -0
  67. data/tracks/cfml/exercises/difference-of-squares/DifferenceOfSquaresTest.cfc +63 -0
  68. data/tracks/cfml/exercises/difference-of-squares/Solution.cfc +28 -0
  69. data/tracks/cfml/exercises/difference-of-squares/SolutionTest.cfc +7 -0
  70. data/tracks/cfml/exercises/difference-of-squares/TestRunner.cfc +103 -0
  71. data/tracks/cfml/exercises/difference-of-squares/box.json +8 -0
  72. data/tracks/cfml/exercises/difference-of-squares/index.cfm +37 -0
  73. data/tracks/cfml/exercises/flatten-array/.meta/HINTS.md +0 -0
  74. data/tracks/cfml/exercises/flatten-array/FlattenArray.cfc +13 -0
  75. data/tracks/cfml/exercises/flatten-array/FlattenArrayTest.cfc +42 -0
  76. data/tracks/cfml/exercises/flatten-array/Solution.cfc +26 -0
  77. data/tracks/cfml/exercises/flatten-array/SolutionTest.cfc +7 -0
  78. data/tracks/cfml/exercises/flatten-array/TestRunner.cfc +103 -0
  79. data/tracks/cfml/exercises/flatten-array/box.json +8 -0
  80. data/tracks/cfml/exercises/flatten-array/index.cfm +37 -0
  81. data/tracks/cfml/exercises/gigasecond/.meta/HINTS.md +0 -0
  82. data/tracks/cfml/exercises/gigasecond/Gigasecond.cfc +13 -0
  83. data/tracks/cfml/exercises/gigasecond/GigasecondTest.cfc +39 -0
  84. data/tracks/cfml/exercises/gigasecond/Solution.cfc +16 -0
  85. data/tracks/cfml/exercises/gigasecond/SolutionTest.cfc +7 -0
  86. data/tracks/cfml/exercises/gigasecond/TestRunner.cfc +103 -0
  87. data/tracks/cfml/exercises/gigasecond/box.json +8 -0
  88. data/tracks/cfml/exercises/gigasecond/index.cfm +37 -0
  89. data/tracks/cfml/exercises/grains/.meta/HINTS.md +0 -0
  90. data/tracks/cfml/exercises/grains/Grains.cfc +14 -0
  91. data/tracks/cfml/exercises/grains/GrainsTest.cfc +63 -0
  92. data/tracks/cfml/exercises/grains/Solution.cfc +22 -0
  93. data/tracks/cfml/exercises/grains/SolutionTest.cfc +7 -0
  94. data/tracks/cfml/exercises/grains/TestRunner.cfc +103 -0
  95. data/tracks/cfml/exercises/grains/box.json +8 -0
  96. data/tracks/cfml/exercises/grains/index.cfm +37 -0
  97. data/tracks/cfml/exercises/hamming/.meta/HINTS.md +0 -0
  98. data/tracks/cfml/exercises/hamming/Hamming.cfc +13 -0
  99. data/tracks/cfml/exercises/hamming/HammingTest.cfc +75 -0
  100. data/tracks/cfml/exercises/hamming/Solution.cfc +25 -0
  101. data/tracks/cfml/exercises/hamming/SolutionTest.cfc +7 -0
  102. data/tracks/cfml/exercises/hamming/TestRunner.cfc +103 -0
  103. data/tracks/cfml/exercises/hamming/box.json +8 -0
  104. data/tracks/cfml/exercises/hamming/index.cfm +37 -0
  105. data/tracks/cfml/exercises/hello-world/HelloWorld.cfc +13 -0
  106. data/tracks/cfml/exercises/hello-world/HelloWorldTest.cfc +18 -0
  107. data/tracks/cfml/exercises/hello-world/Solution.cfc +13 -0
  108. data/tracks/cfml/exercises/hello-world/SolutionTest.cfc +7 -0
  109. data/tracks/cfml/exercises/hello-world/TestRunner.cfc +103 -0
  110. data/tracks/cfml/exercises/hello-world/box.json +8 -0
  111. data/tracks/cfml/exercises/hello-world/index.cfm +37 -0
  112. data/tracks/cfml/exercises/isogram/.meta/HINTS.md +0 -0
  113. data/tracks/cfml/exercises/isogram/Isogram.cfc +13 -0
  114. data/tracks/cfml/exercises/isogram/IsogramTest.cfc +55 -0
  115. data/tracks/cfml/exercises/isogram/Solution.cfc +23 -0
  116. data/tracks/cfml/exercises/isogram/SolutionTest.cfc +7 -0
  117. data/tracks/cfml/exercises/isogram/TestRunner.cfc +103 -0
  118. data/tracks/cfml/exercises/isogram/box.json +8 -0
  119. data/tracks/cfml/exercises/isogram/index.cfm +37 -0
  120. data/tracks/cfml/exercises/largest-series-product/.meta/HINTS.md +0 -0
  121. data/tracks/cfml/exercises/largest-series-product/LargestSeriesProduct.cfc +13 -0
  122. data/tracks/cfml/exercises/largest-series-product/LargestSeriesProductTest.cfc +75 -0
  123. data/tracks/cfml/exercises/largest-series-product/Solution.cfc +41 -0
  124. data/tracks/cfml/exercises/largest-series-product/SolutionTest.cfc +7 -0
  125. data/tracks/cfml/exercises/largest-series-product/TestRunner.cfc +103 -0
  126. data/tracks/cfml/exercises/largest-series-product/box.json +8 -0
  127. data/tracks/cfml/exercises/largest-series-product/index.cfm +37 -0
  128. data/tracks/cfml/exercises/leap/Leap.cfc +15 -0
  129. data/tracks/cfml/exercises/leap/LeapTest.cfc +39 -0
  130. data/tracks/cfml/exercises/leap/README.md +33 -0
  131. data/tracks/cfml/exercises/leap/Solution.cfc +19 -0
  132. data/tracks/cfml/exercises/leap/SolutionTest.cfc +7 -0
  133. data/tracks/cfml/exercises/leap/TestRunner.cfc +103 -0
  134. data/tracks/cfml/exercises/leap/box.json +8 -0
  135. data/tracks/cfml/exercises/leap/index.cfm +37 -0
  136. data/tracks/cfml/exercises/luhn/.meta/HINTS.md +0 -0
  137. data/tracks/cfml/exercises/luhn/Luhn.cfc +13 -0
  138. data/tracks/cfml/exercises/luhn/LuhnTest.cfc +67 -0
  139. data/tracks/cfml/exercises/luhn/Solution.cfc +38 -0
  140. data/tracks/cfml/exercises/luhn/SolutionTest.cfc +7 -0
  141. data/tracks/cfml/exercises/luhn/TestRunner.cfc +103 -0
  142. data/tracks/cfml/exercises/luhn/box.json +8 -0
  143. data/tracks/cfml/exercises/luhn/index.cfm +37 -0
  144. data/tracks/cfml/exercises/nth-prime/.meta/HINTS.md +0 -0
  145. data/tracks/cfml/exercises/nth-prime/NthPrime.cfc +13 -0
  146. data/tracks/cfml/exercises/nth-prime/NthPrimeTest.cfc +35 -0
  147. data/tracks/cfml/exercises/nth-prime/Solution.cfc +33 -0
  148. data/tracks/cfml/exercises/nth-prime/SolutionTest.cfc +7 -0
  149. data/tracks/cfml/exercises/nth-prime/TestRunner.cfc +103 -0
  150. data/tracks/cfml/exercises/nth-prime/box.json +8 -0
  151. data/tracks/cfml/exercises/nth-prime/index.cfm +37 -0
  152. data/tracks/cfml/exercises/pangram/.meta/HINTS.md +0 -0
  153. data/tracks/cfml/exercises/pangram/Pangram.cfc +13 -0
  154. data/tracks/cfml/exercises/pangram/PangramTest.cfc +55 -0
  155. data/tracks/cfml/exercises/pangram/Solution.cfc +21 -0
  156. data/tracks/cfml/exercises/pangram/SolutionTest.cfc +7 -0
  157. data/tracks/cfml/exercises/pangram/TestRunner.cfc +103 -0
  158. data/tracks/cfml/exercises/pangram/box.json +8 -0
  159. data/tracks/cfml/exercises/pangram/index.cfm +37 -0
  160. data/tracks/cfml/exercises/pig-latin/.meta/HINTS.md +0 -0
  161. data/tracks/cfml/exercises/pig-latin/PigLatin.cfc +13 -0
  162. data/tracks/cfml/exercises/pig-latin/PigLatinTest.cfc +115 -0
  163. data/tracks/cfml/exercises/pig-latin/Solution.cfc +30 -0
  164. data/tracks/cfml/exercises/pig-latin/SolutionTest.cfc +7 -0
  165. data/tracks/cfml/exercises/pig-latin/TestRunner.cfc +103 -0
  166. data/tracks/cfml/exercises/pig-latin/box.json +8 -0
  167. data/tracks/cfml/exercises/pig-latin/index.cfm +37 -0
  168. data/tracks/cfml/exercises/raindrops/.meta/HINTS.md +0 -0
  169. data/tracks/cfml/exercises/raindrops/Raindrops.cfc +13 -0
  170. data/tracks/cfml/exercises/raindrops/RaindropsTest.cfc +87 -0
  171. data/tracks/cfml/exercises/raindrops/Solution.cfc +33 -0
  172. data/tracks/cfml/exercises/raindrops/SolutionTest.cfc +7 -0
  173. data/tracks/cfml/exercises/raindrops/TestRunner.cfc +103 -0
  174. data/tracks/cfml/exercises/raindrops/box.json +8 -0
  175. data/tracks/cfml/exercises/raindrops/index.cfm +37 -0
  176. data/tracks/cfml/exercises/rna-transcription/.meta/HINTS.md +0 -0
  177. data/tracks/cfml/exercises/rna-transcription/RnaTranscription.cfc +13 -0
  178. data/tracks/cfml/exercises/rna-transcription/RnaTranscriptionTest.cfc +47 -0
  179. data/tracks/cfml/exercises/rna-transcription/Solution.cfc +35 -0
  180. data/tracks/cfml/exercises/rna-transcription/SolutionTest.cfc +7 -0
  181. data/tracks/cfml/exercises/rna-transcription/TestRunner.cfc +103 -0
  182. data/tracks/cfml/exercises/rna-transcription/box.json +8 -0
  183. data/tracks/cfml/exercises/rna-transcription/index.cfm +37 -0
  184. data/tracks/cfml/exercises/saddle-points/.meta/HINTS.md +0 -0
  185. data/tracks/cfml/exercises/saddle-points/SaddlePoints.cfc +13 -0
  186. data/tracks/cfml/exercises/saddle-points/SaddlePointsTest.cfc +35 -0
  187. data/tracks/cfml/exercises/saddle-points/Solution.cfc +59 -0
  188. data/tracks/cfml/exercises/saddle-points/SolutionTest.cfc +7 -0
  189. data/tracks/cfml/exercises/saddle-points/TestRunner.cfc +103 -0
  190. data/tracks/cfml/exercises/saddle-points/box.json +8 -0
  191. data/tracks/cfml/exercises/saddle-points/index.cfm +37 -0
  192. data/tracks/cfml/exercises/scrabble-score/.meta/HINTS.md +0 -0
  193. data/tracks/cfml/exercises/scrabble-score/ScrabbleScore.cfc +13 -0
  194. data/tracks/cfml/exercises/scrabble-score/ScrabbleScoreTest.cfc +59 -0
  195. data/tracks/cfml/exercises/scrabble-score/Solution.cfc +50 -0
  196. data/tracks/cfml/exercises/scrabble-score/SolutionTest.cfc +7 -0
  197. data/tracks/cfml/exercises/scrabble-score/TestRunner.cfc +103 -0
  198. data/tracks/cfml/exercises/scrabble-score/box.json +8 -0
  199. data/tracks/cfml/exercises/scrabble-score/index.cfm +37 -0
  200. data/tracks/cfml/exercises/secret-handshake/.meta/HINTS.md +0 -0
  201. data/tracks/cfml/exercises/secret-handshake/SecretHandshake.cfc +13 -0
  202. data/tracks/cfml/exercises/secret-handshake/SecretHandshakeTest.cfc +63 -0
  203. data/tracks/cfml/exercises/secret-handshake/Solution.cfc +31 -0
  204. data/tracks/cfml/exercises/secret-handshake/SolutionTest.cfc +7 -0
  205. data/tracks/cfml/exercises/secret-handshake/TestRunner.cfc +103 -0
  206. data/tracks/cfml/exercises/secret-handshake/box.json +8 -0
  207. data/tracks/cfml/exercises/secret-handshake/index.cfm +37 -0
  208. data/tracks/cfml/exercises/space-age/.meta/HINTS.md +0 -0
  209. data/tracks/cfml/exercises/space-age/Solution.cfc +28 -0
  210. data/tracks/cfml/exercises/space-age/SolutionTest.cfc +7 -0
  211. data/tracks/cfml/exercises/space-age/SpaceAge.cfc +13 -0
  212. data/tracks/cfml/exercises/space-age/SpaceAgeTest.cfc +47 -0
  213. data/tracks/cfml/exercises/space-age/TestRunner.cfc +103 -0
  214. data/tracks/cfml/exercises/space-age/box.json +8 -0
  215. data/tracks/cfml/exercises/space-age/index.cfm +37 -0
  216. data/tracks/cfml/exercises/sum-of-multiples/.meta/HINTS.md +0 -0
  217. data/tracks/cfml/exercises/sum-of-multiples/Solution.cfc +27 -0
  218. data/tracks/cfml/exercises/sum-of-multiples/SolutionTest.cfc +7 -0
  219. data/tracks/cfml/exercises/sum-of-multiples/SumOfMultiples.cfc +13 -0
  220. data/tracks/cfml/exercises/sum-of-multiples/SumOfMultiplesTest.cfc +63 -0
  221. data/tracks/cfml/exercises/sum-of-multiples/TestRunner.cfc +103 -0
  222. data/tracks/cfml/exercises/sum-of-multiples/box.json +8 -0
  223. data/tracks/cfml/exercises/sum-of-multiples/index.cfm +37 -0
  224. data/tracks/cfml/exercises/triangle/.meta/HINTS.md +0 -0
  225. data/tracks/cfml/exercises/triangle/Solution.cfc +53 -0
  226. data/tracks/cfml/exercises/triangle/SolutionTest.cfc +7 -0
  227. data/tracks/cfml/exercises/triangle/TestRunner.cfc +103 -0
  228. data/tracks/cfml/exercises/triangle/Triangle.cfc +18 -0
  229. data/tracks/cfml/exercises/triangle/TriangleTest.cfc +95 -0
  230. data/tracks/cfml/exercises/triangle/box.json +8 -0
  231. data/tracks/cfml/exercises/triangle/index.cfm +37 -0
  232. data/tracks/cfml/exercises/word-count/.meta/HINTS.md +0 -0
  233. data/tracks/cfml/exercises/word-count/Solution.cfc +22 -0
  234. data/tracks/cfml/exercises/word-count/SolutionTest.cfc +7 -0
  235. data/tracks/cfml/exercises/word-count/TestRunner.cfc +103 -0
  236. data/tracks/cfml/exercises/word-count/WordCount.cfc +13 -0
  237. data/tracks/cfml/exercises/word-count/WordCountTest.cfc +55 -0
  238. data/tracks/cfml/exercises/word-count/box.json +8 -0
  239. data/tracks/cfml/exercises/word-count/index.cfm +37 -0
  240. data/tracks/cfml/img/icon.png +0 -0
  241. data/tracks/cfml/tasks/GenerateTests.cfc +179 -0
  242. data/tracks/cfml/tasks/ScaffoldExercise.cfc +85 -0
  243. data/tracks/cfml/tasks/TestAllSolutions.cfc +24 -0
  244. data/tracks/cfml/tasks/exercise_template/.meta/HINTS.md +0 -0
  245. data/tracks/cfml/tasks/exercise_template/@@name@@.cfc +13 -0
  246. data/tracks/cfml/tasks/exercise_template/@@name@@Test.cfc +15 -0
  247. data/tracks/cfml/tasks/exercise_template/Solution.cfc +6 -0
  248. data/tracks/cfml/tasks/exercise_template/SolutionTest.cfc +7 -0
  249. data/tracks/cfml/tasks/exercise_template/TestRunner.cfc +103 -0
  250. data/tracks/cfml/tasks/exercise_template/box.json +8 -0
  251. data/tracks/cfml/tasks/exercise_template/index.cfm +37 -0
  252. data/tracks/coldfusion/docs/ABOUT.md +8 -6
  253. data/tracks/csharp/docs/GENERATORS.md +7 -0
  254. data/tracks/csharp/exercises/clock/ClockTest.cs +15 -15
  255. data/tracks/csharp/exercises/nucleotide-count/Example.cs +10 -11
  256. data/tracks/csharp/exercises/nucleotide-count/NucleotideCount.cs +2 -7
  257. data/tracks/csharp/exercises/nucleotide-count/NucleotideCountTest.cs +37 -47
  258. data/tracks/csharp/exercises/pig-latin/Example.cs +1 -1
  259. data/tracks/csharp/exercises/pig-latin/PigLatinTest.cs +19 -7
  260. data/tracks/csharp/exercises/sum-of-multiples/SumOfMultiplesTest.cs +7 -1
  261. data/tracks/csharp/exercises/tournament/Example.cs +1 -1
  262. data/tracks/csharp/exercises/tournament/TournamentTest.cs +151 -68
  263. data/tracks/csharp/exercises/triangle/Example.cs +26 -8
  264. data/tracks/csharp/exercises/triangle/Triangle.cs +16 -1
  265. data/tracks/csharp/exercises/triangle/TriangleTest.cs +44 -30
  266. data/tracks/csharp/generators/Exercise.cs +6 -1
  267. data/tracks/csharp/generators/Exercises/Clock.cs +17 -1
  268. data/tracks/csharp/generators/Exercises/NucleotideCount.cs +61 -0
  269. data/tracks/csharp/generators/Exercises/Tournament.cs +66 -0
  270. data/tracks/csharp/generators/Exercises/Triangle.cs +36 -0
  271. data/tracks/dart/config.json +15 -2
  272. data/tracks/dart/exercises/raindrops/lib/example.dart +23 -0
  273. data/tracks/dart/exercises/raindrops/lib/raindrops.dart +3 -0
  274. data/tracks/dart/exercises/raindrops/pubspec.lock +281 -0
  275. data/tracks/dart/exercises/raindrops/pubspec.yaml +3 -0
  276. data/tracks/dart/exercises/raindrops/test/raindrops_test.dart +94 -0
  277. data/tracks/delphi/exercises/pig-latin/uPigLatinExample.pas +1 -25
  278. data/tracks/haskell/config.json +9 -0
  279. data/tracks/haskell/exercises/acronym/README.md +0 -1
  280. data/tracks/haskell/exercises/all-your-base/README.md +1 -1
  281. data/tracks/haskell/exercises/allergies/README.md +0 -1
  282. data/tracks/haskell/exercises/alphametics/README.md +2 -2
  283. data/tracks/haskell/exercises/atbash-cipher/README.md +2 -1
  284. data/tracks/haskell/exercises/beer-song/README.md +1 -1
  285. data/tracks/haskell/exercises/binary/README.md +2 -0
  286. data/tracks/haskell/exercises/bowling/README.md +20 -6
  287. data/tracks/haskell/exercises/collatz-conjecture/README.md +1 -1
  288. data/tracks/haskell/exercises/connect/README.md +1 -1
  289. data/tracks/haskell/exercises/crypto-square/README.md +4 -4
  290. data/tracks/haskell/exercises/diamond/README.md +113 -0
  291. data/tracks/haskell/exercises/diamond/examples/success-standard/package.yaml +16 -0
  292. data/tracks/haskell/exercises/diamond/examples/success-standard/src/Diamond.hs +16 -0
  293. data/tracks/haskell/exercises/diamond/package.yaml +20 -0
  294. data/tracks/haskell/exercises/diamond/src/Diamond.hs +4 -0
  295. data/tracks/haskell/exercises/diamond/stack.yaml +1 -0
  296. data/tracks/haskell/exercises/diamond/test/Tests.hs +109 -0
  297. data/tracks/haskell/exercises/etl/README.md +3 -1
  298. data/tracks/haskell/exercises/food-chain/README.md +1 -1
  299. data/tracks/haskell/exercises/go-counting/README.md +1 -1
  300. data/tracks/haskell/exercises/grade-school/README.md +0 -1
  301. data/tracks/haskell/exercises/grains/README.md +0 -1
  302. data/tracks/haskell/exercises/house/README.md +1 -2
  303. data/tracks/haskell/exercises/isogram/README.md +2 -1
  304. data/tracks/haskell/exercises/kindergarten-garden/README.md +3 -3
  305. data/tracks/haskell/exercises/leap/README.md +1 -1
  306. data/tracks/haskell/exercises/linked-list/README.md +10 -10
  307. data/tracks/haskell/exercises/luhn/README.md +7 -7
  308. data/tracks/haskell/exercises/matrix/README.md +6 -4
  309. data/tracks/haskell/exercises/meetup/README.md +1 -2
  310. data/tracks/haskell/exercises/nucleotide-count/README.md +8 -22
  311. data/tracks/haskell/exercises/ocr-numbers/README.md +6 -6
  312. data/tracks/haskell/exercises/octal/README.md +6 -2
  313. data/tracks/haskell/exercises/palindrome-products/README.md +12 -6
  314. data/tracks/haskell/exercises/pangram/README.md +1 -1
  315. data/tracks/haskell/exercises/pascals-triangle/README.md +2 -2
  316. data/tracks/haskell/exercises/phone-number/README.md +3 -2
  317. data/tracks/haskell/exercises/pov/README.md +3 -3
  318. data/tracks/haskell/exercises/pythagorean-triplet/README.md +3 -3
  319. data/tracks/haskell/exercises/queen-attack/README.md +1 -1
  320. data/tracks/haskell/exercises/rna-transcription/README.md +1 -1
  321. data/tracks/haskell/exercises/roman-numerals/README.md +1 -1
  322. data/tracks/haskell/exercises/run-length-encoding/README.md +4 -4
  323. data/tracks/haskell/exercises/saddle-points/README.md +1 -1
  324. data/tracks/haskell/exercises/scrabble-score/README.md +3 -1
  325. data/tracks/haskell/exercises/secret-handshake/README.md +1 -1
  326. data/tracks/haskell/exercises/sgf-parsing/README.md +4 -4
  327. data/tracks/haskell/exercises/simple-cipher/README.md +1 -1
  328. data/tracks/haskell/exercises/spiral-matrix/README.md +2 -2
  329. data/tracks/haskell/exercises/triangle/README.md +9 -6
  330. data/tracks/haskell/exercises/trinary/README.md +1 -1
  331. data/tracks/haskell/exercises/word-count/README.md +1 -2
  332. data/tracks/haskell/exercises/wordy/README.md +0 -5
  333. data/tracks/java/config.json +56 -9
  334. data/tracks/java/exercises/binary-search-tree/src/test/java/BSTTest.java +4 -4
  335. data/tracks/javascript/exercises/two-bucket/example.js +66 -69
  336. data/tracks/javascript/exercises/two-bucket/two-bucket.spec.js +18 -18
  337. data/tracks/julia/config.json +1 -0
  338. data/tracks/julia/docs/ABOUT.md +3 -8
  339. data/tracks/prolog/README.md +1 -1
  340. data/tracks/purescript/.travis.yml +1 -0
  341. data/tracks/purescript/README.md +9 -0
  342. data/tracks/purescript/bin/check-bower.sh +42 -0
  343. data/tracks/purescript/bin/test-separate.sh +46 -0
  344. data/tracks/python/README.md +2 -2
  345. data/tracks/python/exercises/all-your-base/all_your_base.py +2 -0
  346. data/tracks/python/exercises/atbash-cipher/atbash_cipher.py +2 -2
  347. data/tracks/python/exercises/complex-numbers/complex_numbers_test.py +2 -2
  348. data/tracks/python/exercises/complex-numbers/example.py +2 -2
  349. data/tracks/python/exercises/gigasecond/gigasecond.py +1 -1
  350. data/tracks/python/exercises/hamming/hamming.py +1 -1
  351. data/tracks/python/exercises/hexadecimal/hexadecimal.py +1 -1
  352. data/tracks/python/exercises/leap/leap.py +1 -1
  353. data/tracks/python/exercises/meetup/meetup.py +1 -1
  354. data/tracks/python/exercises/phone-number/example.py +4 -2
  355. data/tracks/python/exercises/phone-number/phone_number_test.py +47 -16
  356. data/tracks/python/exercises/pig-latin/pig_latin.py +1 -1
  357. data/tracks/python/exercises/scrabble-score/scrabble_score.py +1 -1
  358. data/tracks/python/exercises/wordy/wordy.py +1 -1
  359. data/tracks/scala/exercises/meetup/example.scala +29 -10
  360. data/tracks/scala/exercises/meetup/src/main/scala/Meetup.scala +23 -0
  361. data/tracks/scala/exercises/meetup/src/test/scala/MeetupTest.scala +273 -183
  362. data/tracks/sml/config.json +13 -0
  363. data/tracks/sml/exercises/anagram/README.md +21 -5
  364. data/tracks/sml/exercises/anagram/anagram.sml +2 -6
  365. data/tracks/sml/exercises/anagram/example.sml +29 -24
  366. data/tracks/sml/exercises/anagram/test.sml +56 -50
  367. data/tracks/sml/exercises/anagram/testlib.sml +159 -0
  368. data/tracks/sml/exercises/diamond/README.md +89 -0
  369. data/tracks/sml/exercises/diamond/diamond.sml +2 -0
  370. data/tracks/sml/exercises/diamond/example.sml +25 -0
  371. data/tracks/sml/exercises/diamond/test.sml +27 -0
  372. data/tracks/sml/exercises/diamond/testlib.sml +159 -0
  373. data/tracks/sml/exercises/raindrops/raindrops.sml +2 -2
  374. data/tracks/sml/exercises/raindrops/test.sml +66 -95
  375. data/tracks/sml/exercises/raindrops/testlib.sml +159 -0
  376. metadata +265 -3
@@ -1,94 +1,108 @@
1
+ // This file was auto-generated based on version 1.0.0 of the canonical data.
2
+
1
3
  using Xunit;
2
4
 
3
5
  public class TriangleTest
4
6
  {
5
7
  [Fact]
6
- public void Equilateral_triangles_have_equal_sides()
8
+ public void Returns_true_if_the_triangle_is_equilateral_true_if_all_sides_are_equal()
9
+ {
10
+ Assert.True(Triangle.IsEquilateral(2,2,2));
11
+ }
12
+
13
+ [Fact(Skip = "Remove to run test")]
14
+ public void Returns_true_if_the_triangle_is_equilateral_false_if_any_side_is_unequal()
15
+ {
16
+ Assert.False(Triangle.IsEquilateral(2,3,2));
17
+ }
18
+
19
+ [Fact(Skip = "Remove to run test")]
20
+ public void Returns_true_if_the_triangle_is_equilateral_false_if_no_sides_are_equal()
7
21
  {
8
- Assert.Equal(TriangleKind.Equilateral, Triangle.Kind(2, 2, 2));
22
+ Assert.False(Triangle.IsEquilateral(5,4,6));
9
23
  }
10
24
 
11
25
  [Fact(Skip = "Remove to run test")]
12
- public void Larger_equilateral_triangles_also_have_equal_sides()
26
+ public void Returns_true_if_the_triangle_is_equilateral_all_zero_sides_are_illegal_so_the_triangle_is_not_equilateral()
13
27
  {
14
- Assert.Equal(TriangleKind.Equilateral, Triangle.Kind(10, 10, 10));
28
+ Assert.False(Triangle.IsEquilateral(0,0,0));
15
29
  }
16
30
 
17
31
  [Fact(Skip = "Remove to run test")]
18
- public void Isosceles_triangles_have_last_two_sides_equal()
32
+ public void Returns_true_if_the_triangle_is_equilateral_sides_may_be_floats()
19
33
  {
20
- Assert.Equal(TriangleKind.Isosceles, Triangle.Kind(3, 4, 4));
34
+ Assert.True(Triangle.IsEquilateral(0.5,0.5,0.5));
21
35
  }
22
36
 
23
37
  [Fact(Skip = "Remove to run test")]
24
- public void Isosceles_triangles_have_first_and_last_sides_equal()
38
+ public void Returns_true_if_the_triangle_is_isosceles_true_if_last_two_sides_are_equal()
25
39
  {
26
- Assert.Equal(TriangleKind.Isosceles, Triangle.Kind(4, 3, 4));
40
+ Assert.True(Triangle.IsIsosceles(3,4,4));
27
41
  }
28
42
 
29
43
  [Fact(Skip = "Remove to run test")]
30
- public void Isosceles_triangles_have_two_first_sides_equal()
44
+ public void Returns_true_if_the_triangle_is_isosceles_true_if_first_two_sides_are_equal()
31
45
  {
32
- Assert.Equal(TriangleKind.Isosceles, Triangle.Kind(4, 4, 3));
46
+ Assert.True(Triangle.IsIsosceles(4,4,3));
33
47
  }
34
48
 
35
49
  [Fact(Skip = "Remove to run test")]
36
- public void Isosceles_triangles_have_in_fact_exactly_two_sides_equal()
50
+ public void Returns_true_if_the_triangle_is_isosceles_true_if_first_and_last_sides_are_equal()
37
51
  {
38
- Assert.Equal(TriangleKind.Isosceles, Triangle.Kind(10, 10, 2));
52
+ Assert.True(Triangle.IsIsosceles(4,3,4));
39
53
  }
40
54
 
41
55
  [Fact(Skip = "Remove to run test")]
42
- public void Scalene_triangles_have_no_equal_sides()
56
+ public void Returns_true_if_the_triangle_is_isosceles_equilateral_triangles_are_also_isosceles()
43
57
  {
44
- Assert.Equal(TriangleKind.Scalene, Triangle.Kind(3, 4, 5));
58
+ Assert.True(Triangle.IsIsosceles(4,4,4));
45
59
  }
46
60
 
47
61
  [Fact(Skip = "Remove to run test")]
48
- public void Scalene_triangles_have_no_equal_sides_at_a_larger_scale_too()
62
+ public void Returns_true_if_the_triangle_is_isosceles_false_if_no_sides_are_equal()
49
63
  {
50
- Assert.Equal(TriangleKind.Scalene, Triangle.Kind(10, 11, 12));
64
+ Assert.False(Triangle.IsIsosceles(2,3,4));
51
65
  }
52
66
 
53
67
  [Fact(Skip = "Remove to run test")]
54
- public void Scalene_triangles_have_no_equal_sides_in_descending_order_either()
68
+ public void Returns_true_if_the_triangle_is_isosceles_sides_that_violate_triangle_inequality_are_not_isosceles_even_if_two_are_equal()
55
69
  {
56
- Assert.Equal(TriangleKind.Scalene, Triangle.Kind(5, 4, 2));
70
+ Assert.False(Triangle.IsIsosceles(1,1,3));
57
71
  }
58
72
 
59
73
  [Fact(Skip = "Remove to run test")]
60
- public void Very_small_triangles_are_legal()
74
+ public void Returns_true_if_the_triangle_is_isosceles_sides_may_be_floats()
61
75
  {
62
- Assert.Equal(TriangleKind.Scalene, Triangle.Kind(0.4m, 0.6m, 0.3m));
76
+ Assert.True(Triangle.IsIsosceles(0.5,0.4,0.5));
63
77
  }
64
78
 
65
79
  [Fact(Skip = "Remove to run test")]
66
- public void Triangles_with_no_size_are_illegal()
80
+ public void Returns_true_if_the_triangle_is_scalene_true_if_no_sides_are_equal()
67
81
  {
68
- Assert.Throws<TriangleException>(() => Triangle.Kind(0, 0, 0));
82
+ Assert.True(Triangle.IsScalene(5,4,6));
69
83
  }
70
84
 
71
85
  [Fact(Skip = "Remove to run test")]
72
- public void Triangles_with_negative_sides_are_illegal()
86
+ public void Returns_true_if_the_triangle_is_scalene_false_if_all_sides_are_equal()
73
87
  {
74
- Assert.Throws<TriangleException>(() => Triangle.Kind(3, 4, -5));
88
+ Assert.False(Triangle.IsScalene(4,4,4));
75
89
  }
76
90
 
77
91
  [Fact(Skip = "Remove to run test")]
78
- public void Triangles_violating_triangle_inequality_are_illegal()
92
+ public void Returns_true_if_the_triangle_is_scalene_false_if_two_sides_are_equal()
79
93
  {
80
- Assert.Throws<TriangleException>(() => Triangle.Kind(1, 1, 3));
94
+ Assert.False(Triangle.IsScalene(4,4,3));
81
95
  }
82
96
 
83
97
  [Fact(Skip = "Remove to run test")]
84
- public void Triangles_violating_triangle_inequality_are_illegal_2()
98
+ public void Returns_true_if_the_triangle_is_scalene_sides_that_violate_triangle_inequality_are_not_scalene_even_if_they_are_all_different()
85
99
  {
86
- Assert.Throws<TriangleException>(() => Triangle.Kind(2, 4, 2));
100
+ Assert.False(Triangle.IsScalene(7,3,2));
87
101
  }
88
102
 
89
103
  [Fact(Skip = "Remove to run test")]
90
- public void Triangles_violating_triangle_inequality_are_illegal_3()
104
+ public void Returns_true_if_the_triangle_is_scalene_sides_may_be_floats()
91
105
  {
92
- Assert.Throws<TriangleException>(() => Triangle.Kind(7, 3, 2));
106
+ Assert.True(Triangle.IsScalene(0.5,0.4,0.6));
93
107
  }
94
108
  }
@@ -40,6 +40,11 @@ namespace Generators
40
40
  protected virtual string RenderTestMethodBodyAssert(TestMethodBody testMethodBody)
41
41
  => TemplateRenderer.RenderPartial(testMethodBody.AssertTemplateName, testMethodBody.AssertTemplateParameters);
42
42
 
43
+ protected virtual string[] RenderAdditionalMethods()
44
+ {
45
+ return new string[] { };
46
+ }
47
+
43
48
  private HashSet<string> GetUsingNamespaces()
44
49
  {
45
50
  var usingNamespaces = new HashSet<string> { "Xunit" };
@@ -52,7 +57,7 @@ namespace Generators
52
57
  return usingNamespaces;
53
58
  }
54
59
 
55
- private string[] RenderTestMethods() => _canonicalData.Cases.Select(RenderTestMethod).ToArray();
60
+ private string[] RenderTestMethods() => _canonicalData.Cases.Select(RenderTestMethod).Concat(RenderAdditionalMethods()).ToArray();
56
61
 
57
62
  private TestClass CreateTestClass() => new TestClass
58
63
  {
@@ -15,6 +15,7 @@ namespace Generators.Exercises
15
15
  private const string PropertyEqual = "equal";
16
16
  private const string PropertyEquals = "equals";
17
17
  private const string PropertyToString = "to_string";
18
+ private const string PropertyEqualityExpectance = "expected";
18
19
 
19
20
  protected override void UpdateCanonicalData(CanonicalData canonicalData)
20
21
  {
@@ -47,7 +48,7 @@ namespace Generators.Exercises
47
48
  {
48
49
  if (testMethodBody.CanonicalDataCase.Property == PropertyEquals)
49
50
  {
50
- return base.RenderTestMethodBodyAssert(testMethodBody);
51
+ return RenderEqualToAssert(testMethodBody);
51
52
  }
52
53
  else if (testMethodBody.CanonicalDataCase.Property != PropertyToString)
53
54
  {
@@ -65,5 +66,20 @@ namespace Generators.Exercises
65
66
 
66
67
  return TemplateRenderer.RenderInline(template, testMethodBody.AssertTemplateParameters);
67
68
  }
69
+
70
+ private static string RenderEqualToAssert(TestMethodBody testMethodBody)
71
+ {
72
+ var ExpectedParameter = testMethodBody.CanonicalDataCase.Input[ParamClock2];
73
+ var TestedValue = "sut";
74
+ var expectedEqual = testMethodBody.CanonicalDataCase.Properties[PropertyEqualityExpectance];
75
+
76
+ testMethodBody.AssertTemplateParameters = new { ExpectedParameter, TestedValue};
77
+
78
+ var template = expectedEqual
79
+ ? $"Assert.Equal({{{{ ExpectedParameter }}}}, {{{{ TestedValue }}}}); "
80
+ : $"Assert.NotEqual({{{{ ExpectedParameter }}}}, {{{{ TestedValue }}}});";
81
+
82
+ return TemplateRenderer.RenderInline(template, testMethodBody.AssertTemplateParameters);
83
+ }
68
84
  }
69
85
  }
@@ -0,0 +1,61 @@
1
+ using Generators.Input;
2
+ using Generators.Output;
3
+ using System.Collections.Generic;
4
+ using System.Linq;
5
+
6
+ namespace Generators.Exercises
7
+ {
8
+ public class NucleotideCount : Exercise
9
+ {
10
+ protected override void UpdateCanonicalData(CanonicalData canonicalData)
11
+ {
12
+ foreach (var canonicalDataCase in canonicalData.Cases)
13
+ {
14
+ if (!((Dictionary<string, object>)canonicalDataCase.Expected).ContainsKey("error"))
15
+ {
16
+ canonicalDataCase.UseVariableForExpected = true;
17
+ canonicalDataCase.SetConstructorInputParameters("strand");
18
+ canonicalDataCase.Expected = ConvertExpected(canonicalDataCase.Expected);
19
+ }
20
+ }
21
+ }
22
+
23
+ private static dynamic ConvertExpected(dynamic expected)
24
+ => ((Dictionary<string, object>)expected).ToDictionary(kv => kv.Key[0], kv => int.Parse($"{kv.Value}"));
25
+
26
+ protected override HashSet<string> AddAdditionalNamespaces() => new HashSet<string>() { typeof(Dictionary<char, int>).Namespace };
27
+
28
+ protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBody)
29
+ {
30
+ if (testMethodBody.UseVariableForExpected)
31
+ {
32
+ return RenderEqualBodyAssert(testMethodBody);
33
+ }
34
+ return RenderThrowsBodyAssert(testMethodBody);
35
+ }
36
+
37
+ private string RenderEqualBodyAssert(TestMethodBody testMethodBody)
38
+ {
39
+ const string template = @"Assert.Equal(expected, sut.{{ TestedMethodName }});";
40
+
41
+ var templateParameters = new
42
+ {
43
+ TestedMethodName = testMethodBody.CanonicalDataCase.Property.ToTestedMethodName()
44
+ };
45
+
46
+ return TemplateRenderer.RenderInline(template, templateParameters);
47
+ }
48
+
49
+ private string RenderThrowsBodyAssert(TestMethodBody testMethodBody)
50
+ {
51
+ const string template = @"Assert.Throws<InvalidNucleotideException>(() => new NucleotideCount(""{{ Input }}""));";
52
+
53
+ var templateParameters = new
54
+ {
55
+ Input = testMethodBody.CanonicalDataCase.Input["strand"]
56
+ };
57
+
58
+ return TemplateRenderer.RenderInline(template, templateParameters);
59
+ }
60
+ }
61
+ }
@@ -0,0 +1,66 @@
1
+ using System.Collections.Generic;
2
+ using Generators.Input;
3
+ using Generators.Output;
4
+
5
+ namespace Generators.Exercises
6
+ {
7
+ public class Tournament : Exercise
8
+ {
9
+ protected override void UpdateCanonicalData(CanonicalData canonicalData)
10
+ {
11
+ foreach (var canonicalDataCase in canonicalData.Cases)
12
+ {
13
+ canonicalDataCase.TestedMethodType = TestedMethodType.Static;
14
+ canonicalDataCase.UseVariablesForInput = true;
15
+ canonicalDataCase.UseVariableForExpected = true;
16
+ canonicalDataCase.Properties["input"] = ToMultiLineString(canonicalDataCase.Properties["input"]);
17
+ canonicalDataCase.Expected = ToMultiLineString(canonicalDataCase.Expected);
18
+ }
19
+ }
20
+
21
+ protected override HashSet<string> AddAdditionalNamespaces()
22
+ {
23
+ return new HashSet<string>
24
+ {
25
+ typeof(System.String).Namespace,
26
+ typeof(System.IO.Stream).Namespace,
27
+ typeof(System.Text.UTF8Encoding).Namespace
28
+ };
29
+ }
30
+
31
+ protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBody)
32
+ {
33
+ string template = @"Assert.Equal(expected, RunTally(input).Trim());";
34
+ return TemplateRenderer.RenderInline(template, new { });
35
+ }
36
+
37
+ private UnescapedValue ToMultiLineString(string[] input)
38
+ {
39
+ const string template = @"{% if input.size == 0 %}string.Empty{% else %}{% for item in {{input}} %}{% if forloop.length == 1 %}""{{item}}""{% break %}{% endif %}""{{item}}""{% if forloop.last == false %} + Environment.NewLine +{% endif %}
40
+ {% endfor %}.Trim(){% endif %}";
41
+
42
+ return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input }));
43
+ }
44
+
45
+ protected override string[] RenderAdditionalMethods()
46
+ {
47
+ var methods = @"
48
+ private string RunTally(string input)
49
+ {
50
+ var encoding = new UTF8Encoding();
51
+
52
+ using (var inStream = new MemoryStream(encoding.GetBytes(input)))
53
+ {
54
+ using (var outStream = new MemoryStream())
55
+ {
56
+ Tournament.Tally(inStream, outStream);
57
+ return encoding.GetString(outStream.ToArray());
58
+ }
59
+ }
60
+ }";
61
+ return methods.Split("", System.StringSplitOptions.None);
62
+ }
63
+
64
+
65
+ }
66
+ }
@@ -0,0 +1,36 @@
1
+ using System.Collections;
2
+ using System.Collections.Generic;
3
+ using Generators.Input;
4
+ using Generators.Output;
5
+ namespace Generators.Exercises
6
+ {
7
+ public class Triangle : Exercise
8
+ {
9
+ protected override void UpdateCanonicalData(CanonicalData canonicalData)
10
+ {
11
+ foreach (var data in canonicalData.Cases)
12
+ {
13
+ if (data.Property == "equilateral")
14
+ data.Property = "IsEquilateral";
15
+ else if (data.Property == "isosceles")
16
+ data.Property = "IsIsosceles";
17
+ else if (data.Property == "scalene")
18
+ data.Property = "IsScalene";
19
+
20
+ data.Properties["sides"] = SplitArrayToValues(data.Properties["sides"]);
21
+ data.SetInputParameters("sides");
22
+ data.UseFullDescriptionPath = true;
23
+
24
+ }
25
+ }
26
+
27
+ private UnescapedValue SplitArrayToValues(IEnumerable input)
28
+ {
29
+ const string template = "{% for item in {{input}} %}{{item}}{% if forloop.last == false %},{% endif %}{% endfor %}";
30
+
31
+ return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input }));
32
+ }
33
+
34
+
35
+ }
36
+ }
@@ -76,6 +76,19 @@
76
76
  "unlocked_by": "hamming",
77
77
  "uuid": "0c0511fd-59aa-4480-a7cd-4de0e9303b86"
78
78
  },
79
+ {
80
+ "core": true,
81
+ "difficulty": 2,
82
+ "slug": "raindrops",
83
+ "topics": [
84
+ "control_flow_conditionals",
85
+ "equality",
86
+ "mathematics",
87
+ "strings"
88
+ ],
89
+ "unlocked_by": "gigasecond",
90
+ "uuid": "d6657d4a-0257-0c80-6667-fddd127a571f0ad1fd4"
91
+ },
79
92
  {
80
93
  "core": true,
81
94
  "difficulty": 3,
@@ -84,7 +97,7 @@
84
97
  "strings",
85
98
  "transforming"
86
99
  ],
87
- "unlocked_by": "gigasecond",
100
+ "unlocked_by": "raindrops",
88
101
  "uuid": "99147c39-e8d3-4166-9215-c47fb4832781"
89
102
  },
90
103
  {
@@ -97,7 +110,7 @@
97
110
  "equality",
98
111
  "strings"
99
112
  ],
100
- "unlocked_by": null,
113
+ "unlocked_by": "rna-transcription",
101
114
  "uuid": "6e811b53-4eb1-40f9-a811-b5113d68ae8a"
102
115
  }
103
116
  ],
@@ -0,0 +1,23 @@
1
+ class Raindrops {
2
+ String convert(int i) {
3
+ bool isDiv(int divisor) {
4
+ return i % divisor == 0;
5
+ }
6
+
7
+ String out = "";
8
+ if (isDiv(3)) {
9
+ out += "Pling";
10
+ }
11
+ if (isDiv(5)) {
12
+ out += "Plang";
13
+ }
14
+ if (isDiv(7)) {
15
+ out += "Plong";
16
+ }
17
+
18
+ if (out == "") {
19
+ out = i.toString();
20
+ }
21
+ return out;
22
+ }
23
+ }
@@ -0,0 +1,3 @@
1
+ class Raindrops {
2
+ // Enter your code here
3
+ }