trackler 2.2.1.53 → 2.2.1.54

Sign up to get free protection for your applications and to get access to all the features.
Files changed (274) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/nth-prime/canonical-data.json +2 -7
  4. data/problem-specifications/exercises/zebra-puzzle/canonical-data.json +16 -0
  5. data/tracks/c/config.json +11 -1
  6. data/tracks/c/docs/C_STYLE_GUIDE.md +142 -0
  7. data/tracks/c/exercises/collatz-conjecture/README.md +65 -0
  8. data/tracks/c/exercises/collatz-conjecture/makefile +15 -0
  9. data/tracks/c/exercises/collatz-conjecture/src/collatz_conjecture.h +8 -0
  10. data/tracks/c/exercises/collatz-conjecture/src/example.c +23 -0
  11. data/tracks/c/exercises/collatz-conjecture/test/test_collatz_conjecture.c +48 -0
  12. data/tracks/c/exercises/collatz-conjecture/test/vendor/unity.c +1300 -0
  13. data/tracks/c/exercises/collatz-conjecture/test/vendor/unity.h +274 -0
  14. data/tracks/c/exercises/collatz-conjecture/test/vendor/unity_internals.h +701 -0
  15. data/tracks/cfml/tasks/GenerateReadme.cfc +5 -5
  16. data/tracks/erlang/testgen/src/testgen.erl +99 -17
  17. data/tracks/erlang/testgen/src/tg_file_tools.erl +3 -3
  18. data/tracks/erlang/testgen/src/tgen.erl +15 -7
  19. data/tracks/haskell/config.json +15 -3
  20. data/tracks/java/scripts/canonical_data_check.sh +1 -1
  21. data/tracks/javascript/config.json +12 -0
  22. data/tracks/javascript/exercises/difference-of-squares/README.md +1 -1
  23. data/tracks/javascript/exercises/sum-of-multiples/README.md +1 -1
  24. data/tracks/javascript/exercises/zipper/README.md +55 -0
  25. data/tracks/javascript/exercises/zipper/example.js +100 -0
  26. data/tracks/javascript/exercises/zipper/zipper.spec.js +77 -0
  27. data/tracks/julia/config.json +12 -0
  28. data/tracks/julia/exercises/triangle/README.md +30 -0
  29. data/tracks/julia/exercises/triangle/example.jl +25 -0
  30. data/tracks/julia/exercises/triangle/runtests.jl +64 -0
  31. data/tracks/julia/exercises/triangle/triangle.jl +8 -0
  32. data/tracks/kotlin/exercises/leap/.meta/version +1 -1
  33. data/tracks/kotlin/exercises/leap/src/test/kotlin/LeapTest.kt +1 -1
  34. data/tracks/kotlin/scripts/canonical_data_check.sh +1 -1
  35. data/tracks/perl6/bin/README.md +1 -4
  36. data/tracks/perl6/bin/exercise-gen.pl6 +3 -4
  37. data/tracks/perl6/exercises/accumulate/example.yaml +2 -2
  38. data/tracks/perl6/exercises/all-your-base/example.yaml +9 -9
  39. data/tracks/perl6/exercises/allergies/example.yaml +7 -7
  40. data/tracks/perl6/exercises/anagram/example.yaml +3 -3
  41. data/tracks/perl6/exercises/atbash-cipher/example.yaml +3 -3
  42. data/tracks/perl6/exercises/bob/example.yaml +4 -4
  43. data/tracks/perl6/exercises/clock/example.yaml +6 -6
  44. data/tracks/perl6/exercises/flatten-array/example.yaml +4 -4
  45. data/tracks/perl6/exercises/grade-school/example.yaml +6 -6
  46. data/tracks/perl6/exercises/grains/example.yaml +3 -3
  47. data/tracks/perl6/exercises/hello-world/example.yaml +5 -5
  48. data/tracks/perl6/exercises/leap/example.yaml +4 -4
  49. data/tracks/perl6/exercises/linked-list/example.yaml +14 -14
  50. data/tracks/perl6/exercises/luhn/example.yaml +3 -3
  51. data/tracks/perl6/exercises/phone-number/example.yaml +3 -3
  52. data/tracks/perl6/exercises/raindrops/example.yaml +3 -3
  53. data/tracks/perl6/exercises/rna-transcription/example.yaml +3 -3
  54. data/tracks/perl6/exercises/robot-name/example.yaml +8 -8
  55. data/tracks/perl6/exercises/scrabble-score/example.yaml +3 -3
  56. data/tracks/perl6/exercises/space-age/example.yaml +8 -8
  57. data/tracks/perl6/exercises/word-count/example.yaml +3 -3
  58. data/tracks/perl6/exercises/wordy/example.yaml +3 -3
  59. data/tracks/python/config.json +14 -0
  60. data/tracks/python/config/maintainers.json +30 -0
  61. data/tracks/python/docs/EXERCISE_README_INSERT.md +1 -2
  62. data/tracks/python/exercises/accumulate/README.md +1 -5
  63. data/tracks/python/exercises/acronym/README.md +1 -3
  64. data/tracks/python/exercises/all-your-base/README.md +2 -3
  65. data/tracks/python/exercises/all-your-base/all_your_base_test.py +13 -13
  66. data/tracks/python/exercises/allergies/README.md +1 -3
  67. data/tracks/python/exercises/alphametics/README.md +3 -4
  68. data/tracks/python/exercises/anagram/README.md +1 -2
  69. data/tracks/python/exercises/atbash-cipher/README.md +3 -3
  70. data/tracks/python/exercises/beer-song/README.md +2 -3
  71. data/tracks/python/exercises/binary-search/README.md +1 -2
  72. data/tracks/python/exercises/binary/README.md +3 -2
  73. data/tracks/python/exercises/bob/README.md +1 -2
  74. data/tracks/python/exercises/book-store/README.md +6 -7
  75. data/tracks/python/exercises/bracket-push/README.md +1 -2
  76. data/tracks/python/exercises/change/README.md +2 -3
  77. data/tracks/python/exercises/circular-buffer/README.md +14 -8
  78. data/tracks/python/exercises/clock/README.md +1 -2
  79. data/tracks/python/exercises/clock/clock_test.py +2 -0
  80. data/tracks/python/exercises/collatz-conjecture/.meta/hints.md +3 -0
  81. data/tracks/python/exercises/collatz-conjecture/README.md +6 -19
  82. data/tracks/python/exercises/complex-numbers/README.md +28 -2
  83. data/tracks/python/exercises/crypto-square/README.md +11 -10
  84. data/tracks/python/exercises/diamond/README.md +7 -8
  85. data/tracks/python/exercises/difference-of-squares/README.md +1 -2
  86. data/tracks/python/exercises/diffie-hellman/.meta/hints.md +1 -1
  87. data/tracks/python/exercises/diffie-hellman/README.md +3 -2
  88. data/tracks/python/exercises/error-handling/.meta/hints.md +8 -0
  89. data/tracks/python/exercises/error-handling/README.md +10 -2
  90. data/tracks/python/exercises/error-handling/error_handling_test.py +15 -3
  91. data/tracks/python/exercises/etl/README.md +3 -2
  92. data/tracks/python/exercises/flatten-array/README.md +2 -4
  93. data/tracks/python/exercises/food-chain/README.md +3 -4
  94. data/tracks/python/exercises/forth/README.md +2 -6
  95. data/tracks/python/exercises/gigasecond/README.md +1 -2
  96. data/tracks/python/exercises/grade-school/README.md +1 -3
  97. data/tracks/python/exercises/grains/README.md +1 -3
  98. data/tracks/python/exercises/grep/README.md +13 -14
  99. data/tracks/python/exercises/hamming/README.md +1 -2
  100. data/tracks/python/exercises/hamming/hamming_test.py +6 -6
  101. data/tracks/python/exercises/hello-world/README.md +1 -2
  102. data/tracks/python/exercises/hexadecimal/README.md +1 -2
  103. data/tracks/python/exercises/hexadecimal/example.py +6 -6
  104. data/tracks/python/exercises/house/README.md +2 -4
  105. data/tracks/python/exercises/isogram/README.md +3 -3
  106. data/tracks/python/exercises/kindergarten-garden/README.md +14 -15
  107. data/tracks/python/exercises/largest-series-product/README.md +1 -2
  108. data/tracks/python/exercises/leap/README.md +2 -3
  109. data/tracks/python/exercises/linked-list/README.md +11 -12
  110. data/tracks/python/exercises/list-ops/README.md +1 -2
  111. data/tracks/python/exercises/luhn/README.md +8 -9
  112. data/tracks/python/exercises/markdown/README.md +1 -6
  113. data/tracks/python/exercises/matrix/README.md +7 -6
  114. data/tracks/python/exercises/meetup/README.md +2 -4
  115. data/tracks/python/exercises/minesweeper/README.md +1 -2
  116. data/tracks/python/exercises/nth-prime/README.md +1 -2
  117. data/tracks/python/exercises/nucleotide-count/README.md +9 -24
  118. data/tracks/python/exercises/ocr-numbers/README.md +6 -7
  119. data/tracks/python/exercises/octal/README.md +7 -4
  120. data/tracks/python/exercises/palindrome-products/README.md +16 -18
  121. data/tracks/python/exercises/pangram/README.md +2 -3
  122. data/tracks/python/exercises/pascals-triangle/README.md +2 -3
  123. data/tracks/python/exercises/perfect-numbers/README.md +3 -4
  124. data/tracks/python/exercises/phone-number/README.md +4 -4
  125. data/tracks/python/exercises/pig-latin/README.md +1 -2
  126. data/tracks/python/exercises/point-mutations/README.md +1 -2
  127. data/tracks/python/exercises/poker/README.md +1 -2
  128. data/tracks/python/exercises/prime-factors/README.md +1 -2
  129. data/tracks/python/exercises/protein-translation/README.md +5 -7
  130. data/tracks/python/exercises/proverb/README.md +12 -11
  131. data/tracks/python/exercises/pythagorean-triplet/README.md +4 -5
  132. data/tracks/python/exercises/queen-attack/README.md +2 -3
  133. data/tracks/python/exercises/rail-fence-cipher/README.md +13 -9
  134. data/tracks/python/exercises/raindrops/README.md +1 -2
  135. data/tracks/python/exercises/rectangles/README.md +8 -9
  136. data/tracks/python/exercises/rectangles/example.py +3 -3
  137. data/tracks/python/exercises/rna-transcription/README.md +1 -2
  138. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +4 -3
  139. data/tracks/python/exercises/robot-name/README.md +1 -2
  140. data/tracks/python/exercises/robot-simulator/README.md +1 -2
  141. data/tracks/python/exercises/roman-numerals/README.md +2 -3
  142. data/tracks/python/exercises/rotational-cipher/README.md +3 -3
  143. data/tracks/python/exercises/run-length-encoding/README.md +5 -6
  144. data/tracks/python/exercises/run-length-encoding/example.py +2 -2
  145. data/tracks/python/exercises/saddle-points/README.md +2 -3
  146. data/tracks/python/exercises/say/README.md +1 -2
  147. data/tracks/python/exercises/scale-generator/README.md +1 -3
  148. data/tracks/python/exercises/scrabble-score/README.md +4 -3
  149. data/tracks/python/exercises/secret-handshake/README.md +2 -3
  150. data/tracks/python/exercises/series/README.md +1 -2
  151. data/tracks/python/exercises/sieve/README.md +1 -2
  152. data/tracks/python/exercises/simple-cipher/README.md +3 -4
  153. data/tracks/python/exercises/space-age/README.md +2 -3
  154. data/tracks/python/exercises/space-age/space_age_test.py +18 -29
  155. data/tracks/python/exercises/strain/README.md +1 -2
  156. data/tracks/python/exercises/sublist/README.md +1 -2
  157. data/tracks/python/exercises/sum-of-multiples/README.md +1 -5
  158. data/tracks/python/exercises/tournament/README.md +6 -7
  159. data/tracks/python/exercises/transpose/README.md +8 -9
  160. data/tracks/python/exercises/tree-building/README.md +25 -0
  161. data/tracks/python/exercises/tree-building/example.py +46 -0
  162. data/tracks/python/exercises/tree-building/tree_building.py +50 -0
  163. data/tracks/python/exercises/tree-building/tree_building_test.py +183 -0
  164. data/tracks/python/exercises/triangle/README.md +10 -8
  165. data/tracks/python/exercises/trinary/README.md +2 -3
  166. data/tracks/python/exercises/twelve-days/README.md +2 -3
  167. data/tracks/python/exercises/two-bucket/README.md +4 -5
  168. data/tracks/python/exercises/two-bucket/two_bucket_test.py +2 -0
  169. data/tracks/python/exercises/two-fer/README.md +4 -5
  170. data/tracks/python/exercises/two-fer/two_fer_test.py +5 -2
  171. data/tracks/python/exercises/variable-length-quantity/README.md +7 -9
  172. data/tracks/python/exercises/word-count/README.md +2 -4
  173. data/tracks/python/exercises/word-search/README.md +2 -3
  174. data/tracks/python/exercises/wordy/README.md +1 -7
  175. data/tracks/python/exercises/wordy/example.py +8 -8
  176. data/tracks/python/exercises/wordy/wordy_test.py +36 -32
  177. data/tracks/python/exercises/zebra-puzzle/README.md +1 -2
  178. data/tracks/python/requirements-travis.txt +1 -1
  179. data/tracks/ruby/config.json +11 -0
  180. data/tracks/ruby/docs/TESTS.md +6 -0
  181. data/tracks/ruby/exercises/pangram/.meta/.version +1 -1
  182. data/tracks/ruby/exercises/pangram/.meta/solutions/pangram.rb +1 -1
  183. data/tracks/ruby/exercises/pangram/pangram_test.rb +11 -4
  184. data/tracks/ruby/exercises/two-fer/.meta/.version +1 -0
  185. data/tracks/ruby/exercises/two-fer/.meta/generator/two_fer_case.rb +12 -0
  186. data/tracks/ruby/exercises/two-fer/.meta/solutions/two_fer.rb +9 -0
  187. data/tracks/ruby/exercises/two-fer/README.md +69 -0
  188. data/tracks/ruby/exercises/two-fer/two_fer_test.rb +42 -0
  189. data/tracks/rust/config.json +12 -0
  190. data/tracks/rust/exercises/binary-search/.meta/hints.md +38 -0
  191. data/tracks/rust/exercises/binary-search/Cargo.lock +4 -0
  192. data/tracks/rust/exercises/binary-search/Cargo.toml +6 -0
  193. data/tracks/rust/exercises/binary-search/README.md +113 -0
  194. data/tracks/rust/exercises/binary-search/example.rs +29 -0
  195. data/tracks/rust/exercises/binary-search/src/lib.rs +0 -0
  196. data/tracks/rust/exercises/binary-search/tests/binary-search.rs +96 -0
  197. data/tracks/typescript/common/package.json +6 -6
  198. data/tracks/typescript/common/yarn.lock +929 -610
  199. data/tracks/typescript/exercises/acronym/package.json +6 -6
  200. data/tracks/typescript/exercises/acronym/yarn.lock +929 -610
  201. data/tracks/typescript/exercises/anagram/package.json +6 -6
  202. data/tracks/typescript/exercises/anagram/yarn.lock +929 -610
  203. data/tracks/typescript/exercises/beer-song/package.json +6 -6
  204. data/tracks/typescript/exercises/beer-song/yarn.lock +929 -610
  205. data/tracks/typescript/exercises/binary-search-tree/package.json +6 -6
  206. data/tracks/typescript/exercises/binary-search-tree/yarn.lock +929 -610
  207. data/tracks/typescript/exercises/binary-search/package.json +6 -6
  208. data/tracks/typescript/exercises/binary-search/yarn.lock +929 -610
  209. data/tracks/typescript/exercises/bob/package.json +6 -6
  210. data/tracks/typescript/exercises/bob/yarn.lock +929 -610
  211. data/tracks/typescript/exercises/circular-buffer/package.json +6 -6
  212. data/tracks/typescript/exercises/circular-buffer/yarn.lock +929 -610
  213. data/tracks/typescript/exercises/clock/package.json +6 -6
  214. data/tracks/typescript/exercises/clock/yarn.lock +929 -610
  215. data/tracks/typescript/exercises/difference-of-squares/package.json +6 -6
  216. data/tracks/typescript/exercises/difference-of-squares/yarn.lock +929 -610
  217. data/tracks/typescript/exercises/etl/package.json +6 -6
  218. data/tracks/typescript/exercises/etl/yarn.lock +929 -610
  219. data/tracks/typescript/exercises/food-chain/package.json +6 -6
  220. data/tracks/typescript/exercises/food-chain/yarn.lock +929 -610
  221. data/tracks/typescript/exercises/gigasecond/package.json +6 -6
  222. data/tracks/typescript/exercises/gigasecond/yarn.lock +929 -610
  223. data/tracks/typescript/exercises/grade-school/package.json +6 -6
  224. data/tracks/typescript/exercises/grade-school/yarn.lock +929 -610
  225. data/tracks/typescript/exercises/hamming/package.json +6 -6
  226. data/tracks/typescript/exercises/hamming/yarn.lock +929 -610
  227. data/tracks/typescript/exercises/hello-world/README.md +354 -0
  228. data/tracks/typescript/exercises/hello-world/package.json +6 -6
  229. data/tracks/typescript/exercises/hello-world/yarn.lock +929 -610
  230. data/tracks/typescript/exercises/largest-series-product/package.json +6 -6
  231. data/tracks/typescript/exercises/largest-series-product/yarn.lock +929 -610
  232. data/tracks/typescript/exercises/leap/package.json +6 -6
  233. data/tracks/typescript/exercises/leap/yarn.lock +929 -610
  234. data/tracks/typescript/exercises/linked-list/package.json +6 -6
  235. data/tracks/typescript/exercises/linked-list/yarn.lock +929 -610
  236. data/tracks/typescript/exercises/nth-prime/package.json +6 -6
  237. data/tracks/typescript/exercises/nth-prime/yarn.lock +929 -610
  238. data/tracks/typescript/exercises/pangram/package.json +6 -6
  239. data/tracks/typescript/exercises/pangram/yarn.lock +929 -610
  240. data/tracks/typescript/exercises/pascals-triangle/package.json +6 -6
  241. data/tracks/typescript/exercises/pascals-triangle/yarn.lock +929 -610
  242. data/tracks/typescript/exercises/phone-number/package.json +6 -6
  243. data/tracks/typescript/exercises/phone-number/yarn.lock +929 -610
  244. data/tracks/typescript/exercises/prime-factors/package.json +6 -6
  245. data/tracks/typescript/exercises/prime-factors/yarn.lock +929 -610
  246. data/tracks/typescript/exercises/raindrops/package.json +6 -6
  247. data/tracks/typescript/exercises/raindrops/yarn.lock +929 -610
  248. data/tracks/typescript/exercises/rna-transcription/package.json +6 -6
  249. data/tracks/typescript/exercises/rna-transcription/yarn.lock +929 -610
  250. data/tracks/typescript/exercises/robot-name/package.json +6 -6
  251. data/tracks/typescript/exercises/robot-name/yarn.lock +929 -610
  252. data/tracks/typescript/exercises/robot-simulator/package.json +6 -6
  253. data/tracks/typescript/exercises/robot-simulator/yarn.lock +929 -610
  254. data/tracks/typescript/exercises/rotational-cipher/package.json +6 -6
  255. data/tracks/typescript/exercises/rotational-cipher/yarn.lock +929 -610
  256. data/tracks/typescript/exercises/say/package.json +6 -6
  257. data/tracks/typescript/exercises/say/yarn.lock +929 -610
  258. data/tracks/typescript/exercises/scrabble-score/package.json +6 -6
  259. data/tracks/typescript/exercises/scrabble-score/yarn.lock +929 -610
  260. data/tracks/typescript/exercises/series/package.json +6 -6
  261. data/tracks/typescript/exercises/series/yarn.lock +929 -610
  262. data/tracks/typescript/exercises/space-age/package.json +6 -6
  263. data/tracks/typescript/exercises/space-age/yarn.lock +929 -610
  264. data/tracks/typescript/exercises/strain/package.json +6 -6
  265. data/tracks/typescript/exercises/strain/yarn.lock +929 -610
  266. data/tracks/typescript/exercises/sum-of-multiples/package.json +6 -6
  267. data/tracks/typescript/exercises/sum-of-multiples/yarn.lock +929 -610
  268. data/tracks/typescript/exercises/triangle/package.json +6 -6
  269. data/tracks/typescript/exercises/triangle/yarn.lock +929 -610
  270. data/tracks/typescript/exercises/word-count/package.json +6 -6
  271. data/tracks/typescript/exercises/word-count/yarn.lock +929 -610
  272. data/tracks/typescript/exercises/wordy/package.json +6 -6
  273. data/tracks/typescript/exercises/wordy/yarn.lock +929 -610
  274. metadata +37 -2
@@ -0,0 +1,77 @@
1
+ var Zipper = require('./zipper');
2
+
3
+ // Tests adapted from `problem-specifications/zipper/canonical-data.json` @ v1.0.0
4
+
5
+ function bt(value, left, right) {
6
+ return {
7
+ value: value,
8
+ left: left,
9
+ right: right
10
+ };
11
+ }
12
+
13
+ function leaf(value) {
14
+ return bt(value, null, null);
15
+ }
16
+
17
+ describe('Zipper', function () {
18
+ var t1 = bt(1, bt(2, null, leaf(3)), leaf(4));
19
+ var t2 = bt(1, bt(5, null, leaf(3)), leaf(4));
20
+ var t3 = bt(1, bt(2, leaf(5), leaf(3)), leaf(4));
21
+ var t4 = bt(1, leaf(2), leaf(4));
22
+ var t5 = bt(1, bt(2, null, leaf(3)), bt(6, leaf(7), leaf(8)));
23
+ var t6 = bt(1, bt(2, null, leaf(5)), leaf(4));
24
+ var zipper;
25
+
26
+ beforeEach(function () {
27
+ zipper = Zipper.fromTree(t1);
28
+ });
29
+
30
+ it('data is retained', function () {
31
+ expect(zipper.toTree(t1)).toEqual(t1);
32
+ });
33
+
34
+ xit('left, right and value', function () {
35
+ expect(zipper.left().right().value()).toEqual(3);
36
+ });
37
+
38
+ xit('dead end', function () {
39
+ expect(zipper.left().left()).toBe(null);
40
+ });
41
+
42
+ xit('tree from deep focus', function () {
43
+ expect(zipper.left().right().toTree()).toEqual(t1);
44
+ });
45
+
46
+ xit('traversing up from top', function () {
47
+ expect(zipper.up()).toEqual(null);
48
+ });
49
+
50
+ xit('left, right and up', function () {
51
+ expect(zipper.left().up().right().up().left().right().value()).toEqual(3);
52
+ });
53
+
54
+ xit('setValue', function () {
55
+ expect(zipper.left().setValue(5).toTree()).toEqual(t2);
56
+ });
57
+
58
+ xit('setValue after traversing up', function () {
59
+ expect(zipper.left().right().up().setValue(5).toTree()).toEqual(t2);
60
+ });
61
+
62
+ xit('setLeft with leaf', function () {
63
+ expect(zipper.left().setLeft(leaf(5)).toTree()).toEqual(t3);
64
+ });
65
+
66
+ xit('setRight with null', function () {
67
+ expect(zipper.left().setRight(null).toTree()).toEqual(t4);
68
+ });
69
+
70
+ xit('setRight with subtree', function () {
71
+ expect(zipper.setRight(bt(6, leaf(7), leaf(8))).toTree()).toEqual(t5);
72
+ });
73
+
74
+ xit('setValue on deep focus', function () {
75
+ expect(zipper.left().right().setValue(5).toTree()).toEqual(t6);
76
+ });
77
+ });
@@ -308,6 +308,18 @@
308
308
  "regular_expressions"
309
309
  ]
310
310
  },
311
+ {
312
+ "uuid": "7ea2903f-049b-ed80-3f87-73945ebf3d4577b715e",
313
+ "slug": "triangle",
314
+ "core": false,
315
+ "unlocked_by": null,
316
+ "difficulty": 1,
317
+ "topics": [
318
+ "conditionals",
319
+ "functional abstraction",
320
+ "mathematics"
321
+ ]
322
+ },
311
323
  {
312
324
  "uuid": "e5a6d640-cd76-4453-8247-fd34ffed4fe5",
313
325
  "slug": "transpose",
@@ -0,0 +1,30 @@
1
+ # Triangle
2
+
3
+ Determine if a triangle is equilateral, isosceles, or scalene.
4
+
5
+ An _equilateral_ triangle has all three sides the same length.
6
+
7
+ An _isosceles_ triangle has at least two sides the same length. (It is sometimes
8
+ specified as having exactly two sides the same length, but for the purposes of
9
+ this exercise we'll say at least two.)
10
+
11
+ A _scalene_ triangle has all sides of different lengths.
12
+
13
+ ## Note
14
+
15
+ For a shape to be a triangle at all, all sides have to be of length > 0, and
16
+ the sum of the lengths of any two sides must be greater than or equal to the
17
+ length of the third side. See [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality).
18
+
19
+ ## Dig Deeper
20
+
21
+ The case where the sum of the lengths of two sides _equals_ that of the
22
+ third is known as a _degenerate_ triangle - it has zero area and looks like
23
+ a single line. Feel free to add your own code/tests to check for degenerate triangles.
24
+ ## Source
25
+
26
+ The Ruby Koans triangle project, parts 1 & 2 [http://rubykoans.com](http://rubykoans.com)
27
+
28
+
29
+ ## Submitting Incomplete Solutions
30
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,25 @@
1
+ # This problem gives practice on reusing procedures by extracting them as functions.
2
+
3
+ function is_equilateral(sides)
4
+ sides = sort(sides)
5
+ return verify_triangle(sides) && verify_equilateral(sides)
6
+ end
7
+
8
+ function is_isosceles(sides)
9
+ sides = sort(sides)
10
+ return verify_triangle(sides) && verify_isosceles(sides)
11
+ end
12
+
13
+ function is_scalene(sides)
14
+ sides = sort(sides)
15
+ return verify_triangle(sides) && verify_scalene(sides)
16
+ end
17
+
18
+
19
+ verify_equilateral(sorted) = (sorted[1] == sorted[3])
20
+
21
+ verify_isosceles(sorted) = (sorted[1] == sorted[2] || sorted[2] == sorted[3])
22
+
23
+ verify_scalene(sorted) = !verify_isosceles(sorted)
24
+
25
+ verify_triangle(sorted) = (sorted[3] < sorted[1] + sorted[2])
@@ -0,0 +1,64 @@
1
+ using Base.Test
2
+
3
+ include("triangle.jl")
4
+
5
+ @testset "check equilateral triangles" begin
6
+ @testset "true if all sides are equal" begin
7
+ @test is_equilateral([2, 2, 2]) == true
8
+ @test is_equilateral([0.5, 0.5, 0.5]) == true
9
+ end
10
+
11
+ @testset "false if any side is unequal" begin
12
+ @test is_equilateral([2, 3, 2]) == false
13
+ end
14
+
15
+ @testset "false if no sides are equal" begin
16
+ @test is_equilateral([5, 4, 6]) == false
17
+ end
18
+
19
+ @testset "false if invalid triangle" begin
20
+ @test is_equilateral([0, 0, 0]) == false
21
+ end
22
+ end
23
+
24
+ @testset "check isosceles triangles" begin
25
+ @testset "true if at least 2 sides are equal" begin
26
+ @test is_isosceles([3, 4, 4]) == true
27
+ @test is_isosceles([4, 3, 4]) == true
28
+ @test is_isosceles([4, 4, 3]) == true
29
+ @test is_isosceles([4, 4, 4]) == true
30
+ @test is_isosceles([0.4, 0.5, 0.5]) == true
31
+ @test is_isosceles([0.5, 0.4, 0.5]) == true
32
+ @test is_isosceles([0.5, 0.5, 0.4]) == true
33
+ end
34
+
35
+ @testset "false if no sides are equal" begin
36
+ @test is_isosceles([2, 3, 4]) == false
37
+ end
38
+
39
+ @testset "false if invalid triangle" begin
40
+ @test is_isosceles([1, 1, 3]) == false
41
+ end
42
+ end
43
+
44
+
45
+ @testset "check scalene triangles" begin
46
+ @testset "true if no sides are equal" begin
47
+ @test is_scalene([5, 4, 6]) == true
48
+ @test is_scalene([0.5, 0.4, 0.6]) == true
49
+ end
50
+
51
+ @testset "false if at least 2 sides are equal" begin
52
+ @test is_scalene([3, 4, 4]) == false
53
+ @test is_scalene([4, 3, 4]) == false
54
+ @test is_scalene([4, 4, 3]) == false
55
+ @test is_scalene([4, 4, 4]) == false
56
+ @test is_scalene([0.4, 0.5, 0.5]) == false
57
+ @test is_scalene([0.5, 0.4, 0.5]) == false
58
+ @test is_scalene([0.5, 0.5, 0.4]) == false
59
+ end
60
+
61
+ @testset "false if invalid triangle" begin
62
+ @test is_scalene([7, 3, 2]) == false
63
+ end
64
+ end
@@ -0,0 +1,8 @@
1
+ function is_equilateral(sides)
2
+ end
3
+
4
+ function is_isosceles(sides)
5
+ end
6
+
7
+ function is_scalene(sides)
8
+ end
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -13,7 +13,7 @@ class LeapTest {
13
13
  @Ignore
14
14
  @Test
15
15
  fun yearDivisibleBy4NotDivisibleBy100() {
16
- assertTrue(Year(2020).isLeap)
16
+ assertTrue(Year(1996).isLeap)
17
17
  }
18
18
 
19
19
  @Ignore
@@ -106,7 +106,7 @@ do
106
106
 
107
107
  done
108
108
 
109
- if [ $update_needed_count -eq 1 ]
109
+ if [ $update_needed_count -eq 0 ]
110
110
  then
111
111
  echo "All exercises are up to date!"
112
112
  fi
@@ -38,7 +38,4 @@ example: |
38
38
  }
39
39
  ```
40
40
 
41
- You must have `Template::Mustache` and `YAMLish` to run `exercise-gen.pl6`.
42
-
43
- Note (2017-05-22): [YAMLish](http://modules.perl6.org/dist/YAMLish)
44
- is not yet feature complete, so some valid YAML files may not parse.
41
+ You must have `Template::Mustache` and `YAML::Parser::LibYAML` to run `exercise-gen.pl6`.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env perl6
2
2
  use v6;
3
3
  use Template::Mustache;
4
- use YAMLish;
4
+ use YAML::Parser::LibYAML;
5
5
 
6
6
  my $base-dir = $?FILE.IO.resolve.parent.parent;
7
7
  my @exercises;
@@ -33,14 +33,13 @@ for @exercises -> $exercise {
33
33
  push @dir-not-found, $exercise;
34
34
  next;
35
35
  }
36
- if (my $yaml = $exercise-dir.child('example.yaml')) !~~ :f {
36
+ if (my $yaml-file = $exercise-dir.child('example.yaml')) !~~ :f {
37
37
  push @yaml-not-found, $exercise;
38
38
  next;
39
39
  };
40
40
  print "Generating $exercise... ";
41
41
 
42
- my %data = load-yaml $yaml.slurp;
43
- $_=.chomp when Str for @(%data.values);
42
+ my %data = yaml-parse $yaml-file.absolute;
44
43
 
45
44
  my $cdata = $base-dir.child("problem-specifications/exercises/$exercise/canonical-data.json");
46
45
  if $cdata ~~ :f {%data<cdata><json> = $cdata.slurp}
@@ -2,7 +2,7 @@ exercise: Accumulate
2
2
  version: 1
3
3
  plan: 7
4
4
  imports: '&accumulate'
5
- tests: |
5
+ tests: |-
6
6
  is-deeply accumulate([ ], sub {}),
7
7
  [ ],
8
8
  'test empty';
@@ -23,7 +23,7 @@ tests: |
23
23
  'reverse strings';
24
24
 
25
25
  unit: module
26
- example: |
26
+ example: |-
27
27
  sub accumulate (@list, $function) is export {
28
28
  my @accumulated;
29
29
  for @list -> $element {
@@ -2,8 +2,8 @@ exercise: AllYourBase
2
2
  version: 2
3
3
  plan: 23
4
4
  imports: '&convert-base'
5
- tests: |
6
-
5
+ tests: |-
6
+
7
7
  for @($c-data<cases>) -> $case {
8
8
  if $case<expected> ~~ Array:D { test }
9
9
  else {
@@ -17,33 +17,33 @@ tests: |
17
17
  flunk "$_; not tested" if %*ENV<EXERCISM>; # To ensure that no canonical-data cases are missed.
18
18
  }
19
19
  }
20
-
20
+
21
21
  sub test (Array:D $expected = $case<expected>) {
22
22
  is-deeply call-convert-base, $expected, $case<description>
23
23
  }
24
-
24
+
25
25
  sub call-convert-base { convert-base(|$case<input_base input_digits output_base>) }
26
26
  }
27
27
 
28
28
  unit: module
29
- example: |
29
+ example: |-
30
30
  class X::AllYourBase::InvalidBase is Exception {
31
31
  has $.payload;
32
32
  method message {"$!payload is not a valid base."}
33
33
  }
34
-
34
+
35
35
  class X::AllYourBase::InvalidDigit is Exception {
36
36
  has %.payload;
37
37
  method message {"%!payload<digit> is not a valid digit for base %!payload<base>."}
38
38
  }
39
-
39
+
40
40
  sub convert-base (Int:D $input-base, @input-digits, Int:D $output-base --> Array:D) is export {
41
41
  for $input-base, $output-base {
42
42
  X::AllYourBase::InvalidBase.new(payload => $_).throw if $_ < 2;
43
43
  }
44
44
  from-decimal($output-base, (to-decimal $input-base, @input-digits));
45
45
  }
46
-
46
+
47
47
  sub to-decimal ($input-base, @input-digits) {
48
48
  return [].Slip if !@input-digits;
49
49
  my $elems = @input-digits.elems;
@@ -60,7 +60,7 @@ example: |
60
60
  }
61
61
  return $dec;
62
62
  }
63
-
63
+
64
64
  sub from-decimal ($output-base, $dec) {
65
65
  my @output-digits;
66
66
  my $num = $dec;
@@ -2,27 +2,27 @@ exercise: Allergies
2
2
  version: 2
3
3
  plan: 4
4
4
  imports: '&allergic-to &list-allergies'
5
- tests: |
5
+ tests: |-
6
6
  for $c-data<cases>.values -> %case-set {
7
-
7
+
8
8
  subtest 'allergic-to' => {
9
9
  plan 7;
10
10
  for %case-set<cases>.values -> %case {
11
11
  is allergic-to(%case<score>, .<substance>), .<result>, %case<description> ~ ': ' ~ .<substance> for %case<expected>.values;
12
12
  }
13
13
  } when %case-set<description> ~~ 'allergicTo';
14
-
14
+
15
15
  subtest 'list-allergies' => {
16
16
  plan 9;
17
17
  for %case-set<cases>.values {
18
18
  cmp-ok list-allergies(.<score>), '~~', .<expected>.Set, .<description>;
19
19
  }
20
20
  } when %case-set<description> ~~ 'list';
21
-
21
+
22
22
  }
23
23
 
24
24
  unit: module
25
- example: |
25
+ example: |-
26
26
  our @allergens = <
27
27
  eggs
28
28
  peanuts
@@ -33,11 +33,11 @@ example: |
33
33
  pollen
34
34
  cats
35
35
  >;
36
-
36
+
37
37
  sub allergic-to($code,$substance) is export {
38
38
  return so $code +& ( 2 ** @allergens.first({ $_ eq $substance},:k) )
39
39
  }
40
-
40
+
41
41
  sub list-allergies($code) is export {
42
42
  return grep { allergic-to($code,$_) }, @allergens;
43
43
  }
@@ -2,11 +2,11 @@ exercise: Anagram
2
2
  version: 1
3
3
  plan: 18
4
4
  imports: '&match-anagrams'
5
- tests: |
5
+ tests: |-
6
6
  is match-anagrams(|.<subject candidates>), |.<expected description> for @($c-data<cases>);
7
7
 
8
8
  unit: module
9
- example: |
9
+ example: |-
10
10
  sub match-anagrams ($word, @words) is export {
11
11
  my @results;
12
12
  my $canonical = canonize($word);
@@ -19,7 +19,7 @@ example: |
19
19
  }
20
20
  @results;
21
21
  }
22
-
22
+
23
23
  sub canonize ($str) {
24
24
  (($str.lc.split('')).sort).join('');
25
25
  }
@@ -2,7 +2,7 @@ exercise: AtbashCipher
2
2
  version: 1
3
3
  plan: 4
4
4
  imports: '&encode &decode'
5
- tests: |
5
+ tests: |-
6
6
  for @($c-data<cases>) {
7
7
  my $test = .<description> ~~ 'encode' ?? 'encode' !! 'decode';
8
8
  subtest $test => {
@@ -13,13 +13,13 @@ tests: |
13
13
  }
14
14
 
15
15
  unit: module
16
- example: |
16
+ example: |-
17
17
  sub encode($input) is export {
18
18
  decode($input.lc.trans( ['a'..'z', 0..9] => '', :complement ) )
19
19
  .comb(5)
20
20
  .join: ' ';
21
21
  }
22
-
22
+
23
23
  sub decode (Str $input) is export {
24
24
  return $input
25
25
  .lc