trackler 2.2.0.4 → 2.2.0.5

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 (486) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/bash/config.json +10 -2
  4. data/tracks/bash/exercises/word-count/example.awk +12 -0
  5. data/tracks/bash/exercises/word-count/example.sh +21 -0
  6. data/tracks/c/config.json +0 -2
  7. data/tracks/ceylon/config.json +0 -2
  8. data/tracks/{erlang/exercises/all-your-base/.meta/readme.go.tmpl → clojure/config/exercise_readme.go.tmpl} +0 -1
  9. data/tracks/clojure/exercises/accumulate/README.md +35 -0
  10. data/tracks/clojure/exercises/acronym/README.md +15 -0
  11. data/tracks/clojure/exercises/all-your-base/README.md +35 -0
  12. data/tracks/clojure/exercises/allergies/README.md +37 -0
  13. data/tracks/clojure/exercises/anagram/README.md +13 -0
  14. data/tracks/clojure/exercises/atbash-cipher/README.md +34 -0
  15. data/tracks/clojure/exercises/bank-account/README.md +30 -0
  16. data/tracks/clojure/exercises/beer-song/README.md +327 -0
  17. data/tracks/clojure/exercises/binary/README.md +35 -0
  18. data/tracks/clojure/exercises/binary-search/README.md +41 -0
  19. data/tracks/clojure/exercises/binary-search-tree/README.md +60 -0
  20. data/tracks/clojure/exercises/bob/README.md +18 -0
  21. data/tracks/clojure/exercises/bracket-push/README.md +10 -0
  22. data/tracks/clojure/exercises/change/README.md +23 -0
  23. data/tracks/clojure/exercises/clock/README.md +13 -0
  24. data/tracks/clojure/exercises/crypto-square/README.md +74 -0
  25. data/tracks/clojure/exercises/difference-of-squares/README.md +19 -0
  26. data/tracks/clojure/exercises/etl/README.md +51 -0
  27. data/tracks/clojure/exercises/flatten-array/README.md +18 -0
  28. data/tracks/clojure/exercises/gigasecond/README.md +11 -0
  29. data/tracks/clojure/exercises/grade-school/README.md +42 -0
  30. data/tracks/clojure/exercises/grains/README.md +34 -0
  31. data/tracks/clojure/exercises/hamming/README.md +42 -0
  32. data/tracks/clojure/exercises/hello-world/README.md +51 -0
  33. data/tracks/clojure/exercises/hexadecimal/README.md +14 -0
  34. data/tracks/clojure/exercises/isogram/README.md +19 -0
  35. data/tracks/clojure/exercises/kindergarten-garden/README.md +66 -0
  36. data/tracks/clojure/exercises/largest-series-product/README.md +20 -0
  37. data/tracks/clojure/exercises/leap/README.md +33 -0
  38. data/tracks/clojure/exercises/luhn/README.md +71 -0
  39. data/tracks/clojure/exercises/meetup/README.md +30 -0
  40. data/tracks/clojure/exercises/minesweeper/README.md +30 -0
  41. data/tracks/clojure/exercises/nth-prime/README.md +15 -0
  42. data/tracks/clojure/exercises/nucleotide-count/README.md +33 -0
  43. data/tracks/clojure/exercises/octal/README.md +49 -0
  44. data/tracks/clojure/exercises/pangram/README.md +15 -0
  45. data/tracks/clojure/exercises/pascals-triangle/README.md +21 -0
  46. data/tracks/clojure/exercises/perfect-numbers/README.md +24 -0
  47. data/tracks/clojure/exercises/phone-number/README.md +34 -0
  48. data/tracks/clojure/exercises/pig-latin/README.md +24 -0
  49. data/tracks/clojure/exercises/pov/README.md +46 -0
  50. data/tracks/clojure/exercises/prime-factors/README.md +36 -0
  51. data/tracks/clojure/exercises/queen-attack/README.md +33 -0
  52. data/tracks/clojure/exercises/raindrops/README.md +24 -0
  53. data/tracks/clojure/exercises/rna-transcription/README.md +25 -0
  54. data/tracks/clojure/exercises/robot-name/README.md +22 -0
  55. data/tracks/clojure/exercises/robot-simulator/README.md +34 -0
  56. data/tracks/clojure/exercises/roman-numerals/README.md +49 -0
  57. data/tracks/clojure/exercises/rotational-cipher/README.md +36 -0
  58. data/tracks/clojure/exercises/scrabble-score/README.md +44 -0
  59. data/tracks/clojure/exercises/secret-handshake/README.md +35 -0
  60. data/tracks/clojure/exercises/sieve/README.md +34 -0
  61. data/tracks/clojure/exercises/space-age/README.md +24 -0
  62. data/tracks/clojure/exercises/strain/README.md +40 -0
  63. data/tracks/clojure/exercises/sublist/README.md +21 -0
  64. data/tracks/clojure/exercises/sum-of-multiples/README.md +18 -0
  65. data/tracks/clojure/exercises/triangle/README.md +26 -0
  66. data/tracks/clojure/exercises/trinary/README.md +28 -0
  67. data/tracks/clojure/exercises/word-count/README.md +19 -0
  68. data/tracks/clojure/exercises/wordy/README.md +63 -0
  69. data/tracks/{erlang/exercises/allergies/.meta/readme.go.tmpl → crystal/config/exercise_readme.go.tmpl} +0 -1
  70. data/tracks/crystal/config.json +0 -2
  71. data/tracks/crystal/exercises/acronym/README.md +38 -0
  72. data/tracks/crystal/exercises/anagram/README.md +36 -0
  73. data/tracks/crystal/exercises/atbash-cipher/README.md +57 -0
  74. data/tracks/crystal/exercises/binary/README.md +58 -0
  75. data/tracks/crystal/exercises/binary-search-tree/README.md +83 -0
  76. data/tracks/crystal/exercises/bob/README.md +41 -0
  77. data/tracks/crystal/exercises/bracket-push/README.md +33 -0
  78. data/tracks/crystal/exercises/difference-of-squares/README.md +42 -0
  79. data/tracks/crystal/exercises/flatten-array/README.md +41 -0
  80. data/tracks/crystal/exercises/forth/README.md +52 -0
  81. data/tracks/crystal/exercises/gigasecond/README.md +34 -0
  82. data/tracks/crystal/exercises/hamming/README.md +65 -0
  83. data/tracks/crystal/exercises/hello-world/README.md +78 -0
  84. data/tracks/crystal/exercises/largest-series-product/README.md +43 -0
  85. data/tracks/crystal/exercises/leap/README.md +56 -0
  86. data/tracks/crystal/exercises/pangram/README.md +38 -0
  87. data/tracks/crystal/exercises/pascals-triangle/README.md +44 -0
  88. data/tracks/crystal/exercises/raindrops/README.md +47 -0
  89. data/tracks/crystal/exercises/react/README.md +42 -0
  90. data/tracks/crystal/exercises/rna-transcription/README.md +48 -0
  91. data/tracks/crystal/exercises/roman-numerals/README.md +72 -0
  92. data/tracks/crystal/exercises/run-length-encoding/README.md +53 -0
  93. data/tracks/crystal/exercises/sieve/README.md +57 -0
  94. data/tracks/csharp/config.json +0 -2
  95. data/tracks/delphi/config.json +0 -2
  96. data/tracks/ecmascript/config.json +63 -2
  97. data/tracks/erlang/{exercises/anagram/.meta/readme.go.tmpl → config/exercise_readme.go.tmpl} +0 -1
  98. data/tracks/erlang/config.json +0 -2
  99. data/tracks/erlang/exercises/accumulate/README.md +0 -1
  100. data/tracks/erlang/exercises/all-your-base/README.md +0 -1
  101. data/tracks/erlang/exercises/allergies/README.md +0 -1
  102. data/tracks/erlang/exercises/anagram/README.md +0 -1
  103. data/tracks/erlang/exercises/atbash-cipher/README.md +0 -1
  104. data/tracks/erlang/exercises/bank-account/README.md +0 -1
  105. data/tracks/erlang/exercises/beer-song/README.md +0 -1
  106. data/tracks/erlang/exercises/bob/README.md +0 -1
  107. data/tracks/erlang/exercises/circular-buffer/README.md +0 -1
  108. data/tracks/erlang/exercises/clock/README.md +0 -1
  109. data/tracks/erlang/exercises/collatz-conjecture/README.md +0 -1
  110. data/tracks/erlang/exercises/difference-of-squares/README.md +0 -1
  111. data/tracks/erlang/exercises/etl/README.md +0 -1
  112. data/tracks/erlang/exercises/gigasecond/README.md +0 -1
  113. data/tracks/erlang/exercises/grade-school/README.md +0 -1
  114. data/tracks/erlang/exercises/grains/README.md +0 -1
  115. data/tracks/erlang/exercises/hamming/README.md +0 -1
  116. data/tracks/erlang/exercises/hello-world/README.md +0 -1
  117. data/tracks/erlang/exercises/largest-series-product/README.md +0 -1
  118. data/tracks/erlang/exercises/leap/README.md +0 -1
  119. data/tracks/erlang/exercises/luhn/README.md +0 -1
  120. data/tracks/erlang/exercises/meetup/README.md +0 -1
  121. data/tracks/erlang/exercises/nucleotide-count/README.md +0 -1
  122. data/tracks/erlang/exercises/parallel-letter-frequency/README.md +0 -1
  123. data/tracks/erlang/exercises/phone-number/README.md +0 -1
  124. data/tracks/erlang/exercises/rna-transcription/README.md +0 -1
  125. data/tracks/erlang/exercises/robot-simulator/README.md +0 -1
  126. data/tracks/erlang/exercises/roman-numerals/README.md +0 -1
  127. data/tracks/erlang/exercises/rotational-cipher/README.md +0 -1
  128. data/tracks/erlang/exercises/scrabble-score/README.md +0 -1
  129. data/tracks/erlang/exercises/series/README.md +0 -1
  130. data/tracks/erlang/exercises/space-age/README.md +0 -1
  131. data/tracks/erlang/exercises/spiral-matrix/README.md +0 -1
  132. data/tracks/erlang/exercises/strain/README.md +0 -1
  133. data/tracks/erlang/exercises/sum-of-multiples/README.md +0 -1
  134. data/tracks/erlang/exercises/triangle/README.md +0 -1
  135. data/tracks/erlang/exercises/word-count/README.md +0 -1
  136. data/tracks/erlang/exercises/zipper/README.md +0 -1
  137. data/tracks/factor/config.json +0 -2
  138. data/tracks/fsharp/config.json +0 -2
  139. data/tracks/go/config.json +12 -6
  140. data/tracks/go/exercises/bank-account/bank_account_test.go +60 -1
  141. data/tracks/go/exercises/error-handling/common.go +17 -0
  142. data/tracks/go/exercises/error-handling/error_handling_test.go +37 -4
  143. data/tracks/haskell/config.json +0 -2
  144. data/tracks/java/config.json +10 -2
  145. data/tracks/{erlang/exercises/accumulate → java/exercises/forth}/.meta/readme.go.tmpl +0 -0
  146. data/tracks/java/exercises/forth/README.md +41 -0
  147. data/tracks/java/exercises/forth/build.gradle +18 -0
  148. data/tracks/java/exercises/forth/src/example/java/ForthEvaluator.java +154 -0
  149. data/tracks/java/exercises/forth/src/example/java/Token.java +90 -0
  150. data/tracks/java/exercises/forth/src/main/java/.keep +0 -0
  151. data/tracks/java/exercises/forth/src/test/java/ForthEvaluatorTest.java +355 -0
  152. data/tracks/java/exercises/settings.gradle +1 -0
  153. data/tracks/javascript/config.json +0 -2
  154. data/tracks/kotlin/config.json +30 -2
  155. data/tracks/kotlin/exercises/forth/README.md +32 -0
  156. data/tracks/kotlin/exercises/forth/build.gradle +28 -0
  157. data/tracks/kotlin/exercises/forth/src/example/kotlin/ForthEvaluator.kt +138 -0
  158. data/tracks/kotlin/exercises/forth/src/main/kotlin/.keep +0 -0
  159. data/tracks/kotlin/exercises/forth/src/test/kotlin/ForthEvaluatorTest.kt +352 -0
  160. data/tracks/kotlin/exercises/meetup/README.md +33 -0
  161. data/tracks/kotlin/exercises/meetup/build.gradle +28 -0
  162. data/tracks/kotlin/exercises/meetup/src/example/kotlin/Meetup.kt +45 -0
  163. data/tracks/kotlin/exercises/meetup/src/example/kotlin/MeetupSchedule.kt +1 -0
  164. data/tracks/kotlin/exercises/meetup/src/main/kotlin/MeetupSchedule.kt +5 -0
  165. data/tracks/kotlin/exercises/meetup/src/test/kotlin/MeetupTest.kt +771 -0
  166. data/tracks/kotlin/exercises/say/README.md +72 -0
  167. data/tracks/kotlin/exercises/say/build.gradle +28 -0
  168. data/tracks/kotlin/exercises/say/src/example/kotlin/NumberSpeller.kt +88 -0
  169. data/tracks/kotlin/exercises/say/src/main/kotlin/.keep +0 -0
  170. data/tracks/kotlin/exercises/say/src/test/kotlin/NumberSpellerTest.kt +138 -0
  171. data/tracks/kotlin/exercises/settings.gradle +3 -0
  172. data/tracks/lua/config.json +0 -2
  173. data/tracks/mips/config.json +0 -2
  174. data/tracks/ocaml/config.json +0 -2
  175. data/tracks/perl5/config.json +262 -67
  176. data/tracks/perl6/config.json +98 -26
  177. data/tracks/php/docs/INSTALLATION.md +1 -1
  178. data/tracks/powershell/config.json +0 -2
  179. data/tracks/purescript/config.json +0 -2
  180. data/tracks/python/README.md +2 -2
  181. data/tracks/python/config/exercise_readme.go.tmpl +16 -0
  182. data/tracks/python/config.json +280 -15
  183. data/tracks/python/exercises/accumulate/README.md +46 -0
  184. data/tracks/python/exercises/acronym/README.md +26 -0
  185. data/tracks/python/exercises/all-your-base/README.md +46 -0
  186. data/tracks/python/exercises/allergies/README.md +48 -0
  187. data/tracks/python/exercises/alphametics/README.md +46 -0
  188. data/tracks/python/exercises/anagram/README.md +24 -0
  189. data/tracks/python/exercises/atbash-cipher/README.md +45 -0
  190. data/tracks/python/exercises/beer-song/README.md +338 -0
  191. data/tracks/python/exercises/binary/README.md +46 -0
  192. data/tracks/python/exercises/binary-search/README.md +52 -0
  193. data/tracks/python/exercises/bob/README.md +29 -0
  194. data/tracks/python/exercises/book-store/README.md +85 -0
  195. data/tracks/python/exercises/bracket-push/README.md +21 -0
  196. data/tracks/python/exercises/circular-buffer/README.md +61 -0
  197. data/tracks/python/exercises/clock/README.md +24 -0
  198. data/tracks/python/exercises/crypto-square/README.md +85 -0
  199. data/tracks/python/exercises/diamond/README.md +70 -0
  200. data/tracks/python/exercises/difference-of-squares/README.md +30 -0
  201. data/tracks/python/exercises/etl/README.md +62 -0
  202. data/tracks/python/exercises/flatten-array/README.md +29 -0
  203. data/tracks/python/exercises/gigasecond/README.md +22 -0
  204. data/tracks/python/exercises/grade-school/README.md +53 -0
  205. data/tracks/python/exercises/grains/README.md +45 -0
  206. data/tracks/python/exercises/grep/README.md +82 -0
  207. data/tracks/python/exercises/hamming/README.md +53 -0
  208. data/tracks/python/exercises/hello-world/README.md +32 -0
  209. data/tracks/python/exercises/hexadecimal/README.md +25 -0
  210. data/tracks/python/exercises/house/README.md +124 -0
  211. data/tracks/python/exercises/isogram/README.md +30 -0
  212. data/tracks/python/exercises/kindergarten-garden/README.md +77 -0
  213. data/tracks/python/exercises/largest-series-product/README.md +31 -0
  214. data/tracks/python/exercises/leap/README.md +44 -0
  215. data/tracks/python/exercises/linked-list/README.md +45 -0
  216. data/tracks/python/exercises/list-ops/README.md +21 -0
  217. data/tracks/python/exercises/luhn/README.md +82 -0
  218. data/tracks/python/exercises/matrix/README.md +56 -0
  219. data/tracks/python/exercises/meetup/README.md +41 -0
  220. data/tracks/python/exercises/minesweeper/README.md +41 -0
  221. data/tracks/python/exercises/nth-prime/README.md +26 -0
  222. data/tracks/python/exercises/nucleotide-count/README.md +44 -0
  223. data/tracks/python/exercises/ocr-numbers/README.md +96 -0
  224. data/tracks/python/exercises/octal/README.md +60 -0
  225. data/tracks/python/exercises/palindrome-products/README.md +51 -0
  226. data/tracks/python/exercises/pangram/README.md +26 -0
  227. data/tracks/python/exercises/pascals-triangle/README.md +32 -0
  228. data/tracks/python/exercises/perfect-numbers/README.md +35 -0
  229. data/tracks/python/exercises/phone-number/README.md +45 -0
  230. data/tracks/python/exercises/pig-latin/README.md +35 -0
  231. data/tracks/python/exercises/point-mutations/README.md +52 -0
  232. data/tracks/python/exercises/poker/README.md +23 -0
  233. data/tracks/python/exercises/prime-factors/README.md +47 -0
  234. data/tracks/python/exercises/protein-translation/README.md +60 -0
  235. data/tracks/python/exercises/proverb/README.md +29 -0
  236. data/tracks/python/exercises/pythagorean-triplet/README.md +35 -0
  237. data/tracks/python/exercises/queen-attack/README.md +44 -0
  238. data/tracks/python/exercises/rail-fence-cipher/README.md +71 -0
  239. data/tracks/python/exercises/raindrops/README.md +35 -0
  240. data/tracks/python/exercises/rectangles/README.md +78 -0
  241. data/tracks/python/exercises/rna-transcription/README.md +36 -0
  242. data/tracks/python/exercises/robot-name/README.md +33 -0
  243. data/tracks/python/exercises/robot-simulator/README.md +45 -0
  244. data/tracks/python/exercises/roman-numerals/README.md +60 -0
  245. data/tracks/python/exercises/rotational-cipher/README.md +47 -0
  246. data/tracks/python/exercises/run-length-encoding/README.md +41 -0
  247. data/tracks/python/exercises/saddle-points/README.md +44 -0
  248. data/tracks/python/exercises/say/README.md +80 -0
  249. data/tracks/python/exercises/scale-generator/README.md +71 -0
  250. data/tracks/python/exercises/scrabble-score/README.md +55 -0
  251. data/tracks/python/exercises/secret-handshake/README.md +46 -0
  252. data/tracks/python/exercises/series/README.md +38 -0
  253. data/tracks/python/exercises/sieve/README.md +45 -0
  254. data/tracks/python/exercises/simple-cipher/README.md +101 -0
  255. data/tracks/python/exercises/space-age/README.md +35 -0
  256. data/tracks/python/exercises/strain/README.md +51 -0
  257. data/tracks/python/exercises/sublist/README.md +32 -0
  258. data/tracks/python/exercises/sum-of-multiples/README.md +29 -0
  259. data/tracks/python/exercises/tournament/README.md +79 -0
  260. data/tracks/python/exercises/transpose/README.md +76 -0
  261. data/tracks/python/exercises/triangle/README.md +37 -0
  262. data/tracks/python/exercises/trinary/README.md +39 -0
  263. data/tracks/python/exercises/twelve-days/README.md +46 -0
  264. data/tracks/python/exercises/variable-length-quantity/README.md +50 -0
  265. data/tracks/python/exercises/word-count/README.md +30 -0
  266. data/tracks/python/exercises/word-search/README.md +41 -0
  267. data/tracks/python/exercises/wordy/README.md +74 -0
  268. data/tracks/python/exercises/zebra-puzzle/README.md +43 -0
  269. data/tracks/python/test/check-exercises.py +2 -3
  270. data/tracks/r/config.json +0 -2
  271. data/tracks/ruby/.travis.yml +1 -1
  272. data/tracks/ruby/config/exercise_readme.go.tmpl +16 -0
  273. data/tracks/ruby/config.json +265 -4
  274. data/tracks/ruby/exercises/accumulate/README.md +76 -0
  275. data/tracks/ruby/exercises/acronym/README.md +41 -0
  276. data/tracks/ruby/exercises/all-your-base/README.md +61 -0
  277. data/tracks/ruby/exercises/allergies/README.md +63 -0
  278. data/tracks/ruby/exercises/alphametics/README.md +61 -0
  279. data/tracks/ruby/exercises/anagram/README.md +39 -0
  280. data/tracks/ruby/exercises/atbash-cipher/README.md +60 -0
  281. data/tracks/ruby/exercises/beer-song/README.md +353 -0
  282. data/tracks/ruby/exercises/binary/README.md +61 -0
  283. data/tracks/ruby/exercises/binary-search/README.md +67 -0
  284. data/tracks/ruby/exercises/binary-search-tree/README.md +86 -0
  285. data/tracks/ruby/exercises/bob/README.md +44 -0
  286. data/tracks/ruby/exercises/bowling/README.md +79 -0
  287. data/tracks/ruby/exercises/bracket-push/README.md +36 -0
  288. data/tracks/ruby/exercises/circular-buffer/README.md +76 -0
  289. data/tracks/ruby/exercises/clock/README.md +39 -0
  290. data/tracks/ruby/exercises/collatz-conjecture/README.md +59 -0
  291. data/tracks/ruby/exercises/connect/README.md +60 -0
  292. data/tracks/ruby/exercises/crypto-square/README.md +100 -0
  293. data/tracks/ruby/exercises/custom-set/README.md +37 -0
  294. data/tracks/ruby/exercises/diamond/README.md +85 -0
  295. data/tracks/ruby/exercises/difference-of-squares/README.md +45 -0
  296. data/tracks/ruby/exercises/dominoes/README.md +44 -0
  297. data/tracks/ruby/exercises/etl/README.md +77 -0
  298. data/tracks/ruby/exercises/flatten-array/README.md +44 -0
  299. data/tracks/ruby/exercises/food-chain/README.md +96 -0
  300. data/tracks/ruby/exercises/gigasecond/README.md +37 -0
  301. data/tracks/ruby/exercises/grade-school/README.md +68 -0
  302. data/tracks/ruby/exercises/grains/README.md +60 -0
  303. data/tracks/ruby/exercises/hamming/README.md +68 -0
  304. data/tracks/ruby/exercises/hello-world/README.md +47 -0
  305. data/tracks/ruby/exercises/hexadecimal/README.md +40 -0
  306. data/tracks/ruby/exercises/house/README.md +139 -0
  307. data/tracks/ruby/exercises/isogram/README.md +45 -0
  308. data/tracks/ruby/exercises/kindergarten-garden/README.md +92 -0
  309. data/tracks/ruby/exercises/largest-series-product/README.md +46 -0
  310. data/tracks/ruby/exercises/leap/README.md +59 -0
  311. data/tracks/ruby/exercises/linked-list/README.md +60 -0
  312. data/tracks/ruby/exercises/list-ops/README.md +36 -0
  313. data/tracks/ruby/exercises/luhn/README.md +97 -0
  314. data/tracks/ruby/exercises/matrix/README.md +71 -0
  315. data/tracks/ruby/exercises/meetup/README.md +56 -0
  316. data/tracks/ruby/exercises/minesweeper/README.md +56 -0
  317. data/tracks/ruby/exercises/nth-prime/README.md +41 -0
  318. data/tracks/ruby/exercises/nucleotide-count/README.md +59 -0
  319. data/tracks/ruby/exercises/ocr-numbers/README.md +111 -0
  320. data/tracks/ruby/exercises/octal/README.md +75 -0
  321. data/tracks/ruby/exercises/palindrome-products/README.md +66 -0
  322. data/tracks/ruby/exercises/pangram/README.md +41 -0
  323. data/tracks/ruby/exercises/pascals-triangle/README.md +47 -0
  324. data/tracks/ruby/exercises/perfect-numbers/README.md +50 -0
  325. data/tracks/ruby/exercises/phone-number/README.md +60 -0
  326. data/tracks/ruby/exercises/pig-latin/README.md +50 -0
  327. data/tracks/ruby/exercises/point-mutations/README.md +67 -0
  328. data/tracks/ruby/exercises/poker/README.md +38 -0
  329. data/tracks/ruby/exercises/prime-factors/README.md +62 -0
  330. data/tracks/ruby/exercises/protein-translation/README.md +75 -0
  331. data/tracks/ruby/exercises/proverb/README.md +44 -0
  332. data/tracks/ruby/exercises/pythagorean-triplet/README.md +50 -0
  333. data/tracks/ruby/exercises/queen-attack/README.md +59 -0
  334. data/tracks/ruby/exercises/rail-fence-cipher/README.md +86 -0
  335. data/tracks/ruby/exercises/raindrops/README.md +50 -0
  336. data/tracks/ruby/exercises/rna-transcription/README.md +51 -0
  337. data/tracks/ruby/exercises/robot-name/README.md +57 -0
  338. data/tracks/ruby/exercises/robot-simulator/README.md +60 -0
  339. data/tracks/ruby/exercises/roman-numerals/README.md +75 -0
  340. data/tracks/ruby/exercises/run-length-encoding/README.md +56 -0
  341. data/tracks/ruby/exercises/saddle-points/README.md +59 -0
  342. data/tracks/ruby/exercises/say/README.md +95 -0
  343. data/tracks/ruby/exercises/scale-generator/README.md +86 -0
  344. data/tracks/ruby/exercises/scrabble-score/README.md +70 -0
  345. data/tracks/ruby/exercises/secret-handshake/README.md +61 -0
  346. data/tracks/ruby/exercises/series/README.md +53 -0
  347. data/tracks/ruby/exercises/sieve/README.md +60 -0
  348. data/tracks/ruby/exercises/simple-cipher/README.md +116 -0
  349. data/tracks/ruby/exercises/simple-linked-list/README.md +54 -0
  350. data/tracks/ruby/exercises/space-age/README.md +50 -0
  351. data/tracks/ruby/exercises/strain/README.md +66 -0
  352. data/tracks/ruby/exercises/sum-of-multiples/README.md +44 -0
  353. data/tracks/ruby/exercises/tournament/README.md +94 -0
  354. data/tracks/ruby/exercises/transpose/README.md +91 -0
  355. data/tracks/ruby/exercises/triangle/README.md +52 -0
  356. data/tracks/ruby/exercises/trinary/README.md +54 -0
  357. data/tracks/ruby/exercises/twelve-days/README.md +61 -0
  358. data/tracks/ruby/exercises/two-bucket/README.md +62 -0
  359. data/tracks/ruby/exercises/word-count/README.md +45 -0
  360. data/tracks/ruby/exercises/wordy/README.md +89 -0
  361. data/tracks/rust/README.md +3 -3
  362. data/tracks/rust/_test/WINDOWS_README.md +44 -0
  363. data/tracks/rust/config.json +9 -2
  364. data/tracks/rust/exercises/pig-latin/Cargo-example.toml +8 -0
  365. data/tracks/rust/exercises/pig-latin/Cargo.lock +4 -0
  366. data/tracks/rust/exercises/pig-latin/Cargo.toml +6 -0
  367. data/tracks/rust/exercises/pig-latin/README.md +56 -0
  368. data/tracks/rust/exercises/pig-latin/example.rs +28 -0
  369. data/tracks/rust/exercises/pig-latin/tests/pig-latin.rs +120 -0
  370. data/tracks/rust/problem_ordering.md +2 -2
  371. data/tracks/sml/config.json +0 -2
  372. data/tracks/swift/config/exercise_readme.go.tmpl +16 -0
  373. data/tracks/swift/config.json +304 -79
  374. data/tracks/swift/exercises/accumulate/README.md +43 -0
  375. data/tracks/swift/exercises/acronym/README.md +23 -0
  376. data/tracks/swift/exercises/all-your-base/README.md +43 -0
  377. data/tracks/swift/exercises/allergies/README.md +45 -0
  378. data/tracks/swift/exercises/anagram/README.md +21 -0
  379. data/tracks/swift/exercises/atbash-cipher/README.md +42 -0
  380. data/tracks/swift/exercises/beer-song/README.md +335 -0
  381. data/tracks/swift/exercises/binary/README.md +43 -0
  382. data/tracks/swift/exercises/binary-search/README.md +49 -0
  383. data/tracks/swift/exercises/binary-search-tree/README.md +68 -0
  384. data/tracks/swift/exercises/bob/README.md +26 -0
  385. data/tracks/swift/exercises/bowling/README.md +61 -0
  386. data/tracks/swift/exercises/bracket-push/README.md +18 -0
  387. data/tracks/swift/exercises/clock/README.md +21 -0
  388. data/tracks/swift/exercises/crypto-square/README.md +82 -0
  389. data/tracks/swift/exercises/custom-set/README.md +19 -0
  390. data/tracks/swift/exercises/difference-of-squares/README.md +27 -0
  391. data/tracks/swift/exercises/dominoes/README.md +26 -0
  392. data/tracks/swift/exercises/etl/README.md +59 -0
  393. data/tracks/swift/exercises/flatten-array/README.md +26 -0
  394. data/tracks/swift/exercises/food-chain/README.md +78 -0
  395. data/tracks/swift/exercises/gigasecond/README.md +19 -0
  396. data/tracks/swift/exercises/grade-school/README.md +50 -0
  397. data/tracks/swift/exercises/grains/README.md +42 -0
  398. data/tracks/swift/exercises/hamming/README.md +50 -0
  399. data/tracks/swift/exercises/hello-world/README.md +29 -0
  400. data/tracks/swift/exercises/hexadecimal/README.md +22 -0
  401. data/tracks/swift/exercises/house/README.md +121 -0
  402. data/tracks/swift/exercises/isogram/README.md +27 -0
  403. data/tracks/swift/exercises/kindergarten-garden/README.md +74 -0
  404. data/tracks/swift/exercises/largest-series-product/README.md +28 -0
  405. data/tracks/swift/exercises/leap/README.md +41 -0
  406. data/tracks/swift/exercises/linked-list/README.md +42 -0
  407. data/tracks/swift/exercises/luhn/README.md +79 -0
  408. data/tracks/swift/exercises/matrix/README.md +53 -0
  409. data/tracks/swift/exercises/meetup/README.md +38 -0
  410. data/tracks/swift/exercises/minesweeper/README.md +38 -0
  411. data/tracks/swift/exercises/nth-prime/README.md +23 -0
  412. data/tracks/swift/exercises/nucleotide-count/README.md +41 -0
  413. data/tracks/swift/exercises/ocr-numbers/README.md +93 -0
  414. data/tracks/swift/exercises/octal/README.md +57 -0
  415. data/tracks/swift/exercises/palindrome-products/README.md +48 -0
  416. data/tracks/swift/exercises/pangram/README.md +23 -0
  417. data/tracks/swift/exercises/pascals-triangle/README.md +29 -0
  418. data/tracks/swift/exercises/perfect-numbers/README.md +32 -0
  419. data/tracks/swift/exercises/phone-number/README.md +42 -0
  420. data/tracks/swift/exercises/pig-latin/README.md +32 -0
  421. data/tracks/swift/exercises/poker/README.md +20 -0
  422. data/tracks/swift/exercises/prime-factors/README.md +44 -0
  423. data/tracks/swift/exercises/pythagorean-triplet/README.md +32 -0
  424. data/tracks/swift/exercises/queen-attack/README.md +41 -0
  425. data/tracks/swift/exercises/raindrops/README.md +32 -0
  426. data/tracks/swift/exercises/rna-transcription/README.md +33 -0
  427. data/tracks/swift/exercises/robot-name/README.md +30 -0
  428. data/tracks/swift/exercises/robot-simulator/README.md +42 -0
  429. data/tracks/swift/exercises/roman-numerals/README.md +57 -0
  430. data/tracks/swift/exercises/run-length-encoding/README.md +38 -0
  431. data/tracks/swift/exercises/saddle-points/README.md +41 -0
  432. data/tracks/swift/exercises/scrabble-score/README.md +52 -0
  433. data/tracks/swift/exercises/secret-handshake/README.md +43 -0
  434. data/tracks/swift/exercises/series/README.md +35 -0
  435. data/tracks/swift/exercises/sieve/README.md +42 -0
  436. data/tracks/swift/exercises/simple-cipher/README.md +98 -0
  437. data/tracks/swift/exercises/simple-linked-list/README.md +36 -0
  438. data/tracks/swift/exercises/space-age/README.md +32 -0
  439. data/tracks/swift/exercises/strain/README.md +48 -0
  440. data/tracks/swift/exercises/sublist/README.md +29 -0
  441. data/tracks/swift/exercises/sum-of-multiples/README.md +26 -0
  442. data/tracks/swift/exercises/tournament/README.md +76 -0
  443. data/tracks/swift/exercises/transpose/README.md +73 -0
  444. data/tracks/swift/exercises/triangle/README.md +34 -0
  445. data/tracks/swift/exercises/trinary/README.md +36 -0
  446. data/tracks/swift/exercises/twelve-days/README.md +43 -0
  447. data/tracks/swift/exercises/word-count/README.md +27 -0
  448. data/tracks/swift/exercises/wordy/README.md +71 -0
  449. data/tracks/typescript/README.md +1 -1
  450. data/tracks/typescript/config.json +63 -3
  451. data/tracks/vimscript/config.json +0 -2
  452. metadata +371 -40
  453. data/tracks/erlang/exercises/atbash-cipher/.meta/readme.go.tmpl +0 -17
  454. data/tracks/erlang/exercises/bank-account/.meta/readme.go.tmpl +0 -17
  455. data/tracks/erlang/exercises/beer-song/.meta/readme.go.tmpl +0 -17
  456. data/tracks/erlang/exercises/bob/.meta/readme.go.tmpl +0 -17
  457. data/tracks/erlang/exercises/circular-buffer/.meta/readme.go.tmpl +0 -17
  458. data/tracks/erlang/exercises/clock/.meta/readme.go.tmpl +0 -17
  459. data/tracks/erlang/exercises/collatz-conjecture/.meta/readme.go.tmpl +0 -17
  460. data/tracks/erlang/exercises/difference-of-squares/.meta/readme.go.tmpl +0 -17
  461. data/tracks/erlang/exercises/etl/.meta/readme.go.tmpl +0 -17
  462. data/tracks/erlang/exercises/gigasecond/.meta/readme.go.tmpl +0 -17
  463. data/tracks/erlang/exercises/grade-school/.meta/readme.go.tmpl +0 -17
  464. data/tracks/erlang/exercises/grains/.meta/readme.go.tmpl +0 -17
  465. data/tracks/erlang/exercises/hamming/.meta/readme.go.tmpl +0 -17
  466. data/tracks/erlang/exercises/hello-world/.meta/readme.go.tmpl +0 -17
  467. data/tracks/erlang/exercises/largest-series-product/.meta/readme.go.tmpl +0 -17
  468. data/tracks/erlang/exercises/leap/.meta/readme.go.tmpl +0 -17
  469. data/tracks/erlang/exercises/luhn/.meta/readme.go.tmpl +0 -17
  470. data/tracks/erlang/exercises/meetup/.meta/readme.go.tmpl +0 -17
  471. data/tracks/erlang/exercises/nucleotide-count/.meta/readme.go.tmpl +0 -17
  472. data/tracks/erlang/exercises/parallel-letter-frequency/.meta/readme.go.tmpl +0 -17
  473. data/tracks/erlang/exercises/phone-number/.meta/readme.go.tmpl +0 -17
  474. data/tracks/erlang/exercises/rna-transcription/.meta/readme.go.tmpl +0 -17
  475. data/tracks/erlang/exercises/robot-simulator/.meta/readme.go.tmpl +0 -17
  476. data/tracks/erlang/exercises/roman-numerals/.meta/readme.go.tmpl +0 -17
  477. data/tracks/erlang/exercises/rotational-cipher/.meta/readme.go.tmpl +0 -17
  478. data/tracks/erlang/exercises/scrabble-score/.meta/readme.go.tmpl +0 -17
  479. data/tracks/erlang/exercises/series/.meta/readme.go.tmpl +0 -17
  480. data/tracks/erlang/exercises/space-age/.meta/readme.go.tmpl +0 -17
  481. data/tracks/erlang/exercises/spiral-matrix/.meta/readme.go.tmpl +0 -17
  482. data/tracks/erlang/exercises/strain/.meta/readme.go.tmpl +0 -17
  483. data/tracks/erlang/exercises/sum-of-multiples/.meta/readme.go.tmpl +0 -17
  484. data/tracks/erlang/exercises/triangle/.meta/readme.go.tmpl +0 -17
  485. data/tracks/erlang/exercises/word-count/.meta/readme.go.tmpl +0 -17
  486. data/tracks/erlang/exercises/zipper/.meta/readme.go.tmpl +0 -17
@@ -65,4 +65,3 @@ Partially inspired by Chapter 1 in Chris Pine's online Learn to Program tutorial
65
65
 
66
66
  ## Submitting Incomplete Solutions
67
67
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
68
-
@@ -71,4 +71,3 @@ Reddit r/dailyprogrammer challenge #320 [Easy] Spiral Ascension. [https://www.re
71
71
 
72
72
  ## Submitting Incomplete Solutions
73
73
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
74
-
@@ -81,4 +81,3 @@ Conversation with James Edward Gray II [https://twitter.com/jeg2](https://twitte
81
81
 
82
82
  ## Submitting Incomplete Solutions
83
83
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
84
-
@@ -59,4 +59,3 @@ A variation on Problem 1 at Project Euler [http://projecteuler.net/problem=1](ht
59
59
 
60
60
  ## Submitting Incomplete Solutions
61
61
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
62
-
@@ -67,4 +67,3 @@ The Ruby Koans triangle project, parts 1 & 2 [http://rubykoans.com](http://rubyk
67
67
 
68
68
  ## Submitting Incomplete Solutions
69
69
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
70
-
@@ -60,4 +60,3 @@ This is a classic toy problem, but we were reminded of it by seeing it in the Go
60
60
 
61
61
  ## Submitting Incomplete Solutions
62
62
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
63
-
@@ -72,4 +72,3 @@ environment expected by the exercises.
72
72
 
73
73
  ## Submitting Incomplete Solutions
74
74
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
75
-
@@ -1,7 +1,5 @@
1
1
  {
2
- "slug": "factor",
3
2
  "language": "Factor",
4
- "repository": "https://github.com/exercism/factor",
5
3
  "active": false,
6
4
  "test_pattern": "TODO",
7
5
  "exercises": [
@@ -1,7 +1,5 @@
1
1
  {
2
- "slug": "fsharp",
3
2
  "language": "F#",
4
- "repository": "https://github.com/exercism/fsharp",
5
3
  "active": true,
6
4
  "exercises": [
7
5
  {
@@ -320,9 +320,10 @@
320
320
  "slug": "bank-account",
321
321
  "core": false,
322
322
  "unlocked_by": null,
323
- "difficulty": 1,
323
+ "difficulty": 4,
324
324
  "topics": [
325
-
325
+ "Concurrency",
326
+ "Integers"
326
327
  ]
327
328
  },
328
329
  {
@@ -330,9 +331,12 @@
330
331
  "slug": "crypto-square",
331
332
  "core": false,
332
333
  "unlocked_by": null,
333
- "difficulty": 1,
334
+ "difficulty": 3,
334
335
  "topics": [
335
-
336
+ "Filtering",
337
+ "Strings",
338
+ "Text Formatting",
339
+ "Transforming"
336
340
  ]
337
341
  },
338
342
  {
@@ -340,9 +344,11 @@
340
344
  "slug": "luhn",
341
345
  "core": false,
342
346
  "unlocked_by": null,
343
- "difficulty": 1,
347
+ "difficulty": 2,
344
348
  "topics": [
345
-
349
+ "Algorithms",
350
+ "Integers",
351
+ "Strings"
346
352
  ]
347
353
  },
348
354
  {
@@ -6,10 +6,24 @@
6
6
  // (Account) Deposit(amount int64) (newBalance int64, ok bool)
7
7
  //
8
8
  // If Open is given a negative initial deposit, it must return nil.
9
- // Deposit must handle a negative amount as a withdrawal.
9
+ // Deposit must handle a negative amount as a withdrawal. Withdrawals must
10
+ // not succeed if they result in a negative balance.
10
11
  // If any Account method is called on an closed account, it must not modify
11
12
  // the account and must return ok = false.
12
13
 
14
+ // The tests will execute some operations concurrently. You should strive
15
+ // to ensure that operations on the Account leave it in a consistent state.
16
+ // For example: multiple goroutines may be depositing and withdrawing money
17
+ // simultaneously, two withdrawals occurring concurrently should not be able
18
+ // to bring the balance into the negative.
19
+
20
+ // If you are new to concurrent operations in Go it will be worth looking
21
+ // at the sync package, specifically Mutexes:
22
+ //
23
+ // https://golang.org/pkg/sync/
24
+ // https://tour.golang.org/concurrency/9
25
+ // https://gobyexample.com/mutexes
26
+
13
27
  package account
14
28
 
15
29
  import (
@@ -295,3 +309,48 @@ func TestConcDeposit(t *testing.T) {
295
309
  "a.Balance = %d, %t. Want 0, true", p, ok)
296
310
  }
297
311
  }
312
+
313
+ // The benchmark operations are here to encourage you to try different
314
+ // implementations to see which ones perform better. These are worth
315
+ // exploring after the tests pass.
316
+ //
317
+ // There is a basic benchmark and a parallelized version of the same
318
+ // benchmark. You run the benchmark using:
319
+ // go test --bench=.
320
+ //
321
+ // The output will look something like this:
322
+ // goos: linux
323
+ // goarch: amd64
324
+ // BenchmarkAccountOperations-8 10000000 130 ns/op
325
+ // BenchmarkAccountOperationsParallel-8 3000000 488 ns/op
326
+ // PASS
327
+ //
328
+ // You will notice that parallelism does not increase speed in this case, in
329
+ // fact it makes things slower! This is because none of the operations in our
330
+ // Account benefit from parallel processing. We are specifically protecting
331
+ // the account balance internals from being accessed by multiple processes
332
+ // simultaneously. Your protections will make the parallel processing slower
333
+ // because there is some overhead in managing the processes and protections.
334
+ //
335
+ // The interesting thing to try here is to experiment with the protections
336
+ // and see how their implementation changes the results of the parallel
337
+ // benchmark.
338
+ func BenchmarkAccountOperations(b *testing.B) {
339
+ a := Open(0)
340
+ defer a.Close()
341
+ for n := 0; n < b.N; n++ {
342
+ a.Deposit(10)
343
+ a.Deposit(-10)
344
+ }
345
+ }
346
+
347
+ func BenchmarkAccountOperationsParallel(b *testing.B) {
348
+ a := Open(0)
349
+ defer a.Close()
350
+ b.RunParallel(func(pb *testing.PB) {
351
+ for pb.Next() {
352
+ a.Deposit(10)
353
+ a.Deposit(-10)
354
+ }
355
+ })
356
+ }
@@ -2,6 +2,16 @@ package erratum
2
2
 
3
3
  import "io"
4
4
 
5
+ // These are the support types and interface definitions used in the
6
+ // implementation if your Use function. See the test suite file at
7
+ // for information on the expected implementation.
8
+ //
9
+ // Because this is part of the package "erratum", if your solution file
10
+ // is also declared in the package you will automatically have access to
11
+ // these definitions (you do not have to re-declare them).
12
+
13
+ // TransientError is an error that may occur while opening a resource via
14
+ // ResourceOpener.
5
15
  type TransientError struct {
6
16
  err error
7
17
  }
@@ -10,6 +20,10 @@ func (e TransientError) Error() string {
10
20
  return e.err.Error()
11
21
  }
12
22
 
23
+ // FrobError is a possible error from doing some frobbing, your implementation
24
+ // will require calling your Resource's Defrob(string) method.
25
+ // When this error occurs, the FrobError's defrobTag string will contain the
26
+ // string you must pass into Defrob.
13
27
  type FrobError struct {
14
28
  defrobTag string
15
29
  inner error
@@ -20,6 +34,9 @@ func (e FrobError) Error() string {
20
34
  }
21
35
 
22
36
  type Resource interface {
37
+
38
+ // Resource is using composition to inherit the requirements of the io.Closer
39
+ // interface. What this means is that a Resource will have a .Close() method.
23
40
  io.Closer
24
41
 
25
42
  // Frob does something with the input string.
@@ -5,10 +5,43 @@ import (
5
5
  "testing"
6
6
  )
7
7
 
8
- // Define a function `Use(o ResourceOpener, input string) error` that
9
- // opens a resource, calls Frob(input) and closes the resource
10
- // (in all cases). The function should properly handle errors,
11
- // as defined by the expectations of this test suite.
8
+ // Because this exercise is generally unique to each language and how it
9
+ // handles errors, most of the definition of your expected solution is provided
10
+ // here instead of the README.
11
+ // You should read this carefully (more than once) before implementation.
12
+
13
+ // Define a function `Use(o ResourceOpener, input string) error` that opens a
14
+ // resource, calls Frob(input) and closes the resource (in all cases). Your
15
+ // function should properly handle errors, as defined by the expectations of
16
+ // this test suite. ResourceOpener will be a function you may invoke directly
17
+ // `o()` in an attempt to "open" the resource. It returns a Resource and error
18
+ // value in the idiomatic Go fashion:
19
+ // https://blog.golang.org/error-handling-and-go
20
+ //
21
+ // See the ./common.go file for the definitions of Resource, ResourceOpener,
22
+ // FrobError and TransientError.
23
+ //
24
+ // There will be a few places in your Use function where errors may occur:
25
+ //
26
+ // - Invoking the ResourceOpener function passed into Use as the first
27
+ // parameter, it may fail with a TransientError, if so keep trying to open it.
28
+ // If it is some other sort of error, return it.
29
+ //
30
+ // - Calling the Frob function on the Resource returned from the ResourceOpener
31
+ // function, it may panic with a FrobError (or another type of error). If
32
+ // it is indeed a FrobError you will have to call the Resource's Defrob
33
+ // function using the FrobError's defrobTag variable as input. Either way
34
+ // return the error.
35
+ //
36
+ // Also note: if the Resource was opened successfully make sure to call its
37
+ // Close function no matter what (even if errors occur).
38
+ //
39
+ // If you are new to Go errors or panics here is a good place to start:
40
+ // https://blog.golang.org/defer-panic-and-recover
41
+ //
42
+ // You may also need to look at named return values as a helpful way to
43
+ // return error information from panic recovery:
44
+ // https://tour.golang.org/basics/7
12
45
 
13
46
  const targetTestVersion = 2
14
47
 
@@ -1,7 +1,5 @@
1
1
  {
2
- "slug": "haskell",
3
2
  "language": "Haskell",
4
- "repository": "https://github.com/exercism/haskell",
5
3
  "active": true,
6
4
  "exercises": [
7
5
  {
@@ -1,7 +1,5 @@
1
1
  {
2
- "slug": "java",
3
2
  "language": "Java",
4
- "repository": "https://github.com/exercism/java",
5
3
  "active": true,
6
4
  "exercises": [
7
5
  {
@@ -768,6 +766,16 @@
768
766
 
769
767
  ]
770
768
  },
769
+ {
770
+ "uuid": "f0c0316d-3fb5-455e-952a-91161e7fb298",
771
+ "slug": "forth",
772
+ "core": false,
773
+ "unlocked_by": null,
774
+ "difficulty": 9,
775
+ "topics": [
776
+
777
+ ]
778
+ },
771
779
  {
772
780
  "uuid": "377fe38b-08ad-4f3a-8118-a43c10f7b9b2",
773
781
  "slug": "custom-set",
@@ -0,0 +1,41 @@
1
+ # Forth
2
+
3
+ Implement an evaluator for a very simple subset of Forth.
4
+
5
+ [Forth](https://en.wikipedia.org/wiki/Forth_%28programming_language%29)
6
+ is a stack-based programming language. Implement a very basic evaluator
7
+ for a small subset of Forth.
8
+
9
+ Your evaluator has to support the following words:
10
+
11
+ - `+`, `-`, `*`, `/` (integer arithmetic)
12
+ - `DUP`, `DROP`, `SWAP`, `OVER` (stack manipulation)
13
+
14
+ Your evaluator also has to support defining new words using the
15
+ customary syntax: `: word-name definition ;`.
16
+
17
+ To keep things simple the only data type you need to support is signed
18
+ integers of at least 16 bits size.
19
+
20
+ You should use the following rules for the syntax: a number is a
21
+ sequence of one or more (ASCII) digits, a word is a sequence of one or
22
+ more letters, digits, symbols or punctuation that is not a number.
23
+ (Forth probably uses slightly different rules, but this is close
24
+ enough.)
25
+
26
+ Words are case-insensitive.
27
+
28
+
29
+ To run the tests:
30
+
31
+ ```sh
32
+ $ gradle test
33
+ ```
34
+
35
+ For more detailed info about the Java track see the [help page](http://exercism.io/languages/java).
36
+
37
+
38
+
39
+ ## Submitting Incomplete Solutions
40
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
41
+
@@ -0,0 +1,18 @@
1
+ apply plugin: "java"
2
+ apply plugin: "eclipse"
3
+ apply plugin: "idea"
4
+
5
+ repositories {
6
+ mavenCentral()
7
+ }
8
+
9
+ dependencies {
10
+ testCompile "junit:junit:4.12"
11
+ }
12
+
13
+ test {
14
+ testLogging {
15
+ exceptionFormat = 'full'
16
+ events = ["passed", "failed", "skipped"]
17
+ }
18
+ }
@@ -0,0 +1,154 @@
1
+ import java.util.*;
2
+ import java.util.function.UnaryOperator;
3
+
4
+ class ForthEvaluator {
5
+
6
+ private static final Map<String, UnaryOperator<Deque<Integer>>> BUILT_IN_OPS
7
+ = new HashMap<String, UnaryOperator<Deque<Integer>>>() {{
8
+
9
+ put("+", values -> {
10
+ if (values.size() < 2) {
11
+ throw new IllegalArgumentException(
12
+ "Addition requires that the stack contain at least 2 values");
13
+ }
14
+
15
+ values.push(values.pop() + values.pop());
16
+ return values;
17
+ });
18
+
19
+ put("-", values -> {
20
+ if (values.size() < 2) {
21
+ throw new IllegalArgumentException(
22
+ "Subtraction requires that the stack contain at least 2 values");
23
+ }
24
+
25
+ int topValue = values.pop();
26
+ int secondValue = values.pop();
27
+
28
+ values.push(secondValue - topValue);
29
+ return values;
30
+ });
31
+
32
+ put("*", values -> {
33
+ if (values.size() < 2) {
34
+ throw new IllegalArgumentException(
35
+ "Multiplication requires that the stack contain at least 2 values");
36
+ }
37
+
38
+ values.push(values.pop() * values.pop());
39
+ return values;
40
+ });
41
+
42
+ put("/", values -> {
43
+ if (values.size() < 2) {
44
+ throw new IllegalArgumentException(
45
+ "Division requires that the stack contain at least 2 values");
46
+ }
47
+
48
+ int topValue = values.pop();
49
+ int secondValue = values.pop();
50
+
51
+ if (topValue == 0) {
52
+ throw new IllegalArgumentException("Division by 0 is not allowed");
53
+ }
54
+
55
+ values.push(secondValue / topValue);
56
+ return values;
57
+ });
58
+
59
+ put("dup", values -> {
60
+ if (values.isEmpty()) {
61
+ throw new IllegalArgumentException(
62
+ "Duplicating requires that the stack contain at least 1 value");
63
+ }
64
+
65
+ values.push(values.peek());
66
+ return values;
67
+ });
68
+
69
+ put("drop", values -> {
70
+ if (values.isEmpty()) {
71
+ throw new IllegalArgumentException(
72
+ "Dropping requires that the stack contain at least 1 value");
73
+ }
74
+
75
+ values.pop();
76
+ return values;
77
+ });
78
+
79
+ put("swap", values -> {
80
+ if (values.size() < 2) {
81
+ throw new IllegalArgumentException(
82
+ "Swapping requires that the stack contain at least 2 values");
83
+ }
84
+
85
+ int topValue = values.pop();
86
+ int secondValue = values.pop();
87
+ values.push(topValue);
88
+ values.push(secondValue);
89
+ return values;
90
+ });
91
+
92
+ put("over", values -> {
93
+ if (values.size() < 2) {
94
+ throw new IllegalArgumentException(
95
+ "Overing requires that the stack contain at least 2 values");
96
+ }
97
+
98
+ int topValue = values.pop();
99
+ int secondValue = values.peek();
100
+ values.push(topValue);
101
+ values.push(secondValue);
102
+ return values;
103
+ });
104
+ }};
105
+
106
+ private Deque<Integer> values = new ArrayDeque<>();
107
+
108
+ private List<Token> tokens = new ArrayList<>();
109
+
110
+ private Map<String, List<Token>> userOps = new HashMap<>();
111
+
112
+ List<Integer> evaluateProgram(final List<String> program) {
113
+ parse(program);
114
+ evaluate();
115
+
116
+ final List<Integer> result = new ArrayList<>(values);
117
+ Collections.reverse(result);
118
+ return result;
119
+ }
120
+
121
+ private void parse(final List<String> program) {
122
+ program.forEach(string -> tokens.addAll(Token.fromString(string)));
123
+ }
124
+
125
+ private void evaluate() {
126
+ while (!tokens.isEmpty()) {
127
+ final Token token = tokens.remove(0);
128
+
129
+ if (token instanceof Token.OpDefToken) {
130
+ final Token.OpDefToken opDefToken = (Token.OpDefToken) token;
131
+ userOps.put(opDefToken.getNewOp().toLowerCase(), opDefToken.getNewOpDefTokens());
132
+ } else if (token instanceof Token.OpToken) {
133
+ evaluateOpToken((Token.OpToken) token);
134
+ } else if (token instanceof Token.IntToken) {
135
+ values.push(((Token.IntToken) token).getRawValue());
136
+ }
137
+ }
138
+ }
139
+
140
+ private void evaluateOpToken(final Token.OpToken opToken) {
141
+ final String op = opToken.getOp();
142
+
143
+ if (userOps.containsKey(op)) {
144
+ final List<Token> replacementOps = userOps.get(op);
145
+ Collections.reverse(replacementOps);
146
+ replacementOps.forEach(token -> tokens.add(0, token));
147
+ } else if (BUILT_IN_OPS.containsKey(op)) {
148
+ values = BUILT_IN_OPS.get(op).apply(values);
149
+ } else {
150
+ throw new IllegalArgumentException("No definition available for operator \"" + op + "\"");
151
+ }
152
+ }
153
+
154
+ }
@@ -0,0 +1,90 @@
1
+ import java.util.Arrays;
2
+ import java.util.Collections;
3
+ import java.util.List;
4
+ import java.util.stream.Collectors;
5
+
6
+ class Token {
7
+
8
+ static class OpDefToken extends Token {
9
+
10
+ static OpDefToken opDefTokenFromString(final String string) {
11
+ final String trimmedLine = string.substring(2, string.length() - 2);
12
+ final int newOpEnd = trimmedLine.indexOf(" ");
13
+
14
+ if (newOpEnd == -1) {
15
+ throw new IllegalArgumentException("Incomplete operation definition");
16
+ }
17
+
18
+ final Token newOpToken = Token.fromString(trimmedLine.substring(0, newOpEnd)).get(0);
19
+
20
+ if (!(newOpToken instanceof OpToken)) {
21
+ throw new IllegalArgumentException("Cannot redefine numbers");
22
+ }
23
+
24
+ final List<Token> newOpDefTokens = Token.fromString(trimmedLine.substring(newOpEnd + 1));
25
+ return new OpDefToken(((OpToken) newOpToken).getOp(), newOpDefTokens);
26
+ }
27
+
28
+ private final String newOp;
29
+
30
+ private final List<Token> newOpDefTokens;
31
+
32
+ private OpDefToken(final String newOp, final List<Token> newOpDefTokens) {
33
+ this.newOp = newOp;
34
+ this.newOpDefTokens = newOpDefTokens;
35
+ }
36
+
37
+ String getNewOp() {
38
+ return newOp;
39
+ }
40
+
41
+ List<Token> getNewOpDefTokens() {
42
+ return newOpDefTokens;
43
+ }
44
+
45
+ }
46
+
47
+ static class OpToken extends Token {
48
+
49
+ private final String op;
50
+
51
+ OpToken(final String op) {
52
+ this.op = op;
53
+ }
54
+
55
+ String getOp() {
56
+ return op;
57
+ }
58
+
59
+ }
60
+
61
+ static class IntToken extends Token {
62
+
63
+ private final int rawValue;
64
+
65
+ IntToken(final int rawValue) {
66
+ this.rawValue = rawValue;
67
+ }
68
+
69
+ int getRawValue() {
70
+ return rawValue;
71
+ }
72
+
73
+ }
74
+
75
+ static List<Token> fromString(final String string) {
76
+ if (string.startsWith(":")) {
77
+ return Collections.singletonList(OpDefToken.opDefTokenFromString(string));
78
+ } else if (string.matches("[A-z+/*\\-]+(?:-[A-z+/*\\-]+)*")) {
79
+ return Collections.singletonList(new OpToken(string.toLowerCase()));
80
+ } else if (string.matches("\\d+")) {
81
+ return Collections.singletonList(new IntToken(Integer.parseInt(string)));
82
+ } else {
83
+ return Arrays.stream(string.split(" "))
84
+ .map(Token::fromString)
85
+ .flatMap(List::stream)
86
+ .collect(Collectors.toList());
87
+ }
88
+ }
89
+
90
+ }
File without changes