trackler 2.2.1.54 → 2.2.1.55

Sign up to get free protection for your applications and to get access to all the features.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/dominoes/description.md +3 -3
  4. data/problem-specifications/exercises/two-fer/description.md +0 -28
  5. data/tracks/c/config.json +12 -0
  6. data/tracks/c/exercises/queen-attack/README.md +65 -0
  7. data/tracks/c/exercises/queen-attack/makefile +15 -0
  8. data/tracks/c/exercises/queen-attack/src/example.c +25 -0
  9. data/tracks/c/exercises/queen-attack/src/queen_attack.h +19 -0
  10. data/tracks/c/exercises/queen-attack/test/test_queen_attack.c +190 -0
  11. data/tracks/c/exercises/queen-attack/test/vendor/unity.c +1300 -0
  12. data/tracks/c/exercises/queen-attack/test/vendor/unity.h +274 -0
  13. data/tracks/c/exercises/queen-attack/test/vendor/unity_internals.h +701 -0
  14. data/tracks/common-lisp/exercises/acronym/README.md +1 -1
  15. data/tracks/delphi/exercises/two-fer/README.md +0 -28
  16. data/tracks/ecmascript/config.json +41 -0
  17. data/tracks/ecmascript/exercises/accumulate/package.json +5 -3
  18. data/tracks/ecmascript/exercises/acronym/package.json +5 -3
  19. data/tracks/ecmascript/exercises/all-your-base/package.json +5 -3
  20. data/tracks/ecmascript/exercises/allergies/package.json +5 -3
  21. data/tracks/ecmascript/exercises/alphametics/package.json +5 -3
  22. data/tracks/ecmascript/exercises/anagram/package.json +5 -3
  23. data/tracks/ecmascript/exercises/atbash-cipher/package.json +5 -3
  24. data/tracks/ecmascript/exercises/beer-song/package.json +5 -3
  25. data/tracks/ecmascript/exercises/binary-search-tree/package.json +5 -3
  26. data/tracks/ecmascript/exercises/binary-search/package.json +5 -3
  27. data/tracks/ecmascript/exercises/binary/package.json +5 -3
  28. data/tracks/ecmascript/exercises/bob/package.json +5 -3
  29. data/tracks/ecmascript/exercises/bowling/package.json +2 -2
  30. data/tracks/ecmascript/exercises/bracket-push/package.json +5 -3
  31. data/tracks/ecmascript/exercises/change/README.md +44 -0
  32. data/tracks/ecmascript/exercises/change/change.spec.js +80 -0
  33. data/tracks/ecmascript/exercises/change/example.js +120 -0
  34. data/tracks/ecmascript/exercises/change/package.json +69 -0
  35. data/tracks/ecmascript/exercises/circular-buffer/package.json +5 -3
  36. data/tracks/ecmascript/exercises/clock/package.json +5 -3
  37. data/tracks/ecmascript/exercises/collatz-conjecture/package.json +6 -4
  38. data/tracks/ecmascript/exercises/connect/package.json +5 -3
  39. data/tracks/ecmascript/exercises/crypto-square/package.json +5 -3
  40. data/tracks/ecmascript/exercises/custom-set/package.json +5 -3
  41. data/tracks/ecmascript/exercises/diamond/package.json +5 -3
  42. data/tracks/ecmascript/exercises/difference-of-squares/package.json +5 -3
  43. data/tracks/ecmascript/exercises/diffie-hellman/package.json +5 -3
  44. data/tracks/ecmascript/exercises/etl/package.json +5 -3
  45. data/tracks/ecmascript/exercises/flatten-array/package.json +5 -3
  46. data/tracks/ecmascript/exercises/food-chain/package.json +5 -3
  47. data/tracks/ecmascript/exercises/gigasecond/package.json +5 -3
  48. data/tracks/ecmascript/exercises/grade-school/package.json +5 -3
  49. data/tracks/ecmascript/exercises/grains/package.json +5 -3
  50. data/tracks/ecmascript/exercises/hamming/package.json +5 -3
  51. data/tracks/ecmascript/exercises/hello-world/package.json +5 -3
  52. data/tracks/ecmascript/exercises/hexadecimal/package.json +5 -3
  53. data/tracks/ecmascript/exercises/isbn-verifier/README.md +62 -0
  54. data/tracks/ecmascript/exercises/isbn-verifier/example.js +17 -0
  55. data/tracks/ecmascript/exercises/isbn-verifier/isbn-verifier.spec.js +81 -0
  56. data/tracks/ecmascript/exercises/isbn-verifier/package.json +71 -0
  57. data/tracks/ecmascript/exercises/isogram/package.json +5 -3
  58. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +5 -3
  59. data/tracks/ecmascript/exercises/largest-series-product/package.json +5 -3
  60. data/tracks/ecmascript/exercises/leap/package.json +5 -3
  61. data/tracks/ecmascript/exercises/linked-list/package.json +5 -3
  62. data/tracks/ecmascript/exercises/list-ops/package.json +5 -3
  63. data/tracks/ecmascript/exercises/luhn/package.json +5 -3
  64. data/tracks/ecmascript/exercises/matrix/package.json +5 -3
  65. data/tracks/ecmascript/exercises/meetup/package.json +5 -3
  66. data/tracks/ecmascript/exercises/minesweeper/package.json +5 -3
  67. data/tracks/ecmascript/exercises/nth-prime/package.json +5 -3
  68. data/tracks/ecmascript/exercises/ocr-numbers/package.json +5 -3
  69. data/tracks/ecmascript/exercises/octal/package.json +5 -3
  70. data/tracks/ecmascript/exercises/palindrome-products/package.json +5 -3
  71. data/tracks/ecmascript/exercises/pangram/package.json +5 -3
  72. data/tracks/ecmascript/exercises/pascals-triangle/package.json +5 -3
  73. data/tracks/ecmascript/exercises/perfect-numbers/package.json +5 -3
  74. data/tracks/ecmascript/exercises/phone-number/package.json +5 -3
  75. data/tracks/ecmascript/exercises/pig-latin/package.json +5 -3
  76. data/tracks/ecmascript/exercises/prime-factors/package.json +5 -3
  77. data/tracks/ecmascript/exercises/proverb/package.json +5 -3
  78. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +5 -3
  79. data/tracks/ecmascript/exercises/queen-attack/package.json +5 -3
  80. data/tracks/ecmascript/exercises/raindrops/package.json +5 -3
  81. data/tracks/ecmascript/exercises/rna-transcription/package.json +5 -3
  82. data/tracks/ecmascript/exercises/robot-name/package.json +5 -3
  83. data/tracks/ecmascript/exercises/robot-simulator/package.json +5 -3
  84. data/tracks/ecmascript/exercises/roman-numerals/package.json +5 -3
  85. data/tracks/ecmascript/exercises/run-length-encoding/package.json +5 -3
  86. data/tracks/ecmascript/exercises/saddle-points/package.json +5 -3
  87. data/tracks/ecmascript/exercises/say/package.json +5 -3
  88. data/tracks/ecmascript/exercises/scrabble-score/package.json +5 -3
  89. data/tracks/ecmascript/exercises/secret-handshake/package.json +5 -3
  90. data/tracks/ecmascript/exercises/series/package.json +5 -3
  91. data/tracks/ecmascript/exercises/sieve/package.json +5 -3
  92. data/tracks/ecmascript/exercises/simple-cipher/package.json +5 -3
  93. data/tracks/ecmascript/exercises/simple-linked-list/package.json +5 -3
  94. data/tracks/ecmascript/exercises/space-age/package.json +5 -3
  95. data/tracks/ecmascript/exercises/strain/package.json +5 -3
  96. data/tracks/ecmascript/exercises/sublist/package.json +5 -3
  97. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +5 -3
  98. data/tracks/ecmascript/exercises/transpose/README.md +94 -0
  99. data/tracks/ecmascript/exercises/transpose/example.js +12 -0
  100. data/tracks/ecmascript/exercises/transpose/package.json +71 -0
  101. data/tracks/ecmascript/exercises/transpose/transpose.spec.js +67 -0
  102. data/tracks/ecmascript/exercises/triangle/package.json +5 -3
  103. data/tracks/ecmascript/exercises/trinary/package.json +5 -3
  104. data/tracks/ecmascript/exercises/twelve-days/package.json +5 -3
  105. data/tracks/ecmascript/exercises/two-bucket/package.json +5 -3
  106. data/tracks/ecmascript/exercises/two-fer/package.json +5 -3
  107. data/tracks/ecmascript/exercises/word-count/package.json +5 -3
  108. data/tracks/ecmascript/exercises/word-search/package.json +5 -3
  109. data/tracks/ecmascript/exercises/wordy/package.json +5 -3
  110. data/tracks/ecmascript/package-lock.json +6219 -0
  111. data/tracks/ecmascript/package.json +5 -3
  112. data/tracks/erlang/exercises/collatz-conjecture/src/collatz_conjecture.erl +3 -4
  113. data/tracks/erlang/exercises/collatz-conjecture/src/example.erl +3 -3
  114. data/tracks/erlang/exercises/collatz-conjecture/test/collatz_conjecture_tests.erl +13 -9
  115. data/tracks/erlang/exercises/hello-world/src/hello_world.erl +2 -2
  116. data/tracks/erlang/exercises/leap/src/example.erl +1 -1
  117. data/tracks/erlang/exercises/leap/src/leap.erl +3 -3
  118. data/tracks/erlang/exercises/leap/test/leap_tests.erl +9 -9
  119. data/tracks/erlang/testgen/src/testgen.erl +16 -13
  120. data/tracks/erlang/testgen/src/tgen.erl +65 -38
  121. data/tracks/erlang/testgen/src/tgen_collatz-conjecture.erl +38 -0
  122. data/tracks/erlang/testgen/src/tgen_hello-world.erl +11 -19
  123. data/tracks/erlang/testgen/src/tgen_leap.erl +31 -0
  124. data/tracks/erlang/testgen/src/tgs.erl +80 -0
  125. data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +78 -23
  126. data/tracks/fsharp/exercises/anagram/AnagramTest.fs +66 -34
  127. data/tracks/fsharp/exercises/connect/ConnectTest.fs +81 -68
  128. data/tracks/fsharp/exercises/connect/Example.fs +9 -5
  129. data/tracks/fsharp/exercises/food-chain/Example.fs +5 -9
  130. data/tracks/fsharp/exercises/food-chain/FoodChain.fs +2 -2
  131. data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +143 -75
  132. data/tracks/fsharp/exercises/hamming/Example.fs +8 -4
  133. data/tracks/fsharp/exercises/hamming/Hamming.fs +1 -1
  134. data/tracks/fsharp/exercises/hamming/HammingTest.fs +53 -13
  135. data/tracks/fsharp/exercises/house/Example.fs +5 -6
  136. data/tracks/fsharp/exercises/house/House.fs +3 -1
  137. data/tracks/fsharp/exercises/house/HouseTest.fs +272 -96
  138. data/tracks/fsharp/exercises/meetup/Example.fs +1 -1
  139. data/tracks/fsharp/exercises/meetup/Meetup.fs +1 -1
  140. data/tracks/fsharp/exercises/meetup/MeetupTest.fs +384 -73
  141. data/tracks/fsharp/exercises/ocr-numbers/Example.fs +43 -35
  142. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +160 -125
  143. data/tracks/fsharp/exercises/two-fer/Example.fs +4 -2
  144. data/tracks/fsharp/exercises/two-fer/TwoFer.fs +1 -1
  145. data/tracks/fsharp/exercises/two-fer/TwoFerTest.fs +7 -4
  146. data/tracks/fsharp/generators/Common.fs +6 -2
  147. data/tracks/fsharp/generators/Exercise.fs +14 -13
  148. data/tracks/fsharp/generators/Generators.fs +145 -2
  149. data/tracks/fsharp/generators/Options.fs +4 -6
  150. data/tracks/fsharp/generators/Output.fs +2 -2
  151. data/tracks/fsharp/generators/Program.fs +4 -3
  152. data/tracks/java/exercises/saddle-points/README.md +1 -1
  153. data/tracks/java/exercises/two-fer/README.md +0 -28
  154. data/tracks/javascript/exercises/beer-song/example.js +18 -14
  155. data/tracks/kotlin/exercises/saddle-points/README.md +1 -1
  156. data/tracks/kotlin/exercises/two-fer/README.md +0 -28
  157. data/tracks/lua/config.json +12 -0
  158. data/tracks/lua/exercises/collatz-conjecture/README.md +43 -0
  159. data/tracks/lua/exercises/collatz-conjecture/collatz-conjecture_spec.lua +33 -0
  160. data/tracks/lua/exercises/collatz-conjecture/example.lua +16 -0
  161. data/tracks/python/config.json +4 -1
  162. data/tracks/python/exercises/binary-search/binary_search_test.py +2 -0
  163. data/tracks/python/exercises/change/change_test.py +2 -0
  164. data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +56 -50
  165. data/tracks/python/exercises/forth/example.py +3 -1
  166. data/tracks/python/exercises/forth/forth_test.py +43 -26
  167. data/tracks/python/exercises/nth-prime/nth_prime.py +1 -1
  168. data/tracks/python/exercises/rna-transcription/README.md +5 -0
  169. data/tracks/python/exercises/rna-transcription/example.py +1 -1
  170. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +7 -4
  171. data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +9 -7
  172. data/tracks/python/exercises/saddle-points/saddle_points_test.py +15 -5
  173. data/tracks/python/exercises/simple-cipher/simple_cipher.py +7 -1
  174. data/tracks/python/exercises/word-count/example.py +6 -4
  175. data/tracks/python/exercises/word-count/word_count_test.py +49 -22
  176. data/tracks/python/exercises/word-search/word_search_test.py +104 -12
  177. data/tracks/rust/.travis.yml +2 -0
  178. data/tracks/rust/README.md +5 -0
  179. data/tracks/rust/_test/check-exercises.sh +0 -6
  180. data/tracks/rust/_test/ensure-lib-src-rs-exist.sh +19 -0
  181. data/tracks/rust/_test/ensure-stubs-compile.sh +26 -0
  182. data/tracks/rust/config.json +12 -0
  183. data/tracks/rust/config/exercise-readme-insert.md +3 -2
  184. data/tracks/rust/docs/ABOUT.md +2 -2
  185. data/tracks/rust/docs/LEARNING.md +1 -1
  186. data/tracks/rust/docs/RESOURCES.md +1 -1
  187. data/tracks/rust/docs/TESTS.md +2 -2
  188. data/tracks/rust/exercises/accumulate/README.md +3 -2
  189. data/tracks/rust/exercises/acronym/README.md +3 -2
  190. data/tracks/rust/exercises/all-your-base/README.md +3 -2
  191. data/tracks/rust/exercises/allergies/README.md +3 -2
  192. data/tracks/rust/exercises/alphametics/README.md +3 -2
  193. data/tracks/rust/exercises/anagram/README.md +3 -2
  194. data/tracks/rust/exercises/atbash-cipher/README.md +3 -2
  195. data/tracks/rust/exercises/beer-song/README.md +3 -2
  196. data/tracks/rust/exercises/beer-song/src/lib.rs +2 -2
  197. data/tracks/rust/exercises/binary-search/README.md +3 -2
  198. data/tracks/rust/exercises/bob/README.md +3 -2
  199. data/tracks/rust/exercises/bob/src/lib.rs +1 -1
  200. data/tracks/rust/exercises/bowling/README.md +3 -2
  201. data/tracks/rust/exercises/bracket-push/HINTS.md +1 -1
  202. data/tracks/rust/exercises/bracket-push/README.md +4 -3
  203. data/tracks/rust/exercises/circular-buffer/README.md +3 -2
  204. data/tracks/rust/exercises/clock/README.md +3 -2
  205. data/tracks/rust/exercises/collatz-conjecture/README.md +3 -2
  206. data/tracks/rust/exercises/collatz-conjecture/src/lib.rs +1 -1
  207. data/tracks/rust/exercises/crypto-square/README.md +3 -2
  208. data/tracks/rust/exercises/custom-set/README.md +3 -2
  209. data/tracks/rust/exercises/decimal/.meta/ALLOWED_TO_NOT_COMPILE +2 -0
  210. data/tracks/rust/exercises/decimal/README.md +3 -2
  211. data/tracks/rust/exercises/difference-of-squares/README.md +3 -2
  212. data/tracks/rust/exercises/difference-of-squares/src/lib.rs +3 -3
  213. data/tracks/rust/exercises/dominoes/README.md +3 -2
  214. data/tracks/rust/exercises/etl/README.md +3 -2
  215. data/tracks/rust/exercises/forth/README.md +3 -2
  216. data/tracks/rust/exercises/forth/src/lib.rs +3 -0
  217. data/tracks/rust/exercises/gigasecond/README.md +3 -2
  218. data/tracks/rust/exercises/grade-school/README.md +3 -2
  219. data/tracks/rust/exercises/grains/README.md +3 -2
  220. data/tracks/rust/exercises/hamming/README.md +3 -2
  221. data/tracks/rust/exercises/hello-world/GETTING_STARTED.md +1 -1
  222. data/tracks/rust/exercises/hello-world/README.md +3 -2
  223. data/tracks/rust/exercises/hexadecimal/README.md +3 -2
  224. data/tracks/rust/exercises/isogram/.gitignore +8 -0
  225. data/tracks/rust/exercises/isogram/Cargo.toml +3 -0
  226. data/tracks/rust/exercises/isogram/README.md +52 -0
  227. data/tracks/rust/exercises/isogram/example.rs +12 -0
  228. data/tracks/rust/exercises/isogram/src/lib.rs +0 -0
  229. data/tracks/rust/exercises/isogram/tests/isogram.rs +72 -0
  230. data/tracks/rust/exercises/largest-series-product/README.md +3 -2
  231. data/tracks/rust/exercises/leap/README.md +3 -2
  232. data/tracks/rust/exercises/leap/src/lib.rs +1 -1
  233. data/tracks/rust/exercises/luhn-from/README.md +3 -2
  234. data/tracks/rust/exercises/luhn-trait/.meta/description.md +2 -2
  235. data/tracks/rust/exercises/luhn-trait/README.md +5 -4
  236. data/tracks/rust/exercises/luhn/README.md +3 -2
  237. data/tracks/rust/exercises/minesweeper/README.md +3 -2
  238. data/tracks/rust/exercises/nth-prime/README.md +3 -2
  239. data/tracks/rust/exercises/nucleotide-codons/README.md +3 -2
  240. data/tracks/rust/exercises/nucleotide-count/README.md +3 -2
  241. data/tracks/rust/exercises/ocr-numbers/README.md +3 -2
  242. data/tracks/rust/exercises/pangram/README.md +3 -2
  243. data/tracks/rust/exercises/parallel-letter-frequency/HINTS.md +1 -1
  244. data/tracks/rust/exercises/parallel-letter-frequency/README.md +4 -3
  245. data/tracks/rust/exercises/pascals-triangle/README.md +3 -2
  246. data/tracks/rust/exercises/perfect-numbers/README.md +3 -2
  247. data/tracks/rust/exercises/phone-number/README.md +3 -2
  248. data/tracks/rust/exercises/pig-latin/README.md +3 -2
  249. data/tracks/rust/exercises/poker/README.md +3 -2
  250. data/tracks/rust/exercises/prime-factors/README.md +3 -2
  251. data/tracks/rust/exercises/protein-translation/README.md +3 -2
  252. data/tracks/rust/exercises/proverb/README.md +3 -2
  253. data/tracks/rust/exercises/proverb/src/lib.rs +1 -1
  254. data/tracks/rust/exercises/pythagorean-triplet/README.md +3 -2
  255. data/tracks/rust/exercises/queen-attack/README.md +3 -2
  256. data/tracks/rust/exercises/raindrops/README.md +3 -2
  257. data/tracks/rust/exercises/raindrops/src/lib.rs +1 -1
  258. data/tracks/rust/exercises/react/README.md +3 -2
  259. data/tracks/rust/exercises/rectangles/README.md +3 -2
  260. data/tracks/rust/exercises/rna-transcription/README.md +3 -2
  261. data/tracks/rust/exercises/robot-name/README.md +3 -2
  262. data/tracks/rust/exercises/robot-simulator/README.md +3 -2
  263. data/tracks/rust/exercises/roman-numerals/README.md +3 -2
  264. data/tracks/rust/exercises/rotational-cipher/README.md +3 -2
  265. data/tracks/rust/exercises/run-length-encoding/README.md +3 -2
  266. data/tracks/rust/exercises/say/README.md +3 -2
  267. data/tracks/rust/exercises/scrabble-score/README.md +3 -2
  268. data/tracks/rust/exercises/sieve/README.md +3 -2
  269. data/tracks/rust/exercises/space-age/README.md +3 -2
  270. data/tracks/rust/exercises/sublist/README.md +3 -2
  271. data/tracks/rust/exercises/sum-of-multiples/README.md +3 -2
  272. data/tracks/rust/exercises/sum-of-multiples/src/lib.rs +1 -1
  273. data/tracks/rust/exercises/tournament/README.md +3 -2
  274. data/tracks/rust/exercises/triangle/HINTS.md +2 -2
  275. data/tracks/rust/exercises/triangle/README.md +5 -4
  276. data/tracks/rust/exercises/variable-length-quantity/README.md +3 -2
  277. data/tracks/rust/exercises/word-count/README.md +3 -2
  278. data/tracks/rust/exercises/wordy/README.md +3 -2
  279. metadata +38 -3
  280. data/tracks/ecmascript/yarn.lock +0 -3144
@@ -15,7 +15,7 @@ So say you have a matrix like so:
15
15
  It has a saddle point at (1, 0).
16
16
 
17
17
  It's called a "saddle point" because it is greater than or equal to
18
- every element in its row and the less than or equal to every element in
18
+ every element in its row and less than or equal to every element in
19
19
  its column.
20
20
 
21
21
  A matrix may have zero or more saddle points.
@@ -11,34 +11,6 @@ When X is a name or "you".
11
11
  If the given name is "Alice", the result should be "One for Alice, one for me."
12
12
  If no name is given, the result should be "One for you, one for me."
13
13
 
14
- ## Test-Driven Development
15
-
16
- As programmers mature, they eventually want to test their code.
17
-
18
- Here at Exercism we simulate [Test-Driven
19
- Development](http://en.wikipedia.org/wiki/Test-driven_development) (TDD), where
20
- you write your tests before writing any functionality. The simulation comes in
21
- the form of a pre-written test suite, which will signal that you have solved
22
- the problem.
23
-
24
- It will also provide you with a safety net to explore other solutions without
25
- breaking the functionality.
26
-
27
- ### A typical TDD workflow on Exercism:
28
-
29
- 1. Run the test file and pick one test that's failing.
30
- 2. Write some code to fix the test you picked.
31
- 3. Re-run the tests to confirm the test is now passing.
32
- 4. Repeat from step 1.
33
- 5. Submit your solution (`exercism submit /path/to/file`)
34
-
35
- ## Instructions
36
-
37
- Submissions are encouraged to be general, within reason. Having said that, it's
38
- also important not to over-engineer a solution.
39
-
40
- It's important to remember that the goal is to make code as expressive and
41
- readable as we can.
42
14
 
43
15
 
44
16
 
@@ -920,6 +920,18 @@
920
920
  ],
921
921
  "unlocked_by": "matrix",
922
922
  "uuid": "beca7d79-9237-4344-b058-66e0fa840691"
923
+ },
924
+ {
925
+ "core": false,
926
+ "difficulty": 3,
927
+ "slug": "collatz-conjecture",
928
+ "topics": [
929
+ "control_flow_if_else_statements",
930
+ "control_flow_loops",
931
+ "mathematics"
932
+ ],
933
+ "unlocked_by": "difference-of-squares",
934
+ "uuid": "bd4cd740-b78d-11e7-abc4-cec278b6b50a"
923
935
  }
924
936
  ],
925
937
  "foregone": [],
@@ -0,0 +1,43 @@
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
+ ## Running the tests
30
+
31
+ To run the tests, run the command `busted .` from within the exercise directory.
32
+
33
+ ## Further information
34
+
35
+ For more detailed information about the Lua track, including how to get help if
36
+ you're having trouble, please visit the exercism.io [Lua language page](http://exercism.io/languages/lua/about).
37
+
38
+ ## Source
39
+
40
+ 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)
41
+
42
+ ## Submitting Incomplete Solutions
43
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,33 @@
1
+ local conjecture = require('collatz-conjecture')
2
+
3
+ describe('collatz-conjecture', function()
4
+ it('zero steps for one', function()
5
+ assert.are.equal(0, conjecture(1))
6
+ end)
7
+
8
+ it('divide if even', function()
9
+ assert.are.equal(4, conjecture(16))
10
+ end)
11
+
12
+ it('even and odd steps', function()
13
+ assert.are.equal(9, conjecture(12))
14
+ end)
15
+
16
+ it('large number of even and odd steps', function()
17
+ assert.are.equal(152, conjecture(1000000))
18
+ end)
19
+
20
+ it('zero is an error', function()
21
+ assert.has_error(
22
+ function() conjecture(0) end,
23
+ 'Only positive numbers are allowed'
24
+ )
25
+ end)
26
+
27
+ it('negative value is an error', function()
28
+ assert.has_error(
29
+ function() conjecture(-15) end,
30
+ 'Only positive numbers are allowed'
31
+ )
32
+ end)
33
+ end)
@@ -0,0 +1,16 @@
1
+ return function(n)
2
+ assert(n > 0, 'Only positive numbers are allowed')
3
+
4
+ local steps = 0
5
+
6
+ while n > 1 do
7
+ if n % 2 == 0 then
8
+ n = n / 2
9
+ else
10
+ n = 3 * n + 1
11
+ end
12
+ steps = steps + 1
13
+ end
14
+
15
+ return steps
16
+ end
@@ -539,7 +539,10 @@
539
539
  "unlocked_by": null,
540
540
  "difficulty": 1,
541
541
  "topics": [
542
-
542
+ "loops",
543
+ "type_conversion",
544
+ "integers",
545
+ "matrices"
543
546
  ]
544
547
  },
545
548
  {
@@ -3,6 +3,8 @@ import unittest
3
3
  from binary_search import binary_search
4
4
 
5
5
 
6
+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
7
+
6
8
  class BinarySearchTests(unittest.TestCase):
7
9
  def test_finds_value_in_array_with_one_element(self):
8
10
  self.assertEqual(binary_search([6], 6), 0)
@@ -2,6 +2,8 @@ import unittest
2
2
 
3
3
  from change import find_minimum_coins
4
4
 
5
+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0
6
+
5
7
 
6
8
  class ChangeTest(unittest.TestCase):
7
9
  def test_single_coin_change(self):
@@ -7,43 +7,41 @@ from circular_buffer import (
7
7
  )
8
8
 
9
9
 
10
+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.1
11
+
10
12
  class CircularBufferTest(unittest.TestCase):
11
13
  def test_read_empty_buffer(self):
12
14
  buf = CircularBuffer(1)
13
15
  with self.assertRaises(BufferEmptyException):
14
16
  buf.read()
15
17
 
18
+ def test_read_just_written_item(self):
19
+ buf = CircularBuffer(1)
20
+ buf.write('1')
21
+ self.assertEqual(buf.read(), '1')
22
+
16
23
  def test_write_and_read_back_one_item(self):
17
24
  buf = CircularBuffer(1)
18
25
  buf.write('1')
19
- self.assertEqual('1', buf.read())
26
+ self.assertEqual(buf.read(), '1')
20
27
  with self.assertRaises(BufferEmptyException):
21
28
  buf.read()
22
29
 
23
- def test_write_and_read_back_multiple_items(self):
30
+ def test_write_and_read_back_multiple_items_ordered(self):
24
31
  buf = CircularBuffer(2)
25
32
  buf.write('1')
26
33
  buf.write('2')
27
34
  self.assertEqual(buf.read(), '1')
28
35
  self.assertEqual(buf.read(), '2')
29
- with self.assertRaises(BufferEmptyException):
30
- buf.read()
31
36
 
32
- def test_clearing_buffer(self):
33
- buf = CircularBuffer(3)
34
- for c in '123':
35
- buf.write(c)
36
- buf.clear()
37
- with self.assertRaises(BufferEmptyException):
38
- buf.read()
37
+ def test_full_buffer_cant_written(self):
38
+ buf = CircularBuffer(1)
39
39
  buf.write('1')
40
- buf.write('2')
41
- self.assertEqual(buf.read(), '1')
42
- buf.write('3')
43
- self.assertEqual(buf.read(), '2')
40
+ with self.assertRaises(BufferFullException):
41
+ buf.write('2')
44
42
 
45
43
  def test_alternate_write_and_read(self):
46
- buf = CircularBuffer(2)
44
+ buf = CircularBuffer(1)
47
45
  buf.write('1')
48
46
  self.assertEqual(buf.read(), '1')
49
47
  buf.write('2')
@@ -53,56 +51,64 @@ class CircularBufferTest(unittest.TestCase):
53
51
  buf = CircularBuffer(3)
54
52
  buf.write('1')
55
53
  buf.write('2')
56
- buf.read()
54
+ self.assertEqual(buf.read(), '1')
57
55
  buf.write('3')
58
- buf.read()
56
+ self.assertEqual(buf.read(), '2')
59
57
  self.assertEqual(buf.read(), '3')
60
58
 
61
- def test_write_full_buffer(self):
62
- buf = CircularBuffer(2)
59
+ def test_clearing_buffer(self):
60
+ buf = CircularBuffer(1)
63
61
  buf.write('1')
64
- buf.write('2')
65
- with self.assertRaises(BufferFullException):
66
- buf.write('A')
62
+ buf.clear()
63
+ with self.assertRaises(BufferEmptyException):
64
+ buf.read()
67
65
 
68
- def test_overwrite_full_buffer(self):
69
- buf = CircularBuffer(2)
66
+ def test_clear_free_buffer_for_write(self):
67
+ buf = CircularBuffer(1)
70
68
  buf.write('1')
69
+ buf.clear()
71
70
  buf.write('2')
72
- buf.overwrite('A')
73
71
  self.assertEqual(buf.read(), '2')
74
- self.assertEqual(buf.read(), 'A')
75
- with self.assertRaises(BufferEmptyException):
76
- buf.read()
72
+
73
+ def test_clear_does_nothin_empty_buffer(self):
74
+ buf = CircularBuffer(1)
75
+ buf.clear()
76
+ buf.write('1')
77
+ self.assertEqual(buf.read(), '1')
77
78
 
78
79
  def test_overwrite_non_full_buffer(self):
79
80
  buf = CircularBuffer(2)
80
- buf.overwrite('1')
81
+ buf.write('1')
81
82
  buf.overwrite('2')
82
83
  self.assertEqual(buf.read(), '1')
83
84
  self.assertEqual(buf.read(), '2')
84
- with self.assertRaises(BufferEmptyException):
85
- buf.read()
86
85
 
87
- def test_alternate_read_and_overwrite(self):
88
- buf = CircularBuffer(5)
89
- for c in '123':
90
- buf.write(c)
91
- buf.read()
92
- buf.read()
86
+ def test_overwrite_replaces_oldest_item(self):
87
+ buf = CircularBuffer(2)
88
+ buf.write('1')
89
+ buf.write('2')
90
+ buf.overwrite('3')
91
+ self.assertEqual(buf.read(), '2')
92
+ self.assertEqual(buf.read(), '3')
93
+
94
+ def test_write_full_buffer(self):
95
+ buf = CircularBuffer(2)
96
+ buf.write('1')
97
+ buf.write('2')
98
+ with self.assertRaises(BufferFullException):
99
+ buf.write('A')
100
+
101
+ def test_over_write_replaces_oldest_remaning_item(self):
102
+ buf = CircularBuffer(3)
103
+ buf.write('1')
104
+ buf.write('2')
105
+ buf.write('3')
106
+ self.assertEqual(buf.read(), '1')
93
107
  buf.write('4')
94
- buf.read()
95
- for c in '5678':
96
- buf.write(c)
97
- buf.overwrite('A')
98
- buf.overwrite('B')
99
- self.assertEqual(buf.read(), '6')
100
- self.assertEqual(buf.read(), '7')
101
- self.assertEqual(buf.read(), '8')
102
- self.assertEqual(buf.read(), 'A')
103
- self.assertEqual(buf.read(), 'B')
104
- with self.assertRaises(BufferEmptyException):
105
- buf.read()
108
+ buf.overwrite('5')
109
+ self.assertEqual(buf.read(), '3')
110
+ self.assertEqual(buf.read(), '4')
111
+ self.assertEqual(buf.read(), '5')
106
112
 
107
113
 
108
114
  if __name__ == '__main__':
@@ -11,8 +11,10 @@ def is_integer(string):
11
11
 
12
12
 
13
13
  def evaluate(input_data):
14
+ if not input_data:
15
+ return []
14
16
  defines = {}
15
- while input_data[0][0] == ':':
17
+ while input_data[0][:1] == ':':
16
18
  values = input_data.pop(0).split()
17
19
  values.pop()
18
20
  values.pop(0)
@@ -4,13 +4,30 @@ from forth import evaluate, StackUnderflowError
4
4
 
5
5
 
6
6
  # Tests adapted from `problem-specifications//canonical-data.json` @ v1.2.0
7
+ # Tests for case-insensitivity are track-specific
8
+
9
+ class ForthParsingTest(unittest.TestCase):
10
+ def test_empty_input_empty_stack(self):
11
+ input_data = []
12
+ expected = []
13
+ self.assertEqual(evaluate(input_data), expected)
14
+
15
+ def test_empty_line_empty_stack(self):
16
+ input_data = [""]
17
+ expected = []
18
+ self.assertEqual(evaluate(input_data), expected)
19
+
20
+ def test_numbers_just_get_pushed_to_stack(self):
21
+ input_data = ["1 2 3 4 5"]
22
+ expected = [1, 2, 3, 4, 5]
23
+ self.assertEqual(evaluate(input_data), expected)
7
24
 
8
25
 
9
26
  class ForthAdditionTest(unittest.TestCase):
10
27
  def test_can_add_two_numbers(self):
11
28
  input_data = ["1 2 +"]
12
29
  expected = [3]
13
- self.assertEqual(expected, evaluate(input_data))
30
+ self.assertEqual(evaluate(input_data), expected)
14
31
 
15
32
  def test_errors_if_there_is_nothing_on_the_stack(self):
16
33
  input_data = ["+"]
@@ -27,7 +44,7 @@ class ForthSubtractionTest(unittest.TestCase):
27
44
  def test_can_subtract_two_numbers(self):
28
45
  input_data = ["3 4 -"]
29
46
  expected = [-1]
30
- self.assertEqual(expected, evaluate(input_data))
47
+ self.assertEqual(evaluate(input_data), expected)
31
48
 
32
49
  def test_errors_if_there_is_nothing_on_the_stack(self):
33
50
  input_data = ["-"]
@@ -44,7 +61,7 @@ class ForthMultiplicationTest(unittest.TestCase):
44
61
  def test_can_multiply_two_numbers(self):
45
62
  input_data = ["2 4 *"]
46
63
  expected = [8]
47
- self.assertEqual(expected, evaluate(input_data))
64
+ self.assertEqual(evaluate(input_data), expected)
48
65
 
49
66
  def test_errors_if_there_is_nothing_on_the_stack(self):
50
67
  input_data = ["*"]
@@ -59,14 +76,14 @@ class ForthMultiplicationTest(unittest.TestCase):
59
76
 
60
77
  class ForthDivisionTest(unittest.TestCase):
61
78
  def test_can_divide_two_numbers(self):
62
- input_data = ["3 4 -"]
63
- expected = [-1]
64
- self.assertEqual(expected, evaluate(input_data))
79
+ input_data = ["12 3 /"]
80
+ expected = [4]
81
+ self.assertEqual(evaluate(input_data), expected)
65
82
 
66
83
  def test_performs_integer_division(self):
67
84
  input_data = ["8 3 /"]
68
85
  expected = [2]
69
- self.assertEqual(expected, evaluate(input_data))
86
+ self.assertEqual(evaluate(input_data), expected)
70
87
 
71
88
  def test_errors_if_dividing_by_zero(self):
72
89
  input_data = ["4 0 /"]
@@ -88,24 +105,24 @@ class ForthCombinedArithmeticTest(unittest.TestCase):
88
105
  def test_addition_and_subtraction(self):
89
106
  input_data = ["1 2 + 4 -"]
90
107
  expected = [-1]
91
- self.assertEqual(expected, evaluate(input_data))
108
+ self.assertEqual(evaluate(input_data), expected)
92
109
 
93
110
  def test_multiplication_and_division(self):
94
111
  input_data = ["2 4 * 3 /"]
95
112
  expected = [2]
96
- self.assertEqual(expected, evaluate(input_data))
113
+ self.assertEqual(evaluate(input_data), expected)
97
114
 
98
115
 
99
116
  class ForthDupTest(unittest.TestCase):
100
117
  def test_copies_the_top_value_on_the_stack(self):
101
118
  input_data = ["1 DUP"]
102
119
  expected = [1, 1]
103
- self.assertEqual(expected, evaluate(input_data))
120
+ self.assertEqual(evaluate(input_data), expected)
104
121
 
105
122
  def test_is_case_insensitive(self):
106
123
  input_data = ["1 2 Dup"]
107
124
  expected = [1, 2, 2]
108
- self.assertEqual(expected, evaluate(input_data))
125
+ self.assertEqual(evaluate(input_data), expected)
109
126
 
110
127
  def test_errors_if_there_is_nothing_on_the_stack(self):
111
128
  input_data = ["dup"]
@@ -117,17 +134,17 @@ class ForthDropTest(unittest.TestCase):
117
134
  def test_removes_the_top_value_on_the_stack_if_it_is_the_only_one(self):
118
135
  input_data = ["1 DROP"]
119
136
  expected = []
120
- self.assertEqual(expected, evaluate(input_data))
137
+ self.assertEqual(evaluate(input_data), expected)
121
138
 
122
139
  def test_removes_the_top_value_on_the_stack_if_it_not_the_only_one(self):
123
140
  input_data = ["3 4 DROP"]
124
141
  expected = [3]
125
- self.assertEqual(expected, evaluate(input_data))
142
+ self.assertEqual(evaluate(input_data), expected)
126
143
 
127
144
  def test_is_case_insensitive(self):
128
145
  input_data = ["1 2 Drop"]
129
146
  expected = [1]
130
- self.assertEqual(expected, evaluate(input_data))
147
+ self.assertEqual(evaluate(input_data), expected)
131
148
 
132
149
  def test_errors_if_there_is_nothing_on_the_stack(self):
133
150
  input_data = ["drop"]
@@ -139,17 +156,17 @@ class ForthSwapTest(unittest.TestCase):
139
156
  def test_swaps_only_two_values_on_stack(self):
140
157
  input_data = ["1 2 SWAP"]
141
158
  expected = [2, 1]
142
- self.assertEqual(expected, evaluate(input_data))
159
+ self.assertEqual(evaluate(input_data), expected)
143
160
 
144
161
  def test_swaps_two_two_values_on_stack(self):
145
162
  input_data = ["1 2 3 SWAP"]
146
163
  expected = [1, 3, 2]
147
- self.assertEqual(expected, evaluate(input_data))
164
+ self.assertEqual(evaluate(input_data), expected)
148
165
 
149
166
  def test_is_case_insensitive(self):
150
167
  input_data = ["3 4 Swap"]
151
168
  expected = [4, 3]
152
- self.assertEqual(expected, evaluate(input_data))
169
+ self.assertEqual(evaluate(input_data), expected)
153
170
 
154
171
  def test_errors_if_there_is_nothing_on_the_stack(self):
155
172
  input_data = ["swap"]
@@ -166,17 +183,17 @@ class ForthOverTest(unittest.TestCase):
166
183
  def test_copies_the_second_element_if_there_are_only_two(self):
167
184
  input_data = ["1 2 OVER"]
168
185
  expected = [1, 2, 1]
169
- self.assertEqual(expected, evaluate(input_data))
186
+ self.assertEqual(evaluate(input_data), expected)
170
187
 
171
188
  def test_copies_the_second_element_if_there_are_more_than_two(self):
172
189
  input_data = ["1 2 3 OVER"]
173
190
  expected = [1, 2, 3, 2]
174
- self.assertEqual(expected, evaluate(input_data))
191
+ self.assertEqual(evaluate(input_data), expected)
175
192
 
176
193
  def test_is_case_insensitive(self):
177
194
  input_data = ["3 4 Over"]
178
195
  expected = [3, 4, 3]
179
- self.assertEqual(expected, evaluate(input_data))
196
+ self.assertEqual(evaluate(input_data), expected)
180
197
 
181
198
  def test_errors_if_there_is_nothing_on_the_stack(self):
182
199
  input_data = ["over"]
@@ -196,7 +213,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
196
213
  "1 dup-twice"
197
214
  ]
198
215
  expected = [1, 1, 1]
199
- self.assertEqual(expected, evaluate(input_data))
216
+ self.assertEqual(evaluate(input_data), expected)
200
217
 
201
218
  def test_execute_in_the_right_order(self):
202
219
  input_data = [
@@ -204,7 +221,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
204
221
  "countup"
205
222
  ]
206
223
  expected = [1, 2, 3]
207
- self.assertEqual(expected, evaluate(input_data))
224
+ self.assertEqual(evaluate(input_data), expected)
208
225
 
209
226
  def test_can_override_other_user_defined_words(self):
210
227
  input_data = [
@@ -213,7 +230,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
213
230
  "1 foo"
214
231
  ]
215
232
  expected = [1, 1, 1]
216
- self.assertEqual(expected, evaluate(input_data))
233
+ self.assertEqual(evaluate(input_data), expected)
217
234
 
218
235
  def test_can_override_built_in_words(self):
219
236
  input_data = [
@@ -221,7 +238,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
221
238
  "1 swap"
222
239
  ]
223
240
  expected = [1, 1]
224
- self.assertEqual(expected, evaluate(input_data))
241
+ self.assertEqual(evaluate(input_data), expected)
225
242
 
226
243
  def test_can_override_built_in_operators(self):
227
244
  input_data = [
@@ -229,7 +246,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
229
246
  "3 4 +"
230
247
  ]
231
248
  expected = [12]
232
- self.assertEqual(expected, evaluate(input_data))
249
+ self.assertEqual(evaluate(input_data), expected)
233
250
 
234
251
  def test_is_case_insensitive(self):
235
252
  input_data = [
@@ -237,7 +254,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
237
254
  "1 FOO"
238
255
  ]
239
256
  expected = [1, 1]
240
- self.assertEqual(expected, evaluate(input_data))
257
+ self.assertEqual(evaluate(input_data), expected)
241
258
 
242
259
  def test_cannot_redefine_numbers(self):
243
260
  input_data = [": 1 2 ;"]