trackler 2.2.1.47 → 2.2.1.48

Sign up to get free protection for your applications and to get access to all the features.
Files changed (277) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/pangram/canonical-data.json +3 -3
  4. data/tracks/common-lisp/.travis.yml +2 -9
  5. data/tracks/common-lisp/docs/TESTS.md +43 -9
  6. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +2 -2
  7. data/tracks/elixir/.travis.yml +4 -7
  8. data/tracks/elixir/README.md +2 -6
  9. data/tracks/elixir/bin/dialyzer_check.sh +2 -13
  10. data/tracks/elixir/exercises/allergies/example.exs +3 -2
  11. data/tracks/elixir/exercises/atbash-cipher/example.exs +5 -5
  12. data/tracks/elixir/exercises/bank-account/example.exs +11 -11
  13. data/tracks/elixir/exercises/bob/example.exs +4 -4
  14. data/tracks/elixir/exercises/forth/example.exs +66 -48
  15. data/tracks/elixir/exercises/minesweeper/example.exs +31 -18
  16. data/tracks/elixir/exercises/pangram/example.exs +4 -4
  17. data/tracks/elixir/exercises/queen-attack/queen_attack_test.exs +68 -53
  18. data/tracks/elixir/exercises/say/example.exs +33 -31
  19. data/tracks/elixir/exercises/scrabble-score/example.exs +12 -11
  20. data/tracks/elixir/mix.exs +10 -7
  21. data/tracks/elixir/mix.lock +4 -1
  22. data/tracks/erlang/README.md +2 -0
  23. data/tracks/fsharp/exercises/nth-prime/Example.fs +4 -1
  24. data/tracks/fsharp/exercises/nth-prime/NthPrime.fs +1 -1
  25. data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +12 -32
  26. data/tracks/fsharp/exercises/pangram/PangramTest.fs +3 -3
  27. data/tracks/fsharp/exercises/perfect-numbers/Example.fs +9 -6
  28. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fs +1 -1
  29. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbersTest.fs +55 -21
  30. data/tracks/fsharp/generators/Generators.fs +18 -0
  31. data/tracks/gnu-apl/config.json +21 -0
  32. data/tracks/gnu-apl/exercises/hamming/README.md +42 -0
  33. data/tracks/gnu-apl/exercises/hamming/hamming-example.apl +5 -0
  34. data/tracks/gnu-apl/exercises/hamming/hamming.tc +75 -0
  35. data/tracks/gnu-apl/exercises/hello-world/README.md +17 -1
  36. data/tracks/gnu-apl/exercises/leap/README.md +33 -0
  37. data/tracks/gnu-apl/exercises/raindrops/README.md +24 -0
  38. data/tracks/gnu-apl/exercises/raindrops/raindrops-example.apl +8 -0
  39. data/tracks/gnu-apl/exercises/raindrops/raindrops.tc +60 -0
  40. data/tracks/gnu-apl/exercises/rna-transcription/README.md +25 -0
  41. data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription-example.apl +7 -0
  42. data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription.tc +41 -0
  43. data/tracks/gnu-apl/test.apl +13 -0
  44. data/tracks/haskell/config.json +9 -0
  45. data/tracks/haskell/exercises/rotational-cipher/README.md +91 -0
  46. data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/package.yaml +16 -0
  47. data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/src/RotationalCipher.hs +9 -0
  48. data/tracks/haskell/exercises/rotational-cipher/package.yaml +20 -0
  49. data/tracks/haskell/exercises/rotational-cipher/src/RotationalCipher.hs +4 -0
  50. data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -0
  51. data/tracks/haskell/exercises/rotational-cipher/test/Tests.hs +77 -0
  52. data/tracks/java/config.json +23 -14
  53. data/tracks/java/config/exercise-readme-insert.md +3 -3
  54. data/tracks/java/config/exercise_readme.go.tmpl +3 -0
  55. data/tracks/java/exercises/accumulate/README.md +4 -3
  56. data/tracks/java/exercises/acronym/.meta/{.version → version} +0 -0
  57. data/tracks/java/exercises/acronym/README.md +4 -3
  58. data/tracks/java/exercises/all-your-base/.meta/{.version → version} +0 -0
  59. data/tracks/java/exercises/all-your-base/README.md +4 -3
  60. data/tracks/java/exercises/allergies/README.md +4 -3
  61. data/tracks/java/exercises/anagram/README.md +4 -3
  62. data/tracks/java/exercises/atbash-cipher/README.md +4 -3
  63. data/tracks/java/exercises/bank-account/README.md +6 -3
  64. data/tracks/java/exercises/beer-song/README.md +4 -3
  65. data/tracks/java/exercises/binary-search-tree/.meta/src/reference/java/BinarySearchTree.java +38 -44
  66. data/tracks/java/exercises/binary-search-tree/README.md +4 -3
  67. data/tracks/java/exercises/binary-search-tree/src/main/java/BinarySearchTree.java +35 -0
  68. data/tracks/java/exercises/binary-search-tree/src/test/java/BinarySearchTreeTest.java +46 -40
  69. data/tracks/java/exercises/binary-search/.meta/hints.md +25 -0
  70. data/tracks/java/exercises/binary-search/.meta/src/reference/java/BinarySearch.java +3 -7
  71. data/tracks/java/exercises/binary-search/README.md +33 -3
  72. data/tracks/java/exercises/binary-search/src/test/java/BinarySearchTest.java +11 -11
  73. data/tracks/java/exercises/binary/README.md +4 -3
  74. data/tracks/java/exercises/bob/README.md +4 -3
  75. data/tracks/java/exercises/book-store/README.md +4 -3
  76. data/tracks/java/exercises/bowling/README.md +4 -3
  77. data/tracks/java/exercises/bracket-push/README.md +4 -3
  78. data/tracks/java/exercises/change/.meta/{.version → version} +0 -0
  79. data/tracks/java/exercises/change/README.md +4 -3
  80. data/tracks/java/exercises/circular-buffer/README.md +4 -3
  81. data/tracks/java/exercises/clock/.meta/{.version → version} +0 -0
  82. data/tracks/java/exercises/clock/README.md +6 -3
  83. data/tracks/java/exercises/collatz-conjecture/.meta/{.version → version} +0 -0
  84. data/tracks/java/exercises/collatz-conjecture/README.md +4 -3
  85. data/tracks/java/exercises/complex-numbers/README.md +4 -3
  86. data/tracks/java/exercises/crypto-square/README.md +4 -3
  87. data/tracks/java/exercises/{rna-transcription/.meta/.version → custom-set/.meta/version} +0 -0
  88. data/tracks/java/exercises/custom-set/README.md +4 -3
  89. data/tracks/java/exercises/custom-set/src/test/java/CustomSetTest.java +103 -251
  90. data/tracks/java/exercises/diamond/.meta/{.version → version} +0 -0
  91. data/tracks/java/exercises/diamond/README.md +4 -3
  92. data/tracks/java/exercises/difference-of-squares/.meta/{.version → version} +0 -0
  93. data/tracks/java/exercises/difference-of-squares/README.md +4 -3
  94. data/tracks/java/exercises/etl/README.md +4 -3
  95. data/tracks/java/exercises/flatten-array/.meta/{.version → version} +0 -0
  96. data/tracks/java/exercises/flatten-array/README.md +4 -3
  97. data/tracks/java/exercises/food-chain/README.md +4 -3
  98. data/tracks/java/exercises/forth/.meta/{.version → version} +0 -0
  99. data/tracks/java/exercises/forth/README.md +3 -3
  100. data/tracks/java/exercises/gigasecond/README.md +4 -3
  101. data/tracks/java/exercises/grade-school/README.md +4 -3
  102. data/tracks/java/exercises/hamming/.meta/{.version → version} +0 -0
  103. data/tracks/java/exercises/hamming/README.md +6 -3
  104. data/tracks/java/exercises/hello-world/README.md +6 -3
  105. data/tracks/java/exercises/hexadecimal/README.md +4 -3
  106. data/tracks/java/exercises/house/README.md +4 -3
  107. data/tracks/java/exercises/isogram/README.md +6 -3
  108. data/tracks/java/exercises/kindergarten-garden/README.md +4 -3
  109. data/tracks/java/exercises/largest-series-product/README.md +4 -3
  110. data/tracks/java/exercises/linked-list/README.md +4 -3
  111. data/tracks/java/exercises/list-ops/.meta/{.version → version} +0 -0
  112. data/tracks/java/exercises/list-ops/README.md +6 -3
  113. data/tracks/java/exercises/luhn/README.md +4 -3
  114. data/tracks/java/exercises/matrix/README.md +4 -3
  115. data/tracks/java/exercises/meetup/README.md +4 -3
  116. data/tracks/java/exercises/minesweeper/.meta/{.version → version} +0 -0
  117. data/tracks/java/exercises/minesweeper/README.md +4 -3
  118. data/tracks/java/exercises/nth-prime/README.md +4 -3
  119. data/tracks/java/exercises/nucleotide-count/README.md +4 -3
  120. data/tracks/java/exercises/ocr-numbers/README.md +4 -3
  121. data/tracks/java/exercises/octal/README.md +4 -3
  122. data/tracks/java/exercises/palindrome-products/README.md +4 -3
  123. data/tracks/java/exercises/pangram/.meta/{.version → version} +0 -0
  124. data/tracks/java/exercises/pangram/README.md +4 -3
  125. data/tracks/java/exercises/pascals-triangle/.meta/{.version → version} +0 -0
  126. data/tracks/java/exercises/pascals-triangle/README.md +4 -3
  127. data/tracks/java/exercises/perfect-numbers/.meta/{.version → version} +0 -0
  128. data/tracks/java/exercises/perfect-numbers/README.md +4 -3
  129. data/tracks/java/exercises/phone-number/README.md +4 -3
  130. data/tracks/java/exercises/pig-latin/README.md +4 -3
  131. data/tracks/java/exercises/poker/README.md +4 -3
  132. data/tracks/java/exercises/prime-factors/README.md +4 -3
  133. data/tracks/java/exercises/pythagorean-triplet/README.md +4 -3
  134. data/tracks/java/exercises/queen-attack/README.md +4 -3
  135. data/tracks/java/exercises/raindrops/README.md +4 -3
  136. data/tracks/java/exercises/rectangles/README.md +4 -3
  137. data/tracks/java/exercises/rna-transcription/.meta/version +1 -0
  138. data/tracks/java/exercises/rna-transcription/README.md +4 -3
  139. data/tracks/java/exercises/robot-name/README.md +4 -3
  140. data/tracks/java/exercises/robot-simulator/README.md +4 -3
  141. data/tracks/java/exercises/roman-numerals/README.md +4 -3
  142. data/tracks/java/exercises/rotational-cipher/README.md +4 -3
  143. data/tracks/java/exercises/run-length-encoding/README.md +4 -3
  144. data/tracks/java/exercises/saddle-points/.meta/{.version → version} +0 -0
  145. data/tracks/java/exercises/saddle-points/README.md +4 -3
  146. data/tracks/java/exercises/scrabble-score/.meta/{.version → version} +0 -0
  147. data/tracks/java/exercises/scrabble-score/README.md +4 -3
  148. data/tracks/java/exercises/secret-handshake/README.md +4 -3
  149. data/tracks/java/exercises/series/README.md +4 -3
  150. data/tracks/java/exercises/sieve/README.md +4 -3
  151. data/tracks/java/exercises/simple-cipher/README.md +6 -3
  152. data/tracks/java/exercises/simple-linked-list/README.md +4 -3
  153. data/tracks/java/exercises/space-age/README.md +4 -3
  154. data/tracks/java/exercises/spiral-matrix/.meta/{.version → version} +0 -0
  155. data/tracks/java/exercises/spiral-matrix/README.md +4 -3
  156. data/tracks/java/exercises/strain/README.md +4 -3
  157. data/tracks/java/exercises/sublist/README.md +4 -3
  158. data/tracks/java/exercises/sum-of-multiples/README.md +4 -3
  159. data/tracks/java/exercises/tournament/README.md +4 -3
  160. data/tracks/java/exercises/transpose/README.md +4 -3
  161. data/tracks/java/exercises/triangle/.meta/{.version → version} +0 -0
  162. data/tracks/java/exercises/triangle/README.md +4 -3
  163. data/tracks/java/exercises/trinary/README.md +4 -3
  164. data/tracks/java/exercises/twelve-days/README.md +4 -3
  165. data/tracks/java/exercises/two-fer/README.md +6 -3
  166. data/tracks/java/exercises/word-count/README.md +4 -3
  167. data/tracks/java/exercises/word-search/.meta/{.version → version} +0 -0
  168. data/tracks/java/exercises/word-search/README.md +4 -3
  169. data/tracks/java/exercises/wordy/README.md +4 -3
  170. data/tracks/julia/config.json +13 -0
  171. data/tracks/julia/exercises/phone-number/README.md +36 -0
  172. data/tracks/julia/exercises/phone-number/example.jl +18 -0
  173. data/tracks/julia/exercises/phone-number/phone-number.jl +3 -0
  174. data/tracks/julia/exercises/phone-number/runtests.jl +49 -0
  175. data/tracks/lua/config.json +505 -494
  176. data/tracks/lua/config/maintainers.json +16 -16
  177. data/tracks/lua/exercises/acronym/README.md +0 -1
  178. data/tracks/lua/exercises/all-your-base/README.md +1 -1
  179. data/tracks/lua/exercises/allergies/README.md +0 -1
  180. data/tracks/lua/exercises/alphametics/README.md +2 -2
  181. data/tracks/lua/exercises/atbash-cipher/README.md +2 -1
  182. data/tracks/lua/exercises/beer-song/README.md +1 -1
  183. data/tracks/lua/exercises/binary/README.md +2 -0
  184. data/tracks/lua/exercises/bowling/README.md +20 -6
  185. data/tracks/lua/exercises/change/README.md +1 -1
  186. data/tracks/lua/exercises/circular-buffer/README.md +13 -6
  187. data/tracks/lua/exercises/crypto-square/README.md +4 -4
  188. data/tracks/lua/exercises/diamond/README.md +6 -6
  189. data/tracks/lua/exercises/etl/README.md +2 -0
  190. data/tracks/lua/exercises/flatten-array/README.md +1 -2
  191. data/tracks/lua/exercises/food-chain/README.md +1 -1
  192. data/tracks/lua/exercises/grade-school/README.md +0 -1
  193. data/tracks/lua/exercises/grains/README.md +0 -1
  194. data/tracks/lua/exercises/house/README.md +1 -2
  195. data/tracks/lua/exercises/isogram/README.md +2 -1
  196. data/tracks/lua/exercises/kindergarten-garden/README.md +13 -13
  197. data/tracks/lua/exercises/leap/README.md +1 -1
  198. data/tracks/lua/exercises/linked-list/README.md +10 -10
  199. data/tracks/lua/exercises/luhn/README.md +7 -7
  200. data/tracks/lua/exercises/matrix/README.md +6 -4
  201. data/tracks/lua/exercises/meetup/README.md +1 -2
  202. data/tracks/lua/exercises/nucleotide-count/README.md +8 -22
  203. data/tracks/lua/exercises/ocr-numbers/README.md +5 -5
  204. data/tracks/lua/exercises/octal/README.md +6 -2
  205. data/tracks/lua/exercises/pangram/README.md +1 -1
  206. data/tracks/lua/exercises/pascals-triangle/README.md +1 -1
  207. data/tracks/lua/exercises/perfect-numbers/README.md +2 -2
  208. data/tracks/lua/exercises/phone-number/README.md +3 -2
  209. data/tracks/lua/exercises/pov/README.md +2 -2
  210. data/tracks/lua/exercises/protein-translation/README.md +4 -5
  211. data/tracks/lua/exercises/pythagorean-triplet/README.md +3 -3
  212. data/tracks/lua/exercises/rail-fence-cipher/README.md +12 -7
  213. data/tracks/lua/exercises/react/README.md +29 -0
  214. data/tracks/lua/exercises/react/example.lua +108 -0
  215. data/tracks/lua/exercises/react/react_spec.lua +160 -0
  216. data/tracks/lua/exercises/rectangles/README.md +7 -7
  217. data/tracks/lua/exercises/roman-numerals/README.md +1 -1
  218. data/tracks/lua/exercises/run-length-encoding/README.md +4 -4
  219. data/tracks/lua/exercises/scrabble-score/README.md +3 -1
  220. data/tracks/lua/exercises/secret-handshake/README.md +1 -1
  221. data/tracks/lua/exercises/space-age/README.md +2 -1
  222. data/tracks/lua/exercises/sum-of-multiples/README.md +0 -3
  223. data/tracks/lua/exercises/tournament/README.md +5 -5
  224. data/tracks/lua/exercises/transpose/README.md +7 -7
  225. data/tracks/lua/exercises/triangle/README.md +9 -6
  226. data/tracks/lua/exercises/variable-length-quantity/README.md +6 -7
  227. data/tracks/lua/exercises/word-count/README.md +1 -2
  228. data/tracks/lua/exercises/word-search/README.md +1 -1
  229. data/tracks/perl6/exercises/leap/Example.pm6 +1 -1
  230. data/tracks/perl6/exercises/leap/Leap.pm6 +1 -1
  231. data/tracks/perl6/exercises/leap/example.yaml +1 -1
  232. data/tracks/perl6/exercises/leap/leap.t +3 -3
  233. data/tracks/php/exercises/transpose/example.php +37 -15
  234. data/tracks/php/exercises/transpose/transpose_test.php +205 -45
  235. data/tracks/purescript/config.json +11 -0
  236. data/tracks/purescript/exercises/collatz-conjecture/README.md +33 -0
  237. data/tracks/purescript/exercises/collatz-conjecture/bower.json +26 -0
  238. data/tracks/purescript/exercises/collatz-conjecture/examples/src/CollatzConjecture.purs +15 -0
  239. data/tracks/purescript/exercises/collatz-conjecture/src/CollatzConjecture.purs +3 -0
  240. data/tracks/purescript/exercises/collatz-conjecture/test/Main.purs +43 -0
  241. data/tracks/python/config.json +10 -2
  242. data/tracks/racket/README.md +38 -33
  243. data/tracks/racket/config.json +10 -0
  244. data/tracks/racket/exercises/collatz-conjecture/README.md +58 -0
  245. data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture-test.rkt +34 -0
  246. data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture.rkt +6 -0
  247. data/tracks/racket/exercises/collatz-conjecture/example.rkt +20 -0
  248. data/tracks/ruby/exercises/allergies/.meta/.version +1 -0
  249. data/tracks/ruby/exercises/allergies/.meta/generator/allergies_case.rb +33 -0
  250. data/tracks/ruby/exercises/allergies/.meta/solutions/allergies.rb +4 -0
  251. data/tracks/ruby/exercises/allergies/allergies_test.rb +42 -9
  252. data/tracks/typescript/config.json +46 -0
  253. data/tracks/typescript/exercises/circular-buffer/README.md +74 -0
  254. data/tracks/typescript/exercises/circular-buffer/circular-buffer.example.ts +51 -0
  255. data/tracks/typescript/exercises/circular-buffer/circular-buffer.test.ts +103 -0
  256. data/tracks/typescript/exercises/circular-buffer/circular-buffer.ts +0 -0
  257. data/tracks/typescript/exercises/circular-buffer/package.json +36 -0
  258. data/tracks/typescript/exercises/circular-buffer/tsconfig.json +22 -0
  259. data/tracks/typescript/exercises/circular-buffer/tslint.json +127 -0
  260. data/tracks/typescript/exercises/circular-buffer/yarn.lock +2305 -0
  261. data/tracks/typescript/exercises/largest-series-product/README.md +51 -0
  262. data/tracks/typescript/exercises/largest-series-product/largest-series-product.example.ts +52 -0
  263. data/tracks/typescript/exercises/largest-series-product/largest-series-product.test.ts +68 -0
  264. data/tracks/typescript/exercises/largest-series-product/largest-series-product.ts +0 -0
  265. data/tracks/typescript/exercises/largest-series-product/package.json +36 -0
  266. data/tracks/typescript/exercises/largest-series-product/tsconfig.json +22 -0
  267. data/tracks/typescript/exercises/largest-series-product/tslint.json +127 -0
  268. data/tracks/typescript/exercises/largest-series-product/yarn.lock +2305 -0
  269. data/tracks/typescript/exercises/robot-simulator/README.md +58 -0
  270. data/tracks/typescript/exercises/robot-simulator/package.json +36 -0
  271. data/tracks/typescript/exercises/robot-simulator/robot-simulator.example.ts +74 -0
  272. data/tracks/typescript/exercises/robot-simulator/robot-simulator.test.ts +150 -0
  273. data/tracks/typescript/exercises/robot-simulator/robot-simulator.ts +0 -0
  274. data/tracks/typescript/exercises/robot-simulator/tsconfig.json +22 -0
  275. data/tracks/typescript/exercises/robot-simulator/tslint.json +127 -0
  276. data/tracks/typescript/exercises/robot-simulator/yarn.lock +2305 -0
  277. metadata +85 -23
@@ -250,6 +250,17 @@
250
250
  "topics": [
251
251
  "arrays"
252
252
  ]
253
+ },
254
+ {
255
+ "uuid": "d99298e6-0703-6080-8a2d-16e803173b64667909f",
256
+ "slug": "collatz-conjecture",
257
+ "core": false,
258
+ "unlocked_by": null,
259
+ "difficulty": 1,
260
+ "topics": [
261
+ "arithmetics",
262
+ "maybe"
263
+ ]
253
264
  }
254
265
  ],
255
266
  "foregone": [
@@ -0,0 +1,33 @@
1
+ # Collatz Conjecture
2
+
3
+ The Collatz Conjecture or 3x+1 problem can be summarized as follows:
4
+
5
+ Take any positive integer n. If n is even, divide n by 2 to get n / 2. If n is
6
+ odd, multiply n by 3 and add 1 to get 3n + 1. Repeat the process indefinitely.
7
+ The conjecture states that no matter which number you start with, you will
8
+ always reach 1 eventually.
9
+
10
+ Given a number n, return the number of steps required to reach 1.
11
+
12
+ ## Examples
13
+
14
+ Starting with n = 12, the steps would be as follows:
15
+
16
+ 0. 12
17
+ 1. 6
18
+ 2. 3
19
+ 3. 10
20
+ 4. 5
21
+ 5. 16
22
+ 6. 8
23
+ 7. 4
24
+ 8. 2
25
+ 9. 1
26
+
27
+ Resulting in 9 steps. So for input n = 12, the return value would be 9.
28
+ ## Source
29
+
30
+ An unsolved problem in mathematics named after mathematician Lothar Collatz [https://en.wikipedia.org/wiki/3x_%2B_1_problem](https://en.wikipedia.org/wiki/3x_%2B_1_problem)
31
+
32
+ ## Submitting Incomplete Solutions
33
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "collatz-conjecture",
3
+ "ignore": [
4
+ "**/.*",
5
+ "node_modules",
6
+ "bower_components",
7
+ "output"
8
+ ],
9
+ "dependencies": {
10
+ "purescript-console": "^3.0.0",
11
+ "purescript-datetime": "^3.4.0",
12
+ "purescript-either": "^3.1.0",
13
+ "purescript-enums": "^3.2.1",
14
+ "purescript-integers": "^3.1.0",
15
+ "purescript-lists": "^4.10.0",
16
+ "purescript-maps": "^3.5.2",
17
+ "purescript-prelude": "^3.1.0",
18
+ "purescript-sets": "^3.0.0",
19
+ "purescript-strings": "^3.3.1",
20
+ "purescript-unicode": "^3.0.1"
21
+ },
22
+ "devDependencies": {
23
+ "purescript-psci-support": "^3.0.0",
24
+ "purescript-test-unit": "^13.0.0"
25
+ }
26
+ }
@@ -0,0 +1,15 @@
1
+ module CollatzConjecture
2
+ ( collatz
3
+ ) where
4
+
5
+ import Prelude
6
+ import Data.Int (even)
7
+ import Data.Maybe (Maybe(..))
8
+
9
+ collatzHelper :: Int -> Int -> Int
10
+ collatzHelper acc x | x == 1 = acc
11
+ | even x = collatzHelper (acc + 1) (x / 2)
12
+ | otherwise = collatzHelper (acc + 1) (x * 3 + 1)
13
+
14
+ collatz :: Int -> Maybe Int
15
+ collatz x = if x <= 0 then Nothing else Just $ collatzHelper 0 x
@@ -0,0 +1,3 @@
1
+ module CollatzConjecture
2
+ ( collatz
3
+ ) where
@@ -0,0 +1,43 @@
1
+ module Test.Main where
2
+
3
+ import Prelude
4
+
5
+ import CollatzConjecture (collatz)
6
+ import Control.Monad.Aff.AVar (AVAR)
7
+ import Control.Monad.Eff (Eff)
8
+ import Control.Monad.Eff.Console (CONSOLE)
9
+ import Data.Maybe (Maybe(..))
10
+ import Test.Unit (TestSuite, suite, test)
11
+ import Test.Unit.Assert as Assert
12
+ import Test.Unit.Console (TESTOUTPUT)
13
+ import Test.Unit.Main (runTest)
14
+
15
+ main :: forall eff
16
+ . Eff ( avar :: AVAR
17
+ , console :: CONSOLE
18
+ , testOutput :: TESTOUTPUT
19
+ | eff
20
+ )
21
+ Unit
22
+ main = runTest suites
23
+
24
+ suites :: forall e. TestSuite e
25
+ suites = do
26
+ suite "CollatzConjecture.collatz" do
27
+ test "zero steps for one" do
28
+ Assert.equal (Just 0) (collatz 1)
29
+
30
+ test "divide if even" do
31
+ Assert.equal (Just 4) (collatz 16)
32
+
33
+ test "even and odd steps" do
34
+ Assert.equal (Just 9) (collatz 12)
35
+
36
+ test "Large number of even and odd steps" do
37
+ Assert.equal (Just 152) (collatz 1000000)
38
+
39
+ test "zero is an error" do
40
+ Assert.equal Nothing (collatz 0)
41
+
42
+ test "negative value is an error" do
43
+ Assert.equal Nothing (collatz (-15))
@@ -326,7 +326,10 @@
326
326
  "unlocked_by": null,
327
327
  "difficulty": 1,
328
328
  "topics": [
329
-
329
+ "recursion",
330
+ "lists",
331
+ "algorithms",
332
+ "transforming"
330
333
  ]
331
334
  },
332
335
  {
@@ -374,7 +377,12 @@
374
377
  "unlocked_by": null,
375
378
  "difficulty": 1,
376
379
  "topics": [
377
-
380
+ "mathematics",
381
+ "algorithms",
382
+ "loops",
383
+ "conditionals",
384
+ "pattern_matching",
385
+ "security"
378
386
  ]
379
387
  },
380
388
  {
@@ -1,24 +1,31 @@
1
1
  # Exercism Racket Track
2
2
 
3
- Exercism problems in Racket.
3
+ [![Build Status](https://travis-ci.org/exercism/racket.svg?branch=master)](https://travis-ci.org/exercism/racket)
4
4
 
5
- ## Working on the Exercises
5
+ Exercism exercises in Racket.
6
6
 
7
- We welcome both improvements to the existing exercises and the addition of new exercises. A pool of exercise ideas can be found in the [x-common repo](https://github.com/exercism/x-common). An overview about which language tracks implement which exercises is at [synopsis.exercism.io](http://synopsis.exercism.io/).
7
+ ## Contributing
8
8
 
9
- Each exercise should have an example solution and a test suite, as well as a stub file for the solution declaring the module and exports.
9
+ Please read about how to [get involved in a track](https://github.com/exercism/docs/tree/master/contributing-to-language-tracks). Also, be sure to read the Exercism [Code of Conduct](https://github.com/exercism/exercism.io/blob/master/CODE_OF_CONDUCT.md).
10
+
11
+ We welcome both improvements to the existing exercises and the addition of new exercises. If you are creating a new exercise from scratch please see [adding new exercises](https://github.com/exercism/docs/blob/master/you-can-help/make-up-new-exercises.md). If you are porting an exercise that exists in other exercism language tracks, see [porting an exercise](https://github.com/exercism/docs/blob/master/you-can-help/implement-an-exercise-from-specification.md).
12
+
13
+ Please note that this track's exercises must conform to the Exercism-wide standards described in the [documentation](https://github.com/exercism/docs/tree/master/language-tracks/exercises). If you're unsure about how to make a change, then go ahead and open an issue on Github.
14
+
15
+ Each exercise should have an example solution, a description file, a test suite and a stub file for the solution declaring the module and exports.
10
16
 
11
17
  ### Naming Conventions
12
18
 
13
- The example solution should be named `example.rkt`. The test should be named `<exercise-name>-test.rkt`, and the stub should be named `<exercise-name>.rkt`.
19
+ The example solution should be named `example.rkt`. The description file: `README.md`. The test suite: `<exercise-name>-test.rkt`, and the stub: `<exercise-name>.rkt`.
14
20
 
15
- For example, if you were to work on the `binary` exercise, you would have the following three files:
21
+ For example, if you were to work on the `binary` exercise, you would create and commit the following four files:
16
22
 
17
23
  ```bash
18
- $ tree
24
+ $ racket/exercises/binary/
19
25
  .
20
26
  ├── binary.rkt
21
27
  ├── binary-test.rkt
28
+ ├── README.md
22
29
  └── example.rkt
23
30
  ```
24
31
 
@@ -28,7 +35,29 @@ The Racket code in this repo is meant to conform with the conventions set forth
28
35
  ### Dependencies
29
36
  Try to avoid external dependencies.
30
37
 
31
- ### Pull Requests
38
+ ### Creating the description file
39
+
40
+ `README.md` may be [generated](https://github.com/exercism/docs/blob/master/maintaining-a-track/regenerating-exercise-readmes.md) from exercism data. The generator will use the `description.md` from the exercise directory in the [problem-specifications repository](https://github.com/exercism/problem-specifications/tree/master/exercises). To generate `README.md` for your execise only use the following command from your racket track directory:
41
+
42
+ ```bash
43
+ bin/configlet generate . --only <exercise-name>
44
+ ```
45
+
46
+ ### Adding the exercise to config.json
47
+ Be sure to add the exercise to an appropriate place in the `config.json` file. The position in the file determines the order exercises are fetched by users. Generate a unique UUID for the exercise with ```configlet uuid```. Finally check `config.json` with:
48
+
49
+ ```bash
50
+ bin/configlet lint .
51
+ ```
52
+
53
+ ## Opening an Issue
54
+
55
+ If you plan to make significant or breaking changes, please open an issue so we can discuss it first. If this is a discussion that is relevant to more than just the Racket track, please open an issue in [exercism/discussions](https://github.com/exercism/discussions/issues).
56
+
57
+ ## Submitting a Pull Request
58
+
59
+ Pull requests should be focused on a single exercise, issue, or conceptually cohesive change. Please refer to Exercism's [pull request guidelines](https://github.com/exercism/docs/blob/master/contributing/pull-request-guidelines.md).
60
+
32
61
  Prior to submitting a pull request, ensure that your test requires the stub file, and not the example file - like so:
33
62
 
34
63
  ```Racket
@@ -49,31 +78,7 @@ Prior to submitting a pull request, ensure that your test requires the stub file
49
78
 
50
79
  (run-tests suite))
51
80
  ```
52
- The exercise should also be added as a value for the `problems` key in [config.json](https://github.com/exercism/racket/blob/master/config.json); otherwise, the pull request will not pass the Travis CI build. Use [Order of exercises](https://github.com/exercism/racket/wiki/Order-of-exercises) in our wiki to find a good place for the new exercise in the curriculum.
53
-
54
- You can perform additional checks by running the following in your terminal:
55
-
56
- ```bash
57
- bin/check_exercises.sh
58
- ```
59
-
60
- and:
61
-
62
- ```bash
63
- bin/configlet lint .
64
- ```
65
- Your pull request won't pass the Travis CI build if either of those fail.
66
-
67
- If you're new to Git, take a look at [this short guide](https://github.com/exercism/docs/blob/master/contributing-to-language-tracks/README.md#git-basics).
68
-
69
- ## READMEs
70
- Please do not add a README or README.md file to the problem directory. The READMEs are constructed using shared metadata, which lives in the [exercism/x-common](https://github.com/exercism/x-common) repository.
71
-
72
- ## Contributing Guide
73
-
74
- Please see the [contributing guide](https://github.com/exercism/x-api/blob/master/CONTRIBUTING.md#the-exercise-data)
75
-
76
81
 
77
82
  ## Racket icon
78
83
  The Racket logo was created by [Matthew Butterick](https://en.wikipedia.org/wiki/Matthew_Butterick) and released under the Creative Commons Attribution-Share Alike 3.0 Unported license.
79
- We have adapted it, changing the colour scheme, for use on Exercism.
84
+ We have adapted it, changing the colour scheme for use on Exercism.
@@ -73,6 +73,16 @@
73
73
 
74
74
  ]
75
75
  },
76
+ {
77
+ "uuid": "28102e69-dad0-4f3c-8cdf-5a18a73178a4",
78
+ "slug": "collatz-conjecture",
79
+ "core": false,
80
+ "unlocked_by": null,
81
+ "difficulty": 1,
82
+ "topics": [
83
+
84
+ ]
85
+ },
76
86
  {
77
87
  "uuid": "f0a6e55d-6702-4043-bdcf-2ed99bf60645",
78
88
  "slug": "hamming",
@@ -0,0 +1,58 @@
1
+ # Collatz Conjecture
2
+
3
+ The Collatz Conjecture or 3x+1 problem can be summarized as follows:
4
+
5
+ Take any positive integer n. If n is even, divide n by 2 to get n / 2. If n is
6
+ odd, multiply n by 3 and add 1 to get 3n + 1. Repeat the process indefinitely.
7
+ The conjecture states that no matter which number you start with, you will
8
+ always reach 1 eventually.
9
+
10
+ Given a number n, return the number of steps required to reach 1.
11
+
12
+ ## Examples
13
+
14
+ Starting with n = 12, the steps would be as follows:
15
+
16
+ 0. 12
17
+ 1. 6
18
+ 2. 3
19
+ 3. 10
20
+ 4. 5
21
+ 5. 16
22
+ 6. 8
23
+ 7. 4
24
+ 8. 2
25
+ 9. 1
26
+
27
+ Resulting in 9 steps. So for input n = 12, the return value would be 9.
28
+
29
+ * * * *
30
+
31
+ For installation and learning resources, refer to the
32
+ [exercism Racket page](http://exercism.io/languages/racket).
33
+
34
+ You can run the provided tests through DrRacket, or via the command line.
35
+
36
+ To run the test through DrRacket, simply open the test file and click the 'Run' button in the upper right.
37
+
38
+ To run the test from the command line, simply run the test from the exercise directory. For example, if the test suite is called `hello-world-test.rkt`, you can run the following command:
39
+
40
+ ```
41
+ raco test hello-world-test.rkt
42
+ ```
43
+
44
+ which will display the following:
45
+
46
+ ```
47
+ raco test: (submod "hello-world-test.rkt" test)
48
+ 2 success(es) 0 failure(s) 0 error(s) 2 test(s) run
49
+ 0
50
+ 2 tests passed
51
+ ```
52
+
53
+ ## Source
54
+
55
+ An unsolved problem in mathematics named after mathematician Lothar Collatz [https://en.wikipedia.org/wiki/3x_%2B_1_problem](https://en.wikipedia.org/wiki/3x_%2B_1_problem)
56
+
57
+ ## Submitting Incomplete Solutions
58
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,34 @@
1
+ #lang racket/base
2
+
3
+ (require "collatz-conjecture.rkt")
4
+
5
+ (module+ test
6
+ (require rackunit rackunit/text-ui)
7
+
8
+ (define suite
9
+ (test-suite
10
+ "collatz-conjecture tests"
11
+
12
+ (test-eqv? "zero steps for one"
13
+ (collatz 1)
14
+ 0)
15
+ (test-eqv? "divide if even"
16
+ (collatz 16)
17
+ 4)
18
+ (test-eqv? "even and odd steps"
19
+ (collatz 12)
20
+ 9)
21
+ (test-eqv? "Large number of even and odd steps"
22
+ (collatz 1000000)
23
+ 152)
24
+ (test-exn "zero is an error"
25
+ exn:fail?
26
+ (lambda () (collatz 0)))
27
+ (test-exn "negative value is an error"
28
+ exn:fail?
29
+ (lambda () (collatz -15)))
30
+ (test-exn "non exact value is an error"
31
+ exn:fail?
32
+ (lambda () (collatz 3.4)))))
33
+
34
+ (run-tests suite))
@@ -0,0 +1,6 @@
1
+ #lang racket
2
+
3
+ (provide collatz)
4
+
5
+
6
+
@@ -0,0 +1,20 @@
1
+ #lang racket
2
+
3
+ (provide collatz)
4
+
5
+ (define (collatz-length n [acc 0])
6
+ (if (= n 1)
7
+ acc
8
+ (collatz-length (if (even? n)
9
+ (/ n 2)
10
+ (add1 (* 3 n)))
11
+ (add1 acc))))
12
+
13
+ (define (collatz n)
14
+ (if (nand (exact-integer? n)
15
+ (positive? n))
16
+ (error "number must be a positive integer")
17
+ (collatz-length n)))
18
+
19
+
20
+
@@ -0,0 +1,33 @@
1
+ require 'generator/exercise_case'
2
+
3
+ class AllergiesCase < Generator::ExerciseCase
4
+ def workload
5
+ assertions = list_expected? ? list_assertion : individual_assertions
6
+ allergies_declaration = "allergies = Allergies.new(#{score})"
7
+ indent_lines(assertions.unshift(allergies_declaration), 4)
8
+ end
9
+
10
+ def list_expected?
11
+ property == 'list'
12
+ end
13
+
14
+ def list_assertion
15
+ ["assert_equal %w(#{expected.join(' ')}), allergies.list"]
16
+ end
17
+
18
+ def individual_assertions
19
+ expected.map do |assertion|
20
+ substance = assertion['substance']
21
+ result = assertion['result']
22
+ "#{result ? assert(substance) : refute(substance)}"
23
+ end
24
+ end
25
+
26
+ def refute(allergen)
27
+ "refute allergies.allergic_to?('#{allergen}')"
28
+ end
29
+
30
+ def assert(allergen)
31
+ "assert allergies.allergic_to?('#{allergen}')"
32
+ end
33
+ end