trackler 2.2.1.103 → 2.2.1.104

Sign up to get free protection for your applications and to get access to all the features.
Files changed (432) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/all-your-base/canonical-data.json +43 -43
  4. data/tracks/bash/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  5. data/tracks/cfml/tasks/exercise_template/.meta/hints.md +1 -0
  6. data/tracks/csharp/config/exercise_readme.go.tmpl +4 -4
  7. data/tracks/csharp/exercises/accumulate/README.md +1 -5
  8. data/tracks/csharp/exercises/acronym/README.md +1 -3
  9. data/tracks/csharp/exercises/all-your-base/README.md +2 -4
  10. data/tracks/csharp/exercises/allergies/README.md +1 -3
  11. data/tracks/csharp/exercises/alphametics/README.md +3 -5
  12. data/tracks/csharp/exercises/anagram/README.md +1 -2
  13. data/tracks/csharp/exercises/armstrong-numbers/README.md +14 -1
  14. data/tracks/csharp/exercises/atbash-cipher/README.md +3 -3
  15. data/tracks/csharp/exercises/bank-account/README.md +1 -3
  16. data/tracks/csharp/exercises/beer-song/README.md +3 -4
  17. data/tracks/csharp/exercises/binary-search-tree/README.md +1 -2
  18. data/tracks/csharp/exercises/binary-search/README.md +1 -2
  19. data/tracks/csharp/exercises/binary/README.md +3 -2
  20. data/tracks/csharp/exercises/bob/README.md +3 -3
  21. data/tracks/csharp/exercises/book-store/README.md +6 -7
  22. data/tracks/csharp/exercises/bowling/README.md +21 -8
  23. data/tracks/csharp/exercises/bracket-push/README.md +1 -2
  24. data/tracks/csharp/exercises/change/README.md +2 -3
  25. data/tracks/csharp/exercises/circular-buffer/README.md +14 -8
  26. data/tracks/csharp/exercises/clock/README.md +1 -2
  27. data/tracks/csharp/exercises/collatz-conjecture/README.md +4 -4
  28. data/tracks/csharp/exercises/complex-numbers/README.md +1 -2
  29. data/tracks/csharp/exercises/connect/README.md +2 -4
  30. data/tracks/csharp/exercises/crypto-square/README.md +11 -10
  31. data/tracks/csharp/exercises/custom-set/README.md +1 -3
  32. data/tracks/csharp/exercises/diamond/README.md +10 -9
  33. data/tracks/csharp/exercises/difference-of-squares/README.md +1 -2
  34. data/tracks/csharp/exercises/diffie-hellman/README.md +1 -2
  35. data/tracks/csharp/exercises/dominoes/README.md +10 -3
  36. data/tracks/csharp/exercises/dot-dsl/README.md +2 -4
  37. data/tracks/csharp/exercises/error-handling/README.md +1 -3
  38. data/tracks/csharp/exercises/etl/README.md +4 -3
  39. data/tracks/csharp/exercises/flatten-array/README.md +2 -4
  40. data/tracks/csharp/exercises/food-chain/README.md +2 -3
  41. data/tracks/csharp/exercises/forth/README.md +1 -3
  42. data/tracks/csharp/exercises/gigasecond/README.md +1 -2
  43. data/tracks/csharp/exercises/go-counting/README.md +2 -4
  44. data/tracks/csharp/exercises/grade-school/README.md +1 -3
  45. data/tracks/csharp/exercises/grains/README.md +1 -3
  46. data/tracks/csharp/exercises/grep/README.md +13 -14
  47. data/tracks/csharp/exercises/hamming/README.md +1 -2
  48. data/tracks/csharp/exercises/hangman/README.md +1 -3
  49. data/tracks/csharp/exercises/hello-world/README.md +1 -2
  50. data/tracks/csharp/exercises/hexadecimal/README.md +1 -2
  51. data/tracks/csharp/exercises/house/README.md +3 -5
  52. data/tracks/csharp/exercises/isbn-verifier/README.md +34 -22
  53. data/tracks/csharp/exercises/isogram/README.md +3 -3
  54. data/tracks/csharp/exercises/kindergarten-garden/README.md +14 -15
  55. data/tracks/csharp/exercises/largest-series-product/README.md +1 -2
  56. data/tracks/csharp/exercises/leap/README.md +2 -3
  57. data/tracks/csharp/exercises/ledger/README.md +1 -3
  58. data/tracks/csharp/exercises/linked-list/README.md +11 -12
  59. data/tracks/csharp/exercises/list-ops/README.md +1 -3
  60. data/tracks/csharp/exercises/luhn/README.md +8 -9
  61. data/tracks/csharp/exercises/markdown/README.md +1 -3
  62. data/tracks/csharp/exercises/matrix/README.md +7 -6
  63. data/tracks/csharp/exercises/meetup/README.md +17 -15
  64. data/tracks/csharp/exercises/minesweeper/README.md +1 -3
  65. data/tracks/csharp/exercises/nth-prime/README.md +1 -2
  66. data/tracks/csharp/exercises/nucleotide-count/README.md +9 -24
  67. data/tracks/csharp/exercises/ocr-numbers/README.md +7 -8
  68. data/tracks/csharp/exercises/octal/README.md +7 -4
  69. data/tracks/csharp/exercises/palindrome-products/README.md +16 -18
  70. data/tracks/csharp/exercises/pangram/README.md +2 -3
  71. data/tracks/csharp/exercises/parallel-letter-frequency/README.md +1 -3
  72. data/tracks/csharp/exercises/pascals-triangle/README.md +3 -4
  73. data/tracks/csharp/exercises/perfect-numbers/README.md +3 -4
  74. data/tracks/csharp/exercises/phone-number/README.md +5 -5
  75. data/tracks/csharp/exercises/pig-latin/README.md +1 -2
  76. data/tracks/csharp/exercises/poker/README.md +1 -2
  77. data/tracks/csharp/exercises/pov/README.md +4 -7
  78. data/tracks/csharp/exercises/prime-factors/README.md +1 -2
  79. data/tracks/csharp/exercises/protein-translation/README.md +6 -8
  80. data/tracks/csharp/exercises/proverb/README.md +15 -11
  81. data/tracks/csharp/exercises/pythagorean-triplet/README.md +4 -5
  82. data/tracks/csharp/exercises/queen-attack/README.md +2 -3
  83. data/tracks/csharp/exercises/rail-fence-cipher/README.md +13 -9
  84. data/tracks/csharp/exercises/raindrops/README.md +1 -2
  85. data/tracks/csharp/exercises/react/README.md +1 -3
  86. data/tracks/csharp/exercises/rectangles/README.md +17 -19
  87. data/tracks/csharp/exercises/reverse-string/README.md +16 -1
  88. data/tracks/csharp/exercises/rna-transcription/README.md +3 -4
  89. data/tracks/csharp/exercises/robot-name/README.md +1 -2
  90. data/tracks/csharp/exercises/robot-simulator/README.md +1 -2
  91. data/tracks/csharp/exercises/roman-numerals/README.md +2 -3
  92. data/tracks/csharp/exercises/rotational-cipher/README.md +3 -3
  93. data/tracks/csharp/exercises/run-length-encoding/README.md +5 -6
  94. data/tracks/csharp/exercises/saddle-points/README.md +3 -4
  95. data/tracks/csharp/exercises/say/README.md +1 -2
  96. data/tracks/csharp/exercises/scale-generator/README.md +1 -4
  97. data/tracks/csharp/exercises/scrabble-score/README.md +4 -3
  98. data/tracks/csharp/exercises/secret-handshake/README.md +2 -3
  99. data/tracks/csharp/exercises/series/README.md +1 -2
  100. data/tracks/csharp/exercises/sgf-parsing/README.md +5 -7
  101. data/tracks/csharp/exercises/sieve/README.md +1 -2
  102. data/tracks/csharp/exercises/simple-cipher/README.md +6 -9
  103. data/tracks/csharp/exercises/simple-linked-list/README.md +1 -2
  104. data/tracks/csharp/exercises/space-age/README.md +2 -3
  105. data/tracks/csharp/exercises/spiral-matrix/README.md +7 -8
  106. data/tracks/csharp/exercises/strain/README.md +1 -2
  107. data/tracks/csharp/exercises/sublist/README.md +1 -3
  108. data/tracks/csharp/exercises/sum-of-multiples/README.md +4 -8
  109. data/tracks/csharp/exercises/tournament/README.md +6 -8
  110. data/tracks/csharp/exercises/transpose/README.md +8 -9
  111. data/tracks/csharp/exercises/tree-building/README.md +4 -6
  112. data/tracks/csharp/exercises/triangle/README.md +10 -8
  113. data/tracks/csharp/exercises/trinary/README.md +2 -3
  114. data/tracks/csharp/exercises/twelve-days/README.md +2 -3
  115. data/tracks/csharp/exercises/two-bucket/README.md +11 -12
  116. data/tracks/csharp/exercises/two-fer/README.md +8 -9
  117. data/tracks/csharp/exercises/variable-length-quantity/README.md +7 -9
  118. data/tracks/csharp/exercises/word-count/README.md +2 -4
  119. data/tracks/csharp/exercises/word-search/README.md +2 -4
  120. data/tracks/csharp/exercises/wordy/README.md +1 -7
  121. data/tracks/csharp/exercises/zebra-puzzle/README.md +1 -2
  122. data/tracks/csharp/exercises/zipper/README.md +2 -4
  123. data/tracks/dart/config.json +2 -2
  124. data/tracks/go/config/exercise_readme.go.tmpl +17 -4
  125. data/tracks/go/exercises/acronym/README.md +0 -1
  126. data/tracks/go/exercises/all-your-base/README.md +0 -1
  127. data/tracks/go/exercises/allergies/README.md +0 -1
  128. data/tracks/go/exercises/alphametics/README.md +0 -1
  129. data/tracks/go/exercises/atbash-cipher/README.md +2 -1
  130. data/tracks/go/exercises/bank-account/README.md +0 -1
  131. data/tracks/go/exercises/beer-song/README.md +2 -2
  132. data/tracks/go/exercises/binary/README.md +2 -0
  133. data/tracks/go/exercises/bowling/README.md +20 -6
  134. data/tracks/go/exercises/change/README.md +1 -1
  135. data/tracks/go/exercises/circular-buffer/README.md +13 -6
  136. data/tracks/go/exercises/collatz-conjecture/README.md +1 -1
  137. data/tracks/go/exercises/connect/README.md +1 -2
  138. data/tracks/go/exercises/counter/README.md +0 -1
  139. data/tracks/go/exercises/crypto-square/README.md +10 -8
  140. data/tracks/go/exercises/custom-set/README.md +0 -1
  141. data/tracks/go/exercises/diamond/README.md +6 -6
  142. data/tracks/go/exercises/dominoes/README.md +0 -1
  143. data/tracks/go/exercises/error-handling/README.md +0 -1
  144. data/tracks/go/exercises/etl/README.md +3 -1
  145. data/tracks/go/exercises/food-chain/README.md +1 -1
  146. data/tracks/go/exercises/forth/README.md +0 -1
  147. data/tracks/go/exercises/grade-school/README.md +0 -1
  148. data/tracks/go/exercises/grains/README.md +0 -1
  149. data/tracks/go/exercises/house/README.md +2 -3
  150. data/tracks/go/exercises/isbn-verifier/README.md +26 -21
  151. data/tracks/go/exercises/isogram/README.md +2 -1
  152. data/tracks/go/exercises/kindergarten-garden/README.md +13 -13
  153. data/tracks/go/exercises/leap/README.md +1 -1
  154. data/tracks/go/exercises/ledger/README.md +0 -1
  155. data/tracks/go/exercises/luhn/README.md +7 -7
  156. data/tracks/go/exercises/matrix/README.md +6 -4
  157. data/tracks/go/exercises/meetup/README.md +16 -13
  158. data/tracks/go/exercises/minesweeper/README.md +0 -1
  159. data/tracks/go/exercises/nucleotide-count/README.md +25 -17
  160. data/tracks/go/exercises/ocr-numbers/README.md +6 -6
  161. data/tracks/go/exercises/octal/README.md +6 -2
  162. data/tracks/go/exercises/palindrome-products/README.md +15 -16
  163. data/tracks/go/exercises/pangram/README.md +1 -1
  164. data/tracks/go/exercises/parallel-letter-frequency/README.md +0 -1
  165. data/tracks/go/exercises/pascals-triangle/README.md +2 -2
  166. data/tracks/go/exercises/pov/README.md +3 -5
  167. data/tracks/go/exercises/protein-translation/README.md +5 -6
  168. data/tracks/go/exercises/pythagorean-triplet/README.md +3 -3
  169. data/tracks/go/exercises/queen-attack/README.md +1 -1
  170. data/tracks/go/exercises/react/README.md +0 -1
  171. data/tracks/go/exercises/reverse-string/README.md +1 -1
  172. data/tracks/go/exercises/rna-transcription/README.md +2 -2
  173. data/tracks/go/exercises/robot-name/README.md +15 -0
  174. data/tracks/go/exercises/roman-numerals/README.md +1 -1
  175. data/tracks/go/exercises/rotational-cipher/README.md +0 -1
  176. data/tracks/go/exercises/run-length-encoding/README.md +21 -4
  177. data/tracks/go/exercises/saddle-points/README.md +2 -2
  178. data/tracks/go/exercises/scrabble-score/README.md +3 -1
  179. data/tracks/go/exercises/secret-handshake/README.md +1 -1
  180. data/tracks/go/exercises/simple-linked-list/README.md +1 -2
  181. data/tracks/go/exercises/space-age/README.md +1 -2
  182. data/tracks/go/exercises/spiral-matrix/README.md +1 -1
  183. data/tracks/go/exercises/sublist/README.md +0 -1
  184. data/tracks/go/exercises/sum-of-multiples/README.md +3 -6
  185. data/tracks/go/exercises/tournament/README.md +5 -6
  186. data/tracks/go/exercises/transpose/README.md +7 -7
  187. data/tracks/go/exercises/tree-building/README.md +3 -4
  188. data/tracks/go/exercises/triangle/README.md +21 -6
  189. data/tracks/go/exercises/trinary/README.md +1 -1
  190. data/tracks/go/exercises/twelve-days/README.md +2 -3
  191. data/tracks/go/exercises/two-fer/README.md +2 -31
  192. data/tracks/go/exercises/variable-length-quantity/README.md +6 -7
  193. data/tracks/go/exercises/word-count/README.md +1 -2
  194. data/tracks/go/exercises/word-search/README.md +1 -2
  195. data/tracks/go/exercises/wordy/README.md +0 -5
  196. data/tracks/groovy/config.json +11 -0
  197. data/tracks/groovy/exercises/rotational-cipher/Example.groovy +38 -0
  198. data/tracks/groovy/exercises/rotational-cipher/README.md +49 -0
  199. data/tracks/groovy/exercises/rotational-cipher/RotationalCipher.groovy +11 -0
  200. data/tracks/groovy/exercises/rotational-cipher/RotationalCipherSpec.groovy +68 -0
  201. data/tracks/haskell/exercises/acronym/package.yaml +1 -1
  202. data/tracks/haskell/exercises/acronym/test/Tests.hs +2 -6
  203. data/tracks/haskell/exercises/anagram/package.yaml +1 -1
  204. data/tracks/haskell/exercises/anagram/test/Tests.hs +0 -20
  205. data/tracks/haskell/exercises/clock/package.yaml +1 -1
  206. data/tracks/haskell/exercises/clock/test/Tests.hs +16 -9
  207. data/tracks/haskell/exercises/complex-numbers/package.yaml +1 -1
  208. data/tracks/haskell/exercises/custom-set/package.yaml +1 -1
  209. data/tracks/haskell/exercises/hamming/package.yaml +1 -1
  210. data/tracks/haskell/exercises/kindergarten-garden/package.yaml +1 -1
  211. data/tracks/haskell/exercises/matrix/package.yaml +1 -1
  212. data/tracks/haskell/exercises/matrix/test/Tests.hs +25 -13
  213. data/tracks/haskell/exercises/ocr-numbers/package.yaml +1 -1
  214. data/tracks/haskell/exercises/prime-factors/package.yaml +1 -1
  215. data/tracks/haskell/exercises/queen-attack/package.yaml +1 -1
  216. data/tracks/haskell/exercises/rail-fence-cipher/package.yaml +1 -1
  217. data/tracks/haskell/exercises/raindrops/package.yaml +1 -1
  218. data/tracks/haskell/exercises/robot-simulator/package.yaml +1 -1
  219. data/tracks/haskell/exercises/roman-numerals/package.yaml +1 -1
  220. data/tracks/haskell/exercises/roman-numerals/test/Tests.hs +4 -0
  221. data/tracks/haskell/exercises/run-length-encoding/package.yaml +1 -1
  222. data/tracks/haskell/exercises/word-count/package.yaml +1 -1
  223. data/tracks/java/config.json +0 -1
  224. data/tracks/java/exercises/forth/README.md +1 -1
  225. data/tracks/objective-c/config/exercise_readme.go.tmpl +22 -4
  226. data/tracks/objective-c/exercises/acronym/README.md +8 -3
  227. data/tracks/objective-c/exercises/all-your-base/README.md +8 -3
  228. data/tracks/objective-c/exercises/allergies/README.md +8 -3
  229. data/tracks/objective-c/exercises/anagram/README.md +8 -2
  230. data/tracks/objective-c/exercises/atbash-cipher/README.md +10 -3
  231. data/tracks/objective-c/exercises/beer-song/README.md +10 -4
  232. data/tracks/objective-c/exercises/binary-search/README.md +8 -2
  233. data/tracks/objective-c/exercises/bob/.meta/description.md +10 -0
  234. data/tracks/objective-c/exercises/bob/README.md +8 -2
  235. data/tracks/objective-c/exercises/bracket-push/README.md +8 -2
  236. data/tracks/objective-c/exercises/clock/README.md +8 -2
  237. data/tracks/objective-c/exercises/collatz-conjecture/README.md +8 -2
  238. data/tracks/objective-c/exercises/crypto-square/README.md +18 -10
  239. data/tracks/objective-c/exercises/difference-of-squares/README.md +8 -2
  240. data/tracks/objective-c/exercises/etl/README.md +11 -3
  241. data/tracks/objective-c/exercises/flatten-array/README.md +9 -4
  242. data/tracks/objective-c/exercises/gigasecond/README.md +8 -2
  243. data/tracks/objective-c/exercises/grade-school/README.md +8 -3
  244. data/tracks/objective-c/exercises/grains/README.md +8 -2
  245. data/tracks/objective-c/exercises/hamming/README.md +8 -2
  246. data/tracks/objective-c/exercises/hello-world/README.md +8 -2
  247. data/tracks/objective-c/exercises/isogram/README.md +10 -3
  248. data/tracks/objective-c/exercises/largest-series-product/README.md +8 -2
  249. data/tracks/objective-c/exercises/leap/README.md +9 -3
  250. data/tracks/objective-c/exercises/luhn/README.md +15 -9
  251. data/tracks/objective-c/exercises/meetup/README.md +24 -15
  252. data/tracks/objective-c/exercises/nth-prime/README.md +8 -2
  253. data/tracks/objective-c/exercises/nucleotide-count/README.md +16 -24
  254. data/tracks/objective-c/exercises/pangram/README.md +9 -3
  255. data/tracks/objective-c/exercises/pascals-triangle/README.md +10 -4
  256. data/tracks/objective-c/exercises/perfect-numbers/README.md +10 -4
  257. data/tracks/objective-c/exercises/phone-number/README.md +12 -5
  258. data/tracks/objective-c/exercises/raindrops/README.md +8 -2
  259. data/tracks/objective-c/exercises/rna-transcription/README.md +10 -4
  260. data/tracks/objective-c/exercises/robot-name/README.md +8 -2
  261. data/tracks/objective-c/exercises/roman-numerals/README.md +9 -3
  262. data/tracks/objective-c/exercises/run-length-encoding/README.md +12 -6
  263. data/tracks/objective-c/exercises/say/README.md +8 -2
  264. data/tracks/objective-c/exercises/scrabble-score/README.md +11 -3
  265. data/tracks/objective-c/exercises/secret-handshake/README.md +10 -4
  266. data/tracks/objective-c/exercises/sieve/README.md +8 -2
  267. data/tracks/objective-c/exercises/space-age/README.md +9 -3
  268. data/tracks/objective-c/exercises/sublist/README.md +7 -2
  269. data/tracks/objective-c/exercises/sum-of-multiples/README.md +11 -8
  270. data/tracks/objective-c/exercises/transpose/README.md +15 -9
  271. data/tracks/objective-c/exercises/triangle/README.md +17 -8
  272. data/tracks/objective-c/exercises/two-fer/README.md +8 -2
  273. data/tracks/objective-c/exercises/word-count/README.md +9 -4
  274. data/tracks/php/.travis.yml +1 -1
  275. data/tracks/php/config/exercise_readme.go.tmpl +20 -4
  276. data/tracks/php/exercises/accumulate/README.md +9 -6
  277. data/tracks/php/exercises/acronym/README.md +9 -4
  278. data/tracks/php/exercises/all-your-base/README.md +35 -11
  279. data/tracks/php/exercises/allergies/README.md +9 -4
  280. data/tracks/php/exercises/anagram/README.md +10 -4
  281. data/tracks/php/exercises/atbash-cipher/README.md +12 -5
  282. data/tracks/php/exercises/beer-song/README.md +12 -6
  283. data/tracks/php/exercises/binary-search/README.md +10 -4
  284. data/tracks/php/exercises/binary/README.md +12 -4
  285. data/tracks/php/exercises/bob/.meta/description.md +10 -0
  286. data/tracks/php/exercises/bob/README.md +10 -4
  287. data/tracks/php/exercises/book-store/README.md +15 -9
  288. data/tracks/php/exercises/bowling/README.md +30 -10
  289. data/tracks/php/exercises/bracket-push/README.md +10 -4
  290. data/tracks/php/exercises/change/README.md +11 -5
  291. data/tracks/php/exercises/clock/README.md +10 -4
  292. data/tracks/php/exercises/collatz-conjecture/README.md +10 -4
  293. data/tracks/php/exercises/connect/README.md +11 -6
  294. data/tracks/php/exercises/crypto-square/README.md +10 -4
  295. data/tracks/php/exercises/difference-of-squares/README.md +10 -4
  296. data/tracks/php/exercises/etl/README.md +13 -5
  297. data/tracks/php/exercises/flatten-array/README.md +10 -4
  298. data/tracks/php/exercises/gigasecond/README.md +10 -4
  299. data/tracks/php/exercises/grade-school/README.md +10 -5
  300. data/tracks/php/exercises/grains/README.md +10 -5
  301. data/tracks/php/exercises/hamming/README.md +10 -4
  302. data/tracks/php/exercises/hello-world/README.md +10 -4
  303. data/tracks/php/exercises/isogram/README.md +12 -5
  304. data/tracks/php/exercises/largest-series-product/README.md +10 -4
  305. data/tracks/php/exercises/leap/README.md +11 -5
  306. data/tracks/php/exercises/luhn/README.md +17 -11
  307. data/tracks/php/exercises/markdown/README.md +10 -5
  308. data/tracks/php/exercises/meetup/README.md +45 -12
  309. data/tracks/php/exercises/meetup/example.php +0 -2
  310. data/tracks/php/exercises/meetup/meetup_test.php +0 -2
  311. data/tracks/php/exercises/minesweeper/README.md +10 -5
  312. data/tracks/php/exercises/nth-prime/README.md +10 -4
  313. data/tracks/php/exercises/nucleotide-count/README.md +15 -23
  314. data/tracks/php/exercises/ocr-numbers/README.md +16 -10
  315. data/tracks/php/exercises/pangram/README.md +11 -5
  316. data/tracks/php/exercises/pascals-triangle/README.md +12 -6
  317. data/tracks/php/exercises/perfect-numbers/README.md +12 -6
  318. data/tracks/php/exercises/phone-number/README.md +14 -7
  319. data/tracks/php/exercises/pig-latin/README.md +10 -4
  320. data/tracks/php/exercises/prime-factors/README.md +10 -4
  321. data/tracks/php/exercises/queen-attack/README.md +11 -5
  322. data/tracks/php/exercises/rail-fence-cipher/README.md +10 -4
  323. data/tracks/php/exercises/raindrops/README.md +10 -4
  324. data/tracks/php/exercises/rna-transcription/README.md +11 -5
  325. data/tracks/php/exercises/robot-name/README.md +10 -4
  326. data/tracks/php/exercises/robot-simulator/README.md +10 -4
  327. data/tracks/php/exercises/roman-numerals/README.md +11 -5
  328. data/tracks/php/exercises/run-length-encoding/README.md +13 -4
  329. data/tracks/php/exercises/scrabble-score/README.md +13 -5
  330. data/tracks/php/exercises/series/README.md +27 -0
  331. data/tracks/php/exercises/series/example.php +0 -2
  332. data/tracks/php/exercises/series/series_test.php +0 -1
  333. data/tracks/php/exercises/sieve/README.md +10 -4
  334. data/tracks/php/exercises/space-age/README.md +11 -5
  335. data/tracks/php/exercises/sum-of-multiples/README.md +12 -9
  336. data/tracks/php/exercises/transpose/README.md +10 -4
  337. data/tracks/php/exercises/triangle/README.md +19 -10
  338. data/tracks/php/exercises/trinary/README.md +11 -5
  339. data/tracks/php/exercises/variable-length-quantity/README.md +16 -11
  340. data/tracks/php/exercises/word-count/README.md +10 -5
  341. data/tracks/php/exercises/wordy/README.md +9 -8
  342. data/tracks/rust/config/exercise_readme.go.tmpl +32 -4
  343. data/tracks/rust/exercises/all-your-base/README.md +0 -1
  344. data/tracks/rust/exercises/alphametics/README.md +0 -1
  345. data/tracks/rust/exercises/custom-set/README.md +0 -1
  346. data/tracks/rust/exercises/dominoes/README.md +0 -1
  347. data/tracks/rust/exercises/forth/README.md +0 -1
  348. data/tracks/rust/exercises/isbn-verifier/README.md +1 -1
  349. data/tracks/rust/exercises/minesweeper/README.md +0 -1
  350. data/tracks/rust/exercises/nucleotide-codons/README.md +0 -1
  351. data/tracks/rust/exercises/parallel-letter-frequency/README.md +0 -1
  352. data/tracks/rust/exercises/protein-translation/README.md +2 -2
  353. data/tracks/rust/exercises/react/README.md +0 -1
  354. data/tracks/rust/exercises/rectangles/README.md +0 -1
  355. data/tracks/rust/exercises/reverse-string/README.md +1 -1
  356. data/tracks/rust/exercises/rna-transcription/.meta/hints.md +9 -0
  357. data/tracks/rust/exercises/rna-transcription/README.md +12 -1
  358. data/tracks/rust/exercises/rna-transcription/example.rs +66 -27
  359. data/tracks/rust/exercises/rna-transcription/tests/rna-transcription.rs +52 -19
  360. data/tracks/rust/exercises/sublist/README.md +0 -1
  361. data/tracks/rust/exercises/tournament/README.md +0 -1
  362. data/tracks/swift/config/exercise_readme.go.tmpl +7 -4
  363. data/tracks/swift/exercises/accumulate/README.md +0 -3
  364. data/tracks/swift/exercises/acronym/README.md +0 -1
  365. data/tracks/swift/exercises/all-your-base/README.md +1 -2
  366. data/tracks/swift/exercises/allergies/README.md +0 -1
  367. data/tracks/swift/exercises/atbash-cipher/README.md +2 -1
  368. data/tracks/swift/exercises/beer-song/README.md +2 -2
  369. data/tracks/swift/exercises/binary/README.md +2 -0
  370. data/tracks/swift/exercises/bob/.meta/description.md +10 -0
  371. data/tracks/swift/exercises/bowling/README.md +20 -6
  372. data/tracks/swift/exercises/circular-buffer/README.md +21 -13
  373. data/tracks/swift/exercises/collatz-conjecture/README.md +1 -1
  374. data/tracks/swift/exercises/crypto-square/README.md +10 -8
  375. data/tracks/swift/exercises/custom-set/README.md +0 -1
  376. data/tracks/swift/exercises/diamond/README.md +3 -0
  377. data/tracks/swift/exercises/dominoes/README.md +3 -4
  378. data/tracks/swift/exercises/etl/README.md +3 -1
  379. data/tracks/swift/exercises/flatten-array/README.md +1 -2
  380. data/tracks/swift/exercises/food-chain/README.md +1 -1
  381. data/tracks/swift/exercises/grade-school/README.md +0 -1
  382. data/tracks/swift/exercises/grains/README.md +0 -1
  383. data/tracks/swift/exercises/house/README.md +2 -3
  384. data/tracks/swift/exercises/isbn-verifier/README.md +32 -16
  385. data/tracks/swift/exercises/isogram/README.md +2 -1
  386. data/tracks/swift/exercises/kindergarten-garden/README.md +13 -13
  387. data/tracks/swift/exercises/leap/README.md +1 -1
  388. data/tracks/swift/exercises/linked-list/README.md +10 -10
  389. data/tracks/swift/exercises/list-ops/README.md +1 -0
  390. data/tracks/swift/exercises/luhn/README.md +7 -7
  391. data/tracks/swift/exercises/matrix/README.md +6 -4
  392. data/tracks/swift/exercises/meetup/README.md +16 -13
  393. data/tracks/swift/exercises/minesweeper/README.md +0 -1
  394. data/tracks/swift/exercises/nucleotide-count/README.md +8 -22
  395. data/tracks/swift/exercises/ocr-numbers/README.md +6 -6
  396. data/tracks/swift/exercises/octal/README.md +6 -2
  397. data/tracks/swift/exercises/palindrome-products/README.md +15 -16
  398. data/tracks/swift/exercises/pangram/README.md +1 -1
  399. data/tracks/swift/exercises/pascals-triangle/README.md +2 -2
  400. data/tracks/swift/exercises/perfect-numbers/README.md +2 -2
  401. data/tracks/swift/exercises/phone-number/README.md +4 -3
  402. data/tracks/swift/exercises/protein-translation/README.md +4 -4
  403. data/tracks/swift/exercises/pythagorean-triplet/README.md +3 -3
  404. data/tracks/swift/exercises/queen-attack/README.md +1 -1
  405. data/tracks/swift/exercises/rna-transcription/README.md +2 -2
  406. data/tracks/swift/exercises/roman-numerals/README.md +1 -1
  407. data/tracks/swift/exercises/run-length-encoding/README.md +4 -4
  408. data/tracks/swift/exercises/saddle-points/README.md +2 -2
  409. data/tracks/swift/exercises/say/README.md +1 -1
  410. data/tracks/swift/exercises/scrabble-score/README.md +3 -1
  411. data/tracks/swift/exercises/secret-handshake/README.md +2 -2
  412. data/tracks/swift/exercises/simple-cipher/README.md +5 -7
  413. data/tracks/swift/exercises/space-age/README.md +1 -1
  414. data/tracks/swift/exercises/sublist/README.md +0 -1
  415. data/tracks/swift/exercises/sum-of-multiples/README.md +3 -6
  416. data/tracks/swift/exercises/tournament/README.md +5 -6
  417. data/tracks/swift/exercises/transpose/README.md +7 -7
  418. data/tracks/swift/exercises/triangle/README.md +9 -6
  419. data/tracks/swift/exercises/trinary/README.md +1 -1
  420. data/tracks/swift/exercises/twelve-days/README.md +1 -1
  421. data/tracks/swift/exercises/two-fer/README.md +2 -29
  422. data/tracks/swift/exercises/word-count/README.md +1 -2
  423. data/tracks/swift/exercises/wordy/README.md +0 -5
  424. metadata +12 -10
  425. data/tracks/cfml/tasks/exercise_template/.meta/HINTS.md +0 -0
  426. data/tracks/csharp/docs/EXERCISE_README_INSERT.md +0 -5
  427. data/tracks/go/docs/EXERCISE_README_INSERT.md +0 -16
  428. data/tracks/java/exercises/forth/.meta/readme.go.tmpl +0 -17
  429. data/tracks/objective-c/docs/EXERCISE_README_INSERT.md +0 -15
  430. data/tracks/php/docs/EXERCISE_README_INSERT.md +0 -13
  431. data/tracks/rust/config/exercise-readme-insert.md +0 -31
  432. data/tracks/swift/docs/EXERCISE_README_INSERT.md +0 -6
@@ -5,18 +5,17 @@ Implement variable length quantity encoding and decoding.
5
5
  The goal of this exercise is to implement [VLQ](https://en.wikipedia.org/wiki/Variable-length_quantity) encoding/decoding.
6
6
 
7
7
  In short, the goal of this encoding is to encode integer values in a way that would save bytes.
8
- Only the first 7 bits of each byte is significant (right-justified; sort of like an ASCII byte).
9
- So, if you have a 32-bit value, you have to unpack it into a series of 7-bit bytes.
10
- Of course, you will have a variable number of bytes depending upon your integer.
8
+ Only the first 7 bits of each byte is significant (right-justified; sort of like an ASCII byte).
9
+ So, if you have a 32-bit value, you have to unpack it into a series of 7-bit bytes.
10
+ Of course, you will have a variable number of bytes depending upon your integer.
11
11
  To indicate which is the last byte of the series, you leave bit #7 clear.
12
- In all of the preceding bytes, you set bit #7.
12
+ In all of the preceding bytes, you set bit #7.
13
13
 
14
- So, if an integer is between `0-127`, it can be represented as one byte.
14
+ So, if an integer is between `0-127`, it can be represented as one byte.
15
15
  Although VLQ can deal with numbers of arbitrary sizes, for this exercise we will restrict ourselves to only numbers that fit in a 32-bit unsigned integer.
16
16
  Here are examples of integers as 32-bit values, and the variable length quantities that they translate to:
17
17
 
18
-
19
- ```
18
+ ```text
20
19
  NUMBER VARIABLE QUANTITY
21
20
  00000000 00
22
21
  00000040 40
@@ -32,16 +31,22 @@ Here are examples of integers as 32-bit values, and the variable length quantiti
32
31
  0FFFFFFF FF FF FF 7F
33
32
  ```
34
33
 
35
- ## Making the Test Suite Pass
36
34
 
37
- 1. Get [PHPUnit].
35
+ ## Running the tests
36
+
37
+ 1. Go to the root of your PHP exercise directory, which is `<EXERCISM_WORKSPACE>/php`.
38
+ To find the Exercism workspace run
39
+
40
+ % exercism debug | grep Workspace
41
+
42
+ 1. Get [PHPUnit] if you don't have it already.
38
43
 
39
44
  % wget --no-check-certificate https://phar.phpunit.de/phpunit.phar
40
45
  % chmod +x phpunit.phar
41
46
 
42
- 2. Execute the tests for an assignment.
47
+ 2. Execute the tests:
43
48
 
44
- % phpunit.phar wordy/wordy_test.php
49
+ % ./phpunit.phar variable-length-quantity/variable-length-quantity_test.php
45
50
 
46
51
  [PHPUnit]: http://phpunit.de
47
52
 
@@ -4,7 +4,7 @@ Given a phrase, count the occurrences of each word in that phrase.
4
4
 
5
5
  For example for the input `"olly olly in come free"`
6
6
 
7
- ```plain
7
+ ```text
8
8
  olly: 2
9
9
  in: 1
10
10
  come: 1
@@ -12,16 +12,21 @@ free: 1
12
12
  ```
13
13
 
14
14
 
15
- ## Making the Test Suite Pass
15
+ ## Running the tests
16
16
 
17
- 1. Get [PHPUnit].
17
+ 1. Go to the root of your PHP exercise directory, which is `<EXERCISM_WORKSPACE>/php`.
18
+ To find the Exercism workspace run
19
+
20
+ % exercism debug | grep Workspace
21
+
22
+ 1. Get [PHPUnit] if you don't have it already.
18
23
 
19
24
  % wget --no-check-certificate https://phar.phpunit.de/phpunit.phar
20
25
  % chmod +x phpunit.phar
21
26
 
22
- 2. Execute the tests for an assignment.
27
+ 2. Execute the tests:
23
28
 
24
- % phpunit.phar wordy/wordy_test.php
29
+ % ./phpunit.phar word-count/word-count_test.php
25
30
 
26
31
  [PHPUnit]: http://phpunit.de
27
32
 
@@ -2,7 +2,6 @@
2
2
 
3
3
  Parse and evaluate simple math word problems returning the answer as an integer.
4
4
 
5
-
6
5
  ## Iteration 1 — Addition
7
6
 
8
7
  Add two numbers together.
@@ -13,7 +12,6 @@ Evaluates to 18.
13
12
 
14
13
  Handle large numbers and negative numbers.
15
14
 
16
-
17
15
  ## Iteration 2 — Subtraction, Multiplication and Division
18
16
 
19
17
  Now, perform the other three operations.
@@ -30,7 +28,6 @@ Now, perform the other three operations.
30
28
 
31
29
  5
32
30
 
33
-
34
31
  ## Iteration 3 — Multiple Operations
35
32
 
36
33
  Handle a set of operations, in sequence.
@@ -46,7 +43,6 @@ left-to-right, _ignoring the typical order of operations._
46
43
 
47
44
  15 (i.e. not 9)
48
45
 
49
-
50
46
  ## Bonus — Exponentials
51
47
 
52
48
  If you'd like, handle exponentials.
@@ -56,16 +52,21 @@ If you'd like, handle exponentials.
56
52
  32
57
53
 
58
54
 
59
- ## Making the Test Suite Pass
55
+ ## Running the tests
56
+
57
+ 1. Go to the root of your PHP exercise directory, which is `<EXERCISM_WORKSPACE>/php`.
58
+ To find the Exercism workspace run
59
+
60
+ % exercism debug | grep Workspace
60
61
 
61
- 1. Get [PHPUnit].
62
+ 1. Get [PHPUnit] if you don't have it already.
62
63
 
63
64
  % wget --no-check-certificate https://phar.phpunit.de/phpunit.phar
64
65
  % chmod +x phpunit.phar
65
66
 
66
- 2. Execute the tests for an assignment.
67
+ 2. Execute the tests:
67
68
 
68
- % phpunit.phar wordy/wordy_test.php
69
+ % ./phpunit.phar wordy/wordy_test.php
69
70
 
70
71
  [PHPUnit]: http://phpunit.de
71
72
 
@@ -4,10 +4,38 @@
4
4
  {{- with .Hints }}
5
5
  {{ . }}
6
6
  {{ end }}
7
- {{- with .TrackInsert }}
8
- {{ . }}
9
- {{ end }}
10
- {{- with .Spec.Credits -}}
7
+ ## Rust Installation
8
+
9
+ Refer to the [exercism help page][help-page] for Rust installation and learning
10
+ resources.
11
+
12
+ ## Writing the Code
13
+
14
+ Execute the tests with:
15
+
16
+ ```bash
17
+ $ cargo test
18
+ ```
19
+
20
+ All but the first test have been ignored. After you get the first test to
21
+ pass, remove the ignore flag (`#[ignore]`) from the next test and get the tests
22
+ to pass again. The test file is located in the `tests` directory. You can
23
+ also remove the ignore flag from all the tests to get them to run all at once
24
+ if you wish.
25
+
26
+ Make sure to read the [Modules](https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html) chapter if you
27
+ haven't already, it will help you with organizing your files.
28
+
29
+ ## Feedback, Issues, Pull Requests
30
+
31
+ The [exercism/rust](https://github.com/exercism/rust) repository on GitHub is the home for all of the Rust exercises. If you have feedback about an exercise, or want to help implement new exercises, head over there and create an issue. Members of the [rust track team](https://github.com/orgs/exercism/teams/rust) are happy to help!
32
+
33
+ If you want to know more about Exercism, take a look at the [contribution guide](https://github.com/exercism/docs/blob/master/contributing-to-language-tracks/README.md).
34
+
35
+ [help-page]: http://exercism.io/languages/rust
36
+ [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
37
+ [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
38
+ {{ with .Spec.Credits }}
11
39
  ## Source
12
40
 
13
41
  {{ . }}
@@ -63,6 +63,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
63
63
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
64
64
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
65
65
 
66
-
67
66
  ## Submitting Incomplete Solutions
68
67
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -63,6 +63,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
63
63
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
64
64
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
65
65
 
66
-
67
66
  ## Submitting Incomplete Solutions
68
67
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -39,6 +39,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
39
39
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
40
40
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
41
41
 
42
-
43
42
  ## Submitting Incomplete Solutions
44
43
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -46,6 +46,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
46
46
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
47
47
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
48
48
 
49
-
50
49
  ## Submitting Incomplete Solutions
51
50
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -57,6 +57,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
57
57
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
58
58
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
59
59
 
60
-
61
60
  ## Submitting Incomplete Solutions
62
61
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -1,4 +1,4 @@
1
- # Isbn Verifier
1
+ # ISBN Verifier
2
2
 
3
3
  The [ISBN-10 verification process](https://en.wikipedia.org/wiki/International_Standard_Book_Number) is used to validate book identification
4
4
  numbers. These normally contain dashes and look like: `3-598-21508-8`
@@ -58,6 +58,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
58
58
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
59
59
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
60
60
 
61
-
62
61
  ## Submitting Incomplete Solutions
63
62
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -50,6 +50,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
50
50
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
51
51
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
52
52
 
53
-
54
53
  ## Submitting Incomplete Solutions
55
54
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -73,6 +73,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
73
73
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
74
74
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
75
75
 
76
-
77
76
  ## Submitting Incomplete Solutions
78
77
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -20,11 +20,11 @@ All subsequent codons after are ignored, like this:
20
20
 
21
21
  RNA: `"AUGUUUUCUUAAAUG"` =>
22
22
 
23
- Codons: `"AUG", "UUU", "UCU", "UAG", "AUG"` =>
23
+ Codons: `"AUG", "UUU", "UCU", "UAA", "AUG"` =>
24
24
 
25
25
  Protein: `"Methionine", "Phenylalanine", "Serine"`
26
26
 
27
- Note the stop codon terminates the translation and the final methionine is not translated into the protein sequence.
27
+ Note the stop codon `"UAA"` terminates the translation and the final methionine is not translated into the protein sequence.
28
28
 
29
29
  Below are the codons and resulting Amino Acids needed for the exercise.
30
30
 
@@ -47,6 +47,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
47
47
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
48
48
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
49
49
 
50
-
51
50
  ## Submitting Incomplete Solutions
52
51
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -95,6 +95,5 @@ If you want to know more about Exercism, take a look at the [contribution guide]
95
95
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
96
96
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
97
97
 
98
-
99
98
  ## Submitting Incomplete Solutions
100
99
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -1,4 +1,4 @@
1
- # reverse-string
1
+ # Reverse String
2
2
 
3
3
  Reverse a string
4
4
 
@@ -0,0 +1,9 @@
1
+ ## Notes on Rust implementation
2
+
3
+ By using private fields in structs with public `new` functions returning
4
+ `Option` or `Result` (as here with `DNA::new` & `RNA::new`), we can guarantee
5
+ that the internal representation of `DNA` is correct. Because every valid DNA
6
+ string has a valid RNA string, we don't need to return a `Result`/`Option` from
7
+ `to_rna`.
8
+
9
+ This explains the type signatures you will see in the tests.
@@ -18,6 +18,17 @@ each nucleotide with its complement:
18
18
  * `T` -> `A`
19
19
  * `A` -> `U`
20
20
 
21
+ ## Notes on Rust implementation
22
+
23
+ By using private fields in structs with public `new` functions returning
24
+ `Option` or `Result` (as here with `DNA::new` & `RNA::new`), we can guarantee
25
+ that the internal representation of `DNA` is correct. Because every valid DNA
26
+ string has a valid RNA string, we don't need to return a `Result`/`Option` from
27
+ `to_rna`.
28
+
29
+ This explains the type signatures you will see in the tests.
30
+
31
+
21
32
  ## Rust Installation
22
33
 
23
34
  Refer to the [exercism help page][help-page] for Rust installation and learning
@@ -52,7 +63,7 @@ If you want to know more about Exercism, take a look at the [contribution guide]
52
63
 
53
64
  ## Source
54
65
 
55
- Rosalind [http://rosalind.info/problems/rna](http://rosalind.info/problems/rna)
66
+ Hyperphysics [http://hyperphysics.phy-astr.gsu.edu/hbase/Organic/transcription.html](http://hyperphysics.phy-astr.gsu.edu/hbase/Organic/transcription.html)
56
67
 
57
68
  ## Submitting Incomplete Solutions
58
69
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -1,40 +1,79 @@
1
- #[derive(PartialEq, Eq, Debug)]
2
- pub struct RNA {
3
- nucleotides: String
4
- }
5
1
 
6
- impl RNA {
7
- pub fn new(nucleotides: &str) -> RNA {
8
- RNA { nucleotides: nucleotides.to_string() }
9
- }
10
- }
11
2
 
12
- #[derive(PartialEq, Eq, Debug)]
13
- pub struct DNA {
14
- nucleotides: String
3
+ /// The possible nucleotides in DNA and RNA
4
+ #[derive(Debug, Eq, PartialEq, Clone, Copy)]
5
+ pub enum Nucleotide {
6
+ Adenine,
7
+ Cytosine,
8
+ Guanine,
9
+ Thymine,
10
+ Uracil
15
11
  }
16
12
 
17
- fn transcribe_dna_rna(c: char) -> Option<char> {
18
- match c {
19
- 'C' => Some('G'),
20
- 'G' => Some('C'),
21
- 'A' => Some('U'),
22
- 'T' => Some('A'),
23
- _ => None
13
+ impl Nucleotide {
14
+ /// Parses a nucleotode from its character value, if valid.
15
+ fn from_char(ch: char) -> Option<Nucleotide> {
16
+ Some(match ch {
17
+ 'A' => Nucleotide::Adenine,
18
+ 'C' => Nucleotide::Cytosine,
19
+ 'G' => Nucleotide::Guanine,
20
+ 'T' => Nucleotide::Thymine,
21
+ 'U' => Nucleotide::Uracil,
22
+ _ => { return None; }
23
+ })
24
24
  }
25
25
  }
26
26
 
27
+ /// A vector of nucleotides
28
+ ///
29
+ /// Guaranteed that Uracil is not present thanks to `new`.
30
+ #[derive(Debug, Eq, PartialEq, Clone)]
31
+ pub struct DNA(Vec<Nucleotide>);
32
+
27
33
  impl DNA {
28
- pub fn new(nucleotides: &str) -> DNA {
29
- DNA { nucleotides: nucleotides.to_string() }
34
+ /// Parse a DNA string, checking it is valid.
35
+ ///
36
+ /// The error value is the first invalid character index (char index, not utf8).
37
+ pub fn new(input: &str) -> Result<DNA, usize> {
38
+ let mut out = Vec::new();
39
+ for (idx, ch) in input.chars().enumerate() {
40
+ match Nucleotide::from_char(ch) {
41
+ Some(Nucleotide::Uracil) | None => { return Err(idx); },
42
+ Some(n) => { out.push(n); },
43
+ }
44
+ }
45
+ Ok(DNA(out))
30
46
  }
31
47
 
32
- pub fn to_rna(&self) -> Result<RNA, ()> {
33
- let rna_nucleotides: String = self.nucleotides.chars().filter_map(transcribe_dna_rna).collect();
34
- if rna_nucleotides.len() == self.nucleotides.len() {
35
- Ok(RNA { nucleotides: rna_nucleotides })
36
- } else {
37
- Err(())
48
+ pub fn to_rna(mut self) -> RNA {
49
+ for nuc in self.0.iter_mut() {
50
+ *nuc = match *nuc {
51
+ Nucleotide::Adenine => Nucleotide::Uracil,
52
+ Nucleotide::Cytosine => Nucleotide::Guanine,
53
+ Nucleotide::Guanine => Nucleotide::Cytosine,
54
+ Nucleotide::Thymine => Nucleotide::Adenine,
55
+ Nucleotide::Uracil => unreachable!()
56
+ }
57
+ }
58
+ RNA(self.0)
59
+ }
60
+ }
61
+
62
+ #[derive(Debug, Eq, PartialEq, Clone)]
63
+ pub struct RNA(Vec<Nucleotide>);
64
+
65
+ impl RNA {
66
+ /// Parse a RNA string, checking it is valid.
67
+ ///
68
+ /// The error value is the first invalid character index (char index, not utf8).
69
+ pub fn new(input: &str) -> Result<RNA, usize> {
70
+ let mut out = Vec::new();
71
+ for (idx, ch) in input.chars().enumerate() {
72
+ match Nucleotide::from_char(ch) {
73
+ Some(Nucleotide::Thymine) | None => { return Err(idx); },
74
+ Some(n) => { out.push(n); },
75
+ }
38
76
  }
77
+ Ok(RNA(out))
39
78
  }
40
79
  }
@@ -1,55 +1,88 @@
1
1
  extern crate rna_transcription as dna;
2
2
 
3
3
  #[test]
4
- fn test_acid_equals_acid() {
5
- assert_eq!(dna::RNA::new("CGA"), dna::RNA::new("CGA"));
6
- assert_ne!(dna::RNA::new("CGA"), dna::RNA::new("AGC"));
4
+ fn test_valid_dna_input() {
5
+ assert!(dna::DNA::new("GCTA").is_ok());
7
6
  }
8
7
 
9
8
  #[test]
10
9
  #[ignore]
11
- fn test_transcribes_cytosine_guanine() {
12
- assert_eq!(Ok(dna::RNA::new("G")), dna::DNA::new("C").to_rna());
10
+ fn test_valid_rna_input() {
11
+ assert!(dna::RNA::new("CGAU").is_ok());
13
12
  }
14
13
 
15
14
  #[test]
16
15
  #[ignore]
17
- fn test_transcribes_guanine_cytosine() {
18
- assert_eq!(Ok(dna::RNA::new("C")), dna::DNA::new("G").to_rna());
16
+ fn test_invalid_dna_input() {
17
+ // Invalid character
18
+ assert!(dna::DNA::new("X").is_err());
19
+ // Valid nucleotide, but invalid in context
20
+ assert!(dna::DNA::new("U").is_err());
21
+ // Longer string with contained errors
22
+ assert!(dna::DNA::new("ACGTUXXCTTAA").is_err());
19
23
  }
20
24
 
21
25
  #[test]
22
26
  #[ignore]
23
- fn test_transcribes_adenine_uracil() {
24
- assert_eq!(Ok(dna::RNA::new("U")), dna::DNA::new("A").to_rna());
27
+ fn test_invalid_rna_input() {
28
+ // Invalid character
29
+ assert!(dna::RNA::new("X").is_err());
30
+ // Valid nucleotide, but invalid in context
31
+ assert!(dna::RNA::new("T").is_err());
32
+ // Longer string with contained errors
33
+ assert!(dna::RNA::new("ACGUTTXCUUAA").is_err());
25
34
  }
26
35
 
27
36
  #[test]
28
37
  #[ignore]
29
- fn test_transcribes_thymine_to_adenine() {
30
- assert_eq!(Ok(dna::RNA::new("A")), dna::DNA::new("T").to_rna());
38
+ fn test_acid_equals_acid() {
39
+ assert_eq!(dna::DNA::new("CGA").unwrap(), dna::DNA::new("CGA").unwrap());
40
+ assert_ne!(dna::DNA::new("CGA").unwrap(), dna::DNA::new("AGC").unwrap());
41
+ assert_eq!(dna::RNA::new("CGA").unwrap(), dna::RNA::new("CGA").unwrap());
42
+ assert_ne!(dna::RNA::new("CGA").unwrap(), dna::RNA::new("AGC").unwrap());
31
43
  }
32
44
 
33
45
  #[test]
34
46
  #[ignore]
35
- fn test_transcribes_all_dna_to_rna() {
36
- assert_eq!(Ok(dna::RNA::new("UGCACCAGAAUU")), dna::DNA::new("ACGTGGTCTTAA").to_rna())
47
+ fn test_transcribes_cytosine_guanine() {
48
+ assert_eq!(
49
+ dna::RNA::new("G").unwrap(),
50
+ dna::DNA::new("C").unwrap().to_rna()
51
+ );
37
52
  }
38
53
 
39
54
  #[test]
40
55
  #[ignore]
41
- fn handles_invalid_input() {
42
- assert!(dna::DNA::new("U").to_rna().is_err());
56
+ fn test_transcribes_guanine_cytosine() {
57
+ assert_eq!(
58
+ dna::RNA::new("C").unwrap(),
59
+ dna::DNA::new("G").unwrap().to_rna()
60
+ );
61
+ }
62
+
63
+ #[test]
64
+ #[ignore]
65
+ fn test_transcribes_adenine_uracil() {
66
+ assert_eq!(
67
+ dna::RNA::new("U").unwrap(),
68
+ dna::DNA::new("A").unwrap().to_rna()
69
+ );
43
70
  }
44
71
 
45
72
  #[test]
46
73
  #[ignore]
47
- fn handles_completely_invalid_input() {
48
- assert!(dna::DNA::new("XXX").to_rna().is_err());
74
+ fn test_transcribes_thymine_to_adenine() {
75
+ assert_eq!(
76
+ dna::RNA::new("A").unwrap(),
77
+ dna::DNA::new("T").unwrap().to_rna()
78
+ );
49
79
  }
50
80
 
51
81
  #[test]
52
82
  #[ignore]
53
- fn handles_partially_invalid_input() {
54
- assert!(dna::DNA::new("ACGTXXXCTTAA").to_rna().is_err());
83
+ fn test_transcribes_all_dna_to_rna() {
84
+ assert_eq!(
85
+ dna::RNA::new("UGCACCAGAAUU").unwrap(),
86
+ dna::DNA::new("ACGTGGTCTTAA").unwrap().to_rna()
87
+ )
55
88
  }