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
@@ -4,14 +4,14 @@ Given an input text output it transposed.
4
4
 
5
5
  Roughly explained, the transpose of a matrix:
6
6
 
7
- ```
7
+ ```text
8
8
  ABC
9
9
  DEF
10
10
  ```
11
11
 
12
12
  is given by:
13
13
 
14
- ```
14
+ ```text
15
15
  AD
16
16
  BE
17
17
  CF
@@ -26,14 +26,14 @@ If the input has rows of different lengths, this is to be solved as follows:
26
26
 
27
27
  Therefore, transposing this matrix:
28
28
 
29
- ```
29
+ ```text
30
30
  ABC
31
31
  DE
32
32
  ```
33
33
 
34
34
  results in:
35
35
 
36
- ```
36
+ ```text
37
37
  AD
38
38
  BE
39
39
  C
@@ -41,21 +41,21 @@ C
41
41
 
42
42
  And transposing:
43
43
 
44
- ```
44
+ ```text
45
45
  AB
46
46
  DEF
47
47
  ```
48
48
 
49
49
  results in:
50
50
 
51
- ```
51
+ ```text
52
52
  AD
53
53
  BE
54
54
  F
55
55
  ```
56
56
 
57
57
  In general, all characters from the input should also be present in the transposed output.
58
- That means that if a column in the input text contains only spaces on its bottom-most row(s),
58
+ That means that if a column in the input text contains only spaces on its bottom-most row(s),
59
59
  the corresponding output row should contain the spaces in its right-most column(s).
60
60
 
61
61
  ## Running the tests
@@ -2,23 +2,26 @@
2
2
 
3
3
  Determine if a triangle is equilateral, isosceles, or scalene.
4
4
 
5
- An _equilateral_ triangle has all three sides the same length.<br/>
5
+ An _equilateral_ triangle has all three sides the same length.
6
+
6
7
  An _isosceles_ triangle has at least two sides the same length. (It is sometimes
7
8
  specified as having exactly two sides the same length, but for the purposes of
8
- this exercise we'll say at least two.)<br/>
9
+ this exercise we'll say at least two.)
10
+
9
11
  A _scalene_ triangle has all sides of different lengths.
10
12
 
11
13
  ## Note
12
14
 
13
- For a shape to be a triangle at all, all sides have to be of length > 0, and
14
- the sum of the lengths of any two sides must be greater than or equal to the
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
15
17
  length of the third side. See [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality).
16
18
 
17
19
  ## Dig Deeper
18
20
 
19
- The case where the sum of the lengths of two sides _equals_ that of the
20
- third is known as a _degenerate_ triangle - it has zero area and looks like
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
21
23
  a single line. Feel free to add your own code/tests to check for degenerate triangles.
24
+
22
25
  ## Running the tests
23
26
 
24
27
  To run the tests, run the command `busted .` from within the exercise directory.
@@ -5,18 +5,17 @@ Implement variable length quantity encoding and decoding.
5
5
  The goal of this exercise is to implement [VLQ](https://en.wikipedia.org/wiki/Variable-length_quantity) encoding/decoding.
6
6
 
7
7
  In short, the goal of this encoding is to encode integer values in a way that would save bytes.
8
- Only the first 7 bits of each byte is significant (right-justified; sort of like an ASCII byte).
9
- So, if you have a 32-bit value, you have to unpack it into a series of 7-bit bytes.
10
- Of course, you will have a variable number of bytes depending upon your integer.
8
+ Only the first 7 bits of each byte is significant (right-justified; sort of like an ASCII byte).
9
+ So, if you have a 32-bit value, you have to unpack it into a series of 7-bit bytes.
10
+ Of course, you will have a variable number of bytes depending upon your integer.
11
11
  To indicate which is the last byte of the series, you leave bit #7 clear.
12
- In all of the preceding bytes, you set bit #7.
12
+ In all of the preceding bytes, you set bit #7.
13
13
 
14
- So, if an integer is between `0-127`, it can be represented as one byte.
14
+ So, if an integer is between `0-127`, it can be represented as one byte.
15
15
  Although VLQ can deal with numbers of arbitrary sizes, for this exercise we will restrict ourselves to only numbers that fit in a 32-bit unsigned integer.
16
16
  Here are examples of integers as 32-bit values, and the variable length quantities that they translate to:
17
17
 
18
-
19
- ```
18
+ ```text
20
19
  NUMBER VARIABLE QUANTITY
21
20
  00000000 00
22
21
  00000040 40
@@ -4,14 +4,13 @@ Given a phrase, count the occurrences of each word in that phrase.
4
4
 
5
5
  For example for the input `"olly olly in come free"`
6
6
 
7
- ```plain
7
+ ```text
8
8
  olly: 2
9
9
  in: 1
10
10
  come: 1
11
11
  free: 1
12
12
  ```
13
13
 
14
-
15
14
  ## Running the tests
16
15
 
17
16
  To run the tests, run the command `busted .` from within the exercise directory.
@@ -5,7 +5,7 @@ words in them.
5
5
 
6
6
  For example:
7
7
 
8
- ```
8
+ ```text
9
9
  jefblpepre
10
10
  camdcimgtc
11
11
  oivokprjsm
@@ -1,4 +1,4 @@
1
- unit module Leap:ver<1>;
1
+ unit module Leap:ver<2>;
2
2
 
3
3
  sub is-leap-year ($year) is export {
4
4
  is-divisible($year, 400)
@@ -1,4 +1,4 @@
1
- unit module Leap:ver<1>;
1
+ unit module Leap:ver<2>;
2
2
 
3
3
  sub is-leap-year ($year) is export {
4
4
  }
@@ -1,5 +1,5 @@
1
1
  exercise: Leap
2
- version: 1
2
+ version: 2
3
3
  plan: 6
4
4
  imports: '&is-leap-year'
5
5
  tests: |
@@ -5,7 +5,7 @@ use lib my $dir = $?FILE.IO.dirname;
5
5
  use JSON::Fast;
6
6
 
7
7
  my Str:D $exercise := 'Leap';
8
- my Version:D $version = v1;
8
+ my Version:D $version = v2;
9
9
  my Str $module //= $exercise;
10
10
  INIT {
11
11
  plan 6;
@@ -33,7 +33,7 @@ $c-data := from-json q:to/END/;
33
33
 
34
34
  {
35
35
  "exercise": "leap",
36
- "version": "1.0.0",
36
+ "version": "1.1.0",
37
37
  "cases": [
38
38
  {
39
39
  "description": "year not divisible by 4: common year",
@@ -44,7 +44,7 @@ $c-data := from-json q:to/END/;
44
44
  {
45
45
  "description": "year divisible by 4, not divisible by 100: leap year",
46
46
  "property": "leapYear",
47
- "input": 2016,
47
+ "input": 2020,
48
48
  "expected": true
49
49
  },
50
50
  {
@@ -9,22 +9,44 @@
9
9
  */
10
10
  function transpose($text)
11
11
  {
12
+ $findMaxLength = function ($lines) {
13
+ return array_reduce($lines, function ($max, $line) {
14
+ return max($max, strlen($line));
15
+ }, 0);
16
+ };
17
+
18
+ $pad = function ($lines, $length) {
19
+ return array_map(function ($line) use ($length) {
20
+ return str_pad($line, $length, ' ', STR_PAD_RIGHT);
21
+ }, $lines);
22
+ };
23
+
24
+ if ($text === ['']) {
25
+ return $text;
26
+ }
27
+
28
+ $maxLength = $findMaxLength($text);
29
+
30
+ $lines = $pad($text, $maxLength);
31
+
12
32
  $result = [];
13
- if (!empty($text)) {
14
- $lines = (strpos($text, '\n') !== false ? explode('\n', $text) : [$text]);
15
- foreach ($lines as $lineNumber => $line) {
16
- $characters = str_split($line);
17
- array_walk_recursive(
18
- $characters,
19
- function ($character, $key) use (&$result, $lineNumber) {
20
- $defaultValue = str_pad($character, $lineNumber + 1, " ", STR_PAD_LEFT);
21
- if (isset($result[$key])) {
22
- $defaultValue = $result[$key] . $character;
23
- }
24
- $result[$key] = $defaultValue;
25
- }
26
- );
33
+
34
+ foreach ($lines as $lineNumber => $line) {
35
+ $characters = str_split($line);
36
+ foreach ($characters as $index => $character) {
37
+ if (isset($result[$index])) {
38
+ $result[$index] .= $character;
39
+ } else {
40
+ $result[$index] = $character;
41
+ }
27
42
  }
28
43
  }
29
- return implode($result, '\n');
44
+
45
+ $trimLastLine = function ($lines) {
46
+ $lastLine = array_pop($lines);
47
+ array_push($lines, rtrim($lastLine));
48
+ return $lines;
49
+ };
50
+
51
+ return $trimLastLine($result);
30
52
  }
@@ -6,111 +6,271 @@ class TransposeTest extends PHPUnit\Framework\TestCase
6
6
  {
7
7
  public function testEmptyString()
8
8
  {
9
- $input = "";
10
- $expected = "";
9
+ $input = [""];
10
+ $expected = [""];
11
11
  $this->assertEquals($expected, transpose($input));
12
12
  }
13
13
 
14
14
  public function testTwoCharactersInARow()
15
15
  {
16
16
  $this->markTestSkipped();
17
- $input = "A1";
18
- $expected = 'A\n1';
17
+ $input = [
18
+ "A1"
19
+ ];
20
+ $expected = [
21
+ "A",
22
+ "1"
23
+ ];
19
24
  $this->assertEquals($expected, transpose($input));
20
25
  }
21
26
 
22
27
  public function testTwoCharactersInAColumn()
23
28
  {
24
29
  $this->markTestSkipped();
25
- $input = 'A\n1';
26
- $expected = "A1";
30
+ $input = [
31
+ "A",
32
+ "1"
33
+ ];
34
+ $expected = [
35
+ "A1"
36
+ ];
27
37
  $this->assertEquals($expected, transpose($input));
28
38
  }
29
39
 
30
40
  public function testSimple()
31
41
  {
32
42
  $this->markTestSkipped();
33
- $input = 'ABC\n123';
34
- $expected = 'A1\nB2\nC3';
43
+ $input = [
44
+ "ABC",
45
+ "123"
46
+ ];
47
+ $expected = [
48
+ "A1",
49
+ "B2",
50
+ "C3"
51
+ ];
35
52
  $this->assertEquals($expected, transpose($input));
36
53
  }
37
54
 
38
55
  public function testSingleLine()
39
56
  {
40
57
  $this->markTestSkipped();
41
- $input = "Single line.";
42
- $expected = 'S\ni\nn\ng\nl\ne\n \nl\ni\nn\ne\n.';
58
+ $input = [
59
+ "Single line."
60
+ ];
61
+ $expected = [
62
+ "S",
63
+ "i",
64
+ "n",
65
+ "g",
66
+ "l",
67
+ "e",
68
+ " ",
69
+ "l",
70
+ "i",
71
+ "n",
72
+ "e",
73
+ ".",
74
+ ];
43
75
  $this->assertEquals($expected, transpose($input));
44
76
  }
45
77
 
46
78
  public function testFirstLineLongerThanSecondLine()
47
79
  {
48
80
  $this->markTestSkipped();
49
- $input = 'The fourth line.\nThe fifth line.';
50
- $expected = 'TT\nhh\nee\n \nff\noi\nuf\nrt\nth\nh \n l\nli\nin\nne\ne.\n.';
81
+ $input = [
82
+ "The fourth line.",
83
+ "The fifth line."
84
+ ];
85
+ $expected = [
86
+ "TT",
87
+ "hh",
88
+ "ee",
89
+ " ",
90
+ "ff",
91
+ "oi",
92
+ "uf",
93
+ "rt",
94
+ "th",
95
+ "h ",
96
+ " l",
97
+ "li",
98
+ "in",
99
+ "ne",
100
+ "e.",
101
+ "."
102
+ ];
51
103
  $this->assertEquals($expected, transpose($input));
52
104
  }
53
105
 
54
106
  public function testSecondLineLongerThanFirstLine()
55
107
  {
56
108
  $this->markTestSkipped();
57
- $input = 'The first line.\nThe second line.';
58
- $expected = 'TT\nhh\nee\n \nfs\nie\nrc\nso\ntn\n d\nl \nil\nni\nen\n.e\n .';
109
+ $input = [
110
+ "The first line.",
111
+ "The second line."
112
+ ];
113
+ $expected = [
114
+ "TT",
115
+ "hh",
116
+ "ee",
117
+ " ",
118
+ "fs",
119
+ "ie",
120
+ "rc",
121
+ "so",
122
+ "tn",
123
+ " d",
124
+ "l ",
125
+ "il",
126
+ "ni",
127
+ "en",
128
+ ".e",
129
+ " ."
130
+ ];
59
131
  $this->assertEquals($expected, transpose($input));
60
132
  }
61
133
 
62
134
  public function testSquare()
63
135
  {
64
136
  $this->markTestSkipped();
65
- $input = 'HEART\nEMBER\nABUSE\nRESIN\nTREND';
66
- $expected = 'HEART\nEMBER\nABUSE\nRESIN\nTREND';
137
+ $input = [
138
+ "HEART",
139
+ "EMBER",
140
+ "ABUSE",
141
+ "RESIN",
142
+ "TREND"
143
+ ];
144
+ $expected = [
145
+ "HEART",
146
+ "EMBER",
147
+ "ABUSE",
148
+ "RESIN",
149
+ "TREND"
150
+ ];
67
151
  $this->assertEquals($expected, transpose($input));
68
152
  }
69
153
 
70
154
  public function testRectangle()
71
155
  {
72
156
  $this->markTestSkipped();
73
- $input = 'FRACTURE\nOUTLINED\nBLOOMING\nSEPTETTE';
74
- $expected = 'FOBS\nRULE\nATOP\nCLOT\nTIME\nUNIT\nRENT\nEDGE';
157
+ $input = [
158
+ "FRACTURE",
159
+ "OUTLINED",
160
+ "BLOOMING",
161
+ "SEPTETTE"
162
+ ];
163
+ $expected = [
164
+ "FOBS",
165
+ "RULE",
166
+ "ATOP",
167
+ "CLOT",
168
+ "TIME",
169
+ "UNIT",
170
+ "RENT",
171
+ "EDGE"
172
+ ];
75
173
  $this->assertEquals($expected, transpose($input));
76
174
  }
77
175
 
78
176
  public function testTriangle()
79
177
  {
80
178
  $this->markTestSkipped();
81
- $input = 'T\nEE\nAAA\nSSSS\nEEEEE\nRRRRRR';
82
- $expected = 'TEASER\n EASER\n ASER\n SER\n ER\n R';
179
+ $input = [
180
+ "T",
181
+ "EE",
182
+ "AAA",
183
+ "SSSS",
184
+ "EEEEE",
185
+ "RRRRRR"
186
+ ];
187
+ $expected = [
188
+ "TEASER",
189
+ " EASER",
190
+ " ASER",
191
+ " SER",
192
+ " ER",
193
+ " R"
194
+ ];
83
195
  $this->assertEquals($expected, transpose($input));
84
196
  }
85
197
 
86
198
  public function testManyLines()
87
199
  {
88
200
  $this->markTestSkipped();
89
- $input = 'Chor. Two households, both alike in dignity,\nIn fair Verona, ';
90
- $input .= 'where we lay our scene,\nFrom ancient grudge break to new mutiny';
91
- $input .= ',\nWhere civil blood makes civil hands unclean.\nFrom forth';
92
- $input .= ' the fatal loins of these two foes\nA pair of star-cross\'d ';
93
- $input .= 'lovers take their life;\nWhose misadventur\'d piteous overthrows';
94
- $input .= '\nDoth with their death bury their parents\' strife.\nThe fear';
95
- $input .= 'ful passage of their death-mark\'d love,\nAnd the continuance';
96
- $input .= ' of their parents\' rage,\nWhich, but their children\'s end, ';
97
- $input .= 'naught could remove,\nIs now the two hours\' traffic of our ';
98
- $input .= 'stage;\nThe which if you with patient ears attend,\nWhat ';
99
- $input .= 'here shall miss, our toil shall strive to mend.';
100
- $expected = 'CIFWFAWDTAWITW\nhnrhr hohnhshh\no oeopotedi ea\nrfmrmash';
101
- $expected .= ' cn t\n.a e ie fthow \n ia fr weh,whh\nTrnco miae ie\nw';
102
- $expected .= ' ciroitr btcr\noVivtfshfcuhhe\n eeih a uote \nhrnl sdtln';
103
- $expected .= ' is\noot ttvh tttfh\nun bhaeepihw a\nsaglernianeoyl\ne,ro';
104
- $expected .= ' -trsui ol\nh uofcu sarhu \nowddarrdan o m\nlhg to\'egccuwi\n';
105
- $expected .= 'deemasdaeehris\nsr als t ists\n,ebk \'phool\'h,\n reldi ffd';
106
- $expected .= ' \nbweso tb rtpo\noea ileutterau\nt kcnoorhhnatr\nhl ';
107
- $expected .= 'isvuyee\'fi \n atv es iisfet\nayoior trr ino\nl lfsoh ecti';
108
- $expected .= '\nion vedpn l\nkuehtteieadoe \nerwaharrar,fas\n nekt te ';
109
- $expected .= ' rh\nismdsehphnnosa\nncuse ra-tau l\n et tormsural\n';
110
- $expected .= 'dniuthwea\'g t \niennwesnr hsts\ng,ycoitkrttet\nn,l rs\'a anr';
111
- $expected .= '\nief \'dgcgdi\ntaol eoe,v\nyneisl,u;e\n,.sftol \n ervdt';
112
- $expected .= '\n ;ie o\n f,r \n eem\n .me\n ';
113
- $expected .= 'on\n vd\n e.\n ,';
201
+ $input = [
202
+ "Chor. Two households, both alike in dignity,",
203
+ "In fair Verona, where we lay our scene,",
204
+ "From ancient grudge break to new mutiny,",
205
+ "Where civil blood makes civil hands unclean.",
206
+ "From forth the fatal loins of these two foes",
207
+ "A pair of star-cross'd lovers take their life;",
208
+ "Whose misadventur'd piteous overthrows",
209
+ "Doth with their death bury their parents' strife.",
210
+ "The fearful passage of their death-mark'd love,",
211
+ "And the continuance of their parents' rage,",
212
+ "Which, but their children's end, naught could remove,",
213
+ "Is now the two hours' traffic of our stage;",
214
+ "The which if you with patient ears attend,",
215
+ "What here shall miss, our toil shall strive to mend."
216
+ ];
217
+
218
+ $expected = [
219
+ "CIFWFAWDTAWITW",
220
+ "hnrhr hohnhshh",
221
+ "o oeopotedi ea",
222
+ "rfmrmash cn t",
223
+ ".a e ie fthow ",
224
+ " ia fr weh,whh",
225
+ "Trnco miae ie",
226
+ "w ciroitr btcr",
227
+ "oVivtfshfcuhhe",
228
+ " eeih a uote ",
229
+ "hrnl sdtln is",
230
+ "oot ttvh tttfh",
231
+ "un bhaeepihw a",
232
+ "saglernianeoyl",
233
+ "e,ro -trsui ol",
234
+ "h uofcu sarhu ",
235
+ "owddarrdan o m",
236
+ "lhg to'egccuwi",
237
+ "deemasdaeehris",
238
+ "sr als t ists",
239
+ ",ebk 'phool'h,",
240
+ " reldi ffd ",
241
+ "bweso tb rtpo",
242
+ "oea ileutterau",
243
+ "t kcnoorhhnatr",
244
+ "hl isvuyee'fi ",
245
+ " atv es iisfet",
246
+ "ayoior trr ino",
247
+ "l lfsoh ecti",
248
+ "ion vedpn l",
249
+ "kuehtteieadoe ",
250
+ "erwaharrar,fas",
251
+ " nekt te rh",
252
+ "ismdsehphnnosa",
253
+ "ncuse ra-tau l",
254
+ " et tormsural",
255
+ "dniuthwea'g t ",
256
+ "iennwesnr hsts",
257
+ "g,ycoi tkrttet",
258
+ "n ,l r s'a anr",
259
+ "i ef 'dgcgdi",
260
+ "t aol eoe,v",
261
+ "y nei sl,u; e",
262
+ ", .sf to l ",
263
+ " e rv d t",
264
+ " ; ie o",
265
+ " f, r ",
266
+ " e e m",
267
+ " . m e",
268
+ " o n",
269
+ " v d",
270
+ " e .",
271
+ " ,"
272
+ ];
273
+
114
274
  $this->assertEquals($expected, transpose($input));
115
275
  }
116
276
  }