trackler 2.2.0.4 → 2.2.0.5

Sign up to get free protection for your applications and to get access to all the features.
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