trackler 2.2.1.59 → 2.2.1.60

Sign up to get free protection for your applications and to get access to all the features.
Files changed (234) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/food-chain/canonical-data.json +31 -23
  4. data/problem-specifications/exercises/house/canonical-data.json +45 -33
  5. data/problem-specifications/exercises/house/description.md +1 -1
  6. data/problem-specifications/exercises/kindergarten-garden/description.md +3 -3
  7. data/problem-specifications/exercises/nucleotide-count/description.md +2 -2
  8. data/problem-specifications/exercises/palindrome-products/description.md +1 -1
  9. data/problem-specifications/exercises/rectangles/description.md +9 -9
  10. data/problem-specifications/exercises/twelve-days/canonical-data.json +171 -0
  11. data/problem-specifications/exercises/two-bucket/description.md +7 -7
  12. data/tracks/c/docs/CONTRIBUTING.md +88 -39
  13. data/tracks/c/exercises/phone-number/test/test_phone_number.c +33 -29
  14. data/tracks/c/exercises/triangle/src/example.c +12 -12
  15. data/tracks/c/exercises/triangle/src/example.h +3 -3
  16. data/tracks/c/exercises/triangle/test/test_triangle.c +16 -16
  17. data/tracks/c/exercises/word-count/src/example.c +12 -3
  18. data/tracks/c/exercises/word-count/src/word_count.h +10 -5
  19. data/tracks/c/exercises/word-count/test/test_word_count.c +248 -58
  20. data/tracks/ceylon/exercises/hamming/source/hamming/HammingTest.ceylon +3 -3
  21. data/tracks/ceylon/exercises/leap/source/leap/LeapTest.ceylon +2 -2
  22. data/tracks/dart/exercises/phone-number/README.md +1 -1
  23. data/tracks/dart/exercises/phone-number/test/phone_number_test.dart +5 -5
  24. data/tracks/gnu-apl/.dockerignore +5 -0
  25. data/tracks/gnu-apl/.travis.yml +9 -4
  26. data/tracks/gnu-apl/Dockerfiles/release.dockerfile +15 -0
  27. data/tracks/gnu-apl/Dockerfiles/svn.dockerfile +22 -0
  28. data/tracks/gnu-apl/README.md +1 -1
  29. data/tracks/gnu-apl/bin/install-apl +26 -0
  30. data/tracks/gnu-apl/test.apl +7 -6
  31. data/tracks/go/docs/TESTS.md +1 -1
  32. data/tracks/haskell/.travis.yml +1 -1
  33. data/tracks/haskell/config.json +9 -0
  34. data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
  35. data/tracks/haskell/exercises/acronym/package.yaml +1 -1
  36. data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
  37. data/tracks/haskell/exercises/acronym/test/Tests.hs +3 -0
  38. data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
  39. data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
  40. data/tracks/haskell/exercises/alphametics/examples/success-standard/src/Alphametics.hs +2 -1
  41. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
  42. data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
  43. data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
  44. data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
  45. data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
  46. data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
  47. data/tracks/haskell/exercises/binary/stack.yaml +1 -1
  48. data/tracks/haskell/exercises/bob/stack.yaml +1 -1
  49. data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
  50. data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
  51. data/tracks/haskell/exercises/change/stack.yaml +1 -1
  52. data/tracks/haskell/exercises/clock/stack.yaml +1 -1
  53. data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -1
  54. data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -1
  55. data/tracks/haskell/exercises/connect/stack.yaml +1 -1
  56. data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
  57. data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
  58. data/tracks/haskell/exercises/crypto-square/test/Tests.hs +9 -5
  59. data/tracks/haskell/exercises/custom-set/package.yaml +1 -1
  60. data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
  61. data/tracks/haskell/exercises/custom-set/test/Tests.hs +3 -0
  62. data/tracks/haskell/exercises/diamond/stack.yaml +1 -1
  63. data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
  64. data/tracks/haskell/exercises/dominoes/README.md +3 -3
  65. data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
  66. data/tracks/haskell/exercises/etl/stack.yaml +1 -1
  67. data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
  68. data/tracks/haskell/exercises/forth/stack.yaml +1 -1
  69. data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
  70. data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
  71. data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
  72. data/tracks/haskell/exercises/grains/stack.yaml +1 -1
  73. data/tracks/haskell/exercises/hamming/package.yaml +1 -1
  74. data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
  75. data/tracks/haskell/exercises/hamming/test/Tests.hs +4 -4
  76. data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
  77. data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
  78. data/tracks/haskell/exercises/house/README.md +1 -1
  79. data/tracks/haskell/exercises/house/stack.yaml +1 -1
  80. data/tracks/haskell/exercises/isbn-verifier/README.md +96 -0
  81. data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/package.yaml +16 -0
  82. data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/src/IsbnVerifier.hs +10 -0
  83. data/tracks/haskell/exercises/isbn-verifier/package.yaml +20 -0
  84. data/tracks/haskell/exercises/isbn-verifier/src/IsbnVerifier.hs +4 -0
  85. data/tracks/haskell/exercises/isbn-verifier/stack.yaml +1 -0
  86. data/tracks/haskell/exercises/isbn-verifier/test/Tests.hs +74 -0
  87. data/tracks/haskell/exercises/isogram/stack.yaml +1 -1
  88. data/tracks/haskell/exercises/kindergarten-garden/README.md +3 -3
  89. data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
  90. data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
  91. data/tracks/haskell/exercises/leap/package.yaml +1 -1
  92. data/tracks/haskell/exercises/leap/stack.yaml +1 -1
  93. data/tracks/haskell/exercises/leap/test/Tests.hs +1 -1
  94. data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
  95. data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
  96. data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
  97. data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
  98. data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
  99. data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
  100. data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
  101. data/tracks/haskell/exercises/nth-prime/package.yaml +1 -1
  102. data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
  103. data/tracks/haskell/exercises/nucleotide-count/README.md +2 -2
  104. data/tracks/haskell/exercises/nucleotide-count/package.yaml +1 -1
  105. data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
  106. data/tracks/haskell/exercises/nucleotide-count/test/Tests.hs +6 -0
  107. data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
  108. data/tracks/haskell/exercises/octal/stack.yaml +1 -1
  109. data/tracks/haskell/exercises/palindrome-products/README.md +1 -1
  110. data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
  111. data/tracks/haskell/exercises/pangram/package.yaml +1 -1
  112. data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
  113. data/tracks/haskell/exercises/pangram/test/Tests.hs +6 -2
  114. data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
  115. data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
  116. data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -1
  117. data/tracks/haskell/exercises/phone-number/README.md +1 -1
  118. data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
  119. data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
  120. data/tracks/haskell/exercises/pov/stack.yaml +1 -1
  121. data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
  122. data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
  123. data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
  124. data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
  125. data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
  126. data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
  127. data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
  128. data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
  129. data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -1
  130. data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
  131. data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
  132. data/tracks/haskell/exercises/say/stack.yaml +1 -1
  133. data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
  134. data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
  135. data/tracks/haskell/exercises/series/stack.yaml +1 -1
  136. data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
  137. data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
  138. data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
  139. data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
  140. data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
  141. data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
  142. data/tracks/haskell/exercises/strain/stack.yaml +1 -1
  143. data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
  144. data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
  145. data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
  146. data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
  147. data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
  148. data/tracks/haskell/exercises/wordy/examples/success-standard/src/WordProblem.hs +6 -5
  149. data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
  150. data/tracks/haskell/exercises/zebra-puzzle/package.yaml +1 -1
  151. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
  152. data/tracks/haskell/exercises/zipper/README.md +1 -1
  153. data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
  154. data/tracks/javascript/.eslintignore +43 -0
  155. data/tracks/javascript/.travis.yml +2 -1
  156. data/tracks/javascript/exercises/bowling/README.md +5 -5
  157. data/tracks/javascript/exercises/crypto-square/example.js +2 -1
  158. data/tracks/javascript/exercises/diffie-hellman/diffie-hellman.spec.js +20 -20
  159. data/tracks/javascript/exercises/diffie-hellman/example.js +10 -10
  160. data/tracks/javascript/exercises/largest-series-product/example.js +2 -1
  161. data/tracks/javascript/exercises/sieve/example.js +5 -2
  162. data/tracks/javascript/package-lock.json +129 -76
  163. data/tracks/javascript/package.json +6 -5
  164. data/tracks/ocaml/config.json +10 -0
  165. data/tracks/ocaml/exercises/hamming/test.ml +3 -3
  166. data/tracks/ocaml/exercises/leap/test.ml +2 -2
  167. data/tracks/ocaml/exercises/pangram/test.ml +3 -3
  168. data/tracks/ocaml/exercises/rectangles/.merlin +5 -0
  169. data/tracks/ocaml/exercises/rectangles/Makefile +11 -0
  170. data/tracks/ocaml/exercises/rectangles/example.ml +30 -0
  171. data/tracks/ocaml/exercises/rectangles/rectangles.mli +1 -0
  172. data/tracks/ocaml/exercises/rectangles/test.ml +72 -0
  173. data/tracks/ocaml/tools/test-generator/templates/ocaml/leap/test.ml +1 -1
  174. data/tracks/ocaml/tools/test-generator/templates/ocaml/rectangles/test.ml +15 -0
  175. data/tracks/pony/README.md +1 -1
  176. data/tracks/pony/exercises/atbash-cipher/example.pony +6 -10
  177. data/tracks/pony/exercises/difference-of-squares/example.pony +3 -7
  178. data/tracks/rust/_test/count-ignores.sh +2 -2
  179. data/tracks/rust/config.json +24 -0
  180. data/tracks/rust/config/maintainers.json +10 -0
  181. data/tracks/rust/exercises/acronym/README.md +0 -1
  182. data/tracks/rust/exercises/all-your-base/README.md +1 -1
  183. data/tracks/rust/exercises/allergies/README.md +0 -1
  184. data/tracks/rust/exercises/alphametics/README.md +2 -2
  185. data/tracks/rust/exercises/atbash-cipher/README.md +2 -1
  186. data/tracks/rust/exercises/beer-song/README.md +1 -1
  187. data/tracks/rust/exercises/bowling/README.md +20 -6
  188. data/tracks/rust/exercises/circular-buffer/README.md +13 -6
  189. data/tracks/rust/exercises/crypto-square/README.md +10 -8
  190. data/tracks/rust/exercises/dominoes/Cargo.toml +1 -1
  191. data/tracks/rust/exercises/etl/README.md +2 -0
  192. data/tracks/rust/exercises/grade-school/README.md +0 -1
  193. data/tracks/rust/exercises/grains/README.md +0 -1
  194. data/tracks/rust/exercises/isbn-verifier/Cargo.lock +4 -0
  195. data/tracks/rust/exercises/isbn-verifier/Cargo.toml +3 -0
  196. data/tracks/rust/exercises/isbn-verifier/README.md +74 -0
  197. data/tracks/rust/exercises/isbn-verifier/example.rs +44 -0
  198. data/tracks/rust/exercises/isbn-verifier/src/lib.rs +4 -0
  199. data/tracks/rust/exercises/isbn-verifier/tests/isbn-verifier.rs +83 -0
  200. data/tracks/rust/exercises/isogram/README.md +3 -2
  201. data/tracks/rust/exercises/leap/README.md +1 -1
  202. data/tracks/rust/exercises/luhn/README.md +7 -7
  203. data/tracks/rust/exercises/nucleotide-count/README.md +8 -22
  204. data/tracks/rust/exercises/ocr-numbers/README.md +5 -5
  205. data/tracks/rust/exercises/pangram/README.md +1 -1
  206. data/tracks/rust/exercises/pascals-triangle/README.md +1 -1
  207. data/tracks/rust/exercises/perfect-numbers/README.md +2 -2
  208. data/tracks/rust/exercises/phone-number/README.md +3 -2
  209. data/tracks/rust/exercises/protein-translation/README.md +4 -5
  210. data/tracks/rust/exercises/proverb/README.md +13 -11
  211. data/tracks/rust/exercises/proverb/example.rs +14 -15
  212. data/tracks/rust/exercises/proverb/tests/proverb.rs +40 -13
  213. data/tracks/rust/exercises/pythagorean-triplet/README.md +3 -3
  214. data/tracks/rust/exercises/queen-attack/README.md +1 -1
  215. data/tracks/rust/exercises/rectangles/README.md +7 -7
  216. data/tracks/rust/exercises/roman-numerals/README.md +1 -1
  217. data/tracks/rust/exercises/rotational-cipher/README.md +2 -1
  218. data/tracks/rust/exercises/run-length-encoding/README.md +4 -4
  219. data/tracks/rust/exercises/scrabble-score/README.md +3 -1
  220. data/tracks/rust/exercises/space-age/README.md +1 -1
  221. data/tracks/rust/exercises/tournament/README.md +5 -5
  222. data/tracks/rust/exercises/triangle/README.md +9 -6
  223. data/tracks/rust/exercises/two-bucket/Cargo.lock +4 -0
  224. data/tracks/rust/exercises/two-bucket/Cargo.toml +3 -0
  225. data/tracks/rust/exercises/two-bucket/README.md +69 -0
  226. data/tracks/rust/exercises/two-bucket/example.rs +129 -0
  227. data/tracks/rust/exercises/two-bucket/src/lib.rs +26 -0
  228. data/tracks/rust/exercises/two-bucket/tests/two-bucket.rs +68 -0
  229. data/tracks/rust/exercises/variable-length-quantity/README.md +6 -7
  230. data/tracks/rust/exercises/word-count/README.md +1 -2
  231. data/tracks/rust/exercises/wordy/README.md +0 -5
  232. metadata +33 -4
  233. data/tracks/go/.github/PULL_REQUEST_TEMPLATE.md +0 -23
  234. data/tracks/ruby/.github/PULL_REQUEST_TEMPLATE.md +0 -40
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -7,10 +7,10 @@ correct domino chain (the dots on one half of a stone match the dots on the
7
7
  neighbouring half of an adjacent stone) and that dots on the halfs of the stones
8
8
  which don't have a neighbour (the first and last stone) match each other.
9
9
 
10
- For example given the stones `21`, `23` and `13` you should compute something
11
- like `12 23 31` or `32 21 13` or `13 32 21` etc, where the first and last numbers are the same.
10
+ For example given the stones `[2|1]`, `[2|3]` and `[1|3]` you should compute something
11
+ like `[1|2] [2|3] [3|1]` or `[3|2] [2|1] [1|3]` or `[1|3] [3|2] [2|1]` etc, where the first and last numbers are the same.
12
12
 
13
- For stones 12, 41 and 23 the resulting chain is not valid: 41 12 23's first and last numbers are not the same. 4 != 3
13
+ For stones `[1|2]`, `[4|1]` and `[2|3]` the resulting chain is not valid: `[4|1] [1|2] [2|3]`'s first and last numbers are not the same. 4 != 3
14
14
 
15
15
  Some test cases may use duplicate stones in a chain solution, assume that multiple Domino sets are being used.
16
16
 
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1,5 +1,5 @@
1
1
  name: hamming
2
- version: 2.0.0.4
2
+ version: 2.0.1.5
3
3
 
4
4
  dependencies:
5
5
  - base
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -67,13 +67,13 @@ cases = [ Case { description = "empty strands"
67
67
  , expected = Just 2
68
68
  }
69
69
  , Case { description = "non-unique character in first strand"
70
- , strand1 = "AGA"
71
- , strand2 = "AGG"
70
+ , strand1 = "AAG"
71
+ , strand2 = "AAA"
72
72
  , expected = Just 1
73
73
  }
74
74
  , Case { description = "non-unique character in second strand"
75
- , strand1 = "AGG"
76
- , strand2 = "AGA"
75
+ , strand1 = "AAA"
76
+ , strand2 = "AAG"
77
77
  , expected = Just 1
78
78
  }
79
79
  , Case { description = "same nucleotides in different positions"
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1,6 +1,6 @@
1
1
  # House
2
2
 
3
- Output the nursery rhyme 'This is the House that Jack Built'.
3
+ Recite the nursery rhyme 'This is the House that Jack Built'.
4
4
 
5
5
  > [The] process of placing a phrase of clause within another phrase of
6
6
  > clause is called embedding. It is through the processes of recursion
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -0,0 +1,96 @@
1
+ # Isbn Verifier
2
+
3
+ Check if a given ISBN-10 is valid.
4
+
5
+ ## Functionality
6
+
7
+ Given an unknown string the program should check if the provided string is a valid ISBN-10.
8
+ Putting this into place requires some thinking about preprocessing/parsing of the string prior to calculating the check digit for the ISBN.
9
+
10
+ The program should allow for ISBN-10 without the separating dashes to be verified as well.
11
+
12
+ ## ISBN
13
+
14
+ Let's take a random ISBN-10 number, say `3-598-21508-8` for this.
15
+ The first digit block indicates the group where the ISBN belongs. Groups can consist of shared languages, geographic regions or countries. The leading '3' signals this ISBN is from a german speaking country.
16
+ The following number block is to identify the publisher. Since this is a three digit publisher number there is a 5 digit title number for this book.
17
+ The last digit in the ISBN is the check digit which is used to detect read errors.
18
+
19
+ The first 9 digits in the ISBN have to be between 0 and 9.
20
+ The check digit can additionally be an 'X' to allow 10 to be a valid check digit as well.
21
+
22
+ A valid ISBN-10 is calculated with this formula `(x1 * 10 + x2 * 9 + x3 * 8 + x4 * 7 + x5 * 6 + x6 * 5 + x7 * 4 + x8 * 3 + x9 * 2 + x10 * 1) mod 11 == 0`
23
+ So for our example ISBN this means:
24
+ (3 * 10 + 5 * 9 + 9 * 8 + 8 * 7 + 2 * 6 + 1 * 5 + 5 * 4 + 0 * 3 + 8 * 2 + 8 * 1) mod 11 = 0
25
+
26
+ Which proves that the ISBN is valid.
27
+
28
+ ## Caveats
29
+
30
+ Converting from string to number can be tricky in certain languages.
31
+ It's getting even trickier since the check-digit of an ISBN-10 can be 'X'.
32
+
33
+ ## Bonus tasks
34
+
35
+ * Generate a valid ISBN-13 from the input ISBN-10 (and maybe verify it again with a derived verifier)
36
+
37
+ * Generate valid ISBN, maybe even from a given starting ISBN
38
+
39
+ ## Getting Started
40
+
41
+ For installation and learning resources, refer to the
42
+ [exercism help page](http://exercism.io/languages/haskell).
43
+
44
+ ## Running the tests
45
+
46
+ To run the test suite, execute the following command:
47
+
48
+ ```bash
49
+ stack test
50
+ ```
51
+
52
+ #### If you get an error message like this...
53
+
54
+ ```
55
+ No .cabal file found in directory
56
+ ```
57
+
58
+ You are probably running an old stack version and need
59
+ to upgrade it.
60
+
61
+ #### Otherwise, if you get an error message like this...
62
+
63
+ ```
64
+ No compiler found, expected minor version match with...
65
+ Try running "stack setup" to install the correct GHC...
66
+ ```
67
+
68
+ Just do as it says and it will download and install
69
+ the correct compiler version:
70
+
71
+ ```bash
72
+ stack setup
73
+ ```
74
+
75
+ ## Running *GHCi*
76
+
77
+ If you want to play with your solution in GHCi, just run the command:
78
+
79
+ ```bash
80
+ stack ghci
81
+ ```
82
+
83
+ ## Feedback, Issues, Pull Requests
84
+
85
+ The [exercism/haskell](https://github.com/exercism/haskell) repository on
86
+ GitHub is the home for all of the Haskell exercises.
87
+
88
+ If you have feedback about an exercise, or want to help implementing a new
89
+ one, head over there and create an issue. We'll do our best to help you!
90
+
91
+ ## Source
92
+
93
+ Converting a string into a number and some basic processing utilizing a relatable real world example. [https://en.wikipedia.org/wiki/International_Standard_Book_Number#ISBN-10_check_digit_calculation](https://en.wikipedia.org/wiki/International_Standard_Book_Number#ISBN-10_check_digit_calculation)
94
+
95
+ ## Submitting Incomplete Solutions
96
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,16 @@
1
+ name: isbn-verifier
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: IsbnVerifier
8
+ source-dirs: src
9
+
10
+ tests:
11
+ test:
12
+ main: Tests.hs
13
+ source-dirs: test
14
+ dependencies:
15
+ - isbn-verifier
16
+ - hspec
@@ -0,0 +1,10 @@
1
+ module IsbnVerifier (isbn) where
2
+
3
+ isbn :: String -> Bool
4
+ isbn xs = length nums == 10 && g nums `mod` 11 == 0 && l <= 1
5
+ where
6
+ nums = let nxs = f xs in if last xs == 'X' then nxs++[(1,10)] else nxs
7
+ f :: String -> [(Int, Int)]
8
+ f = zip [10,9..1] . map (\x -> read [x]) . filter (`elem` ['0'..'9'])
9
+ g = sum . map (uncurry (*))
10
+ l = length $ filter (=='X') xs
@@ -0,0 +1,20 @@
1
+ name: isbn-verifier
2
+ version: 1.1.0.1
3
+
4
+ dependencies:
5
+ - base
6
+
7
+ library:
8
+ exposed-modules: IsbnVerifier
9
+ source-dirs: src
10
+ dependencies:
11
+ # - foo # List here the packages you
12
+ # - bar # want to use in your solution.
13
+
14
+ tests:
15
+ test:
16
+ main: Tests.hs
17
+ source-dirs: test
18
+ dependencies:
19
+ - isbn-verifier
20
+ - hspec
@@ -0,0 +1,4 @@
1
+ module IsbnVerifier (isbn) where
2
+
3
+ isbn :: String -> Bool
4
+ isbn = error "You need to implement this function."
@@ -0,0 +1 @@
1
+ resolver: lts-9.11
@@ -0,0 +1,74 @@
1
+ {-# LANGUAGE RecordWildCards #-}
2
+
3
+ import Data.Foldable (for_)
4
+ import Test.Hspec (Spec, describe, it, shouldBe)
5
+ import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith)
6
+
7
+ import IsbnVerifier (isbn)
8
+
9
+ main :: IO ()
10
+ main = hspecWith defaultConfig {configFastFail = True} specs
11
+
12
+ specs :: Spec
13
+ specs = describe "isbn" $ for_ cases test
14
+ where
15
+
16
+ test Case{..} = it description assertion
17
+ where
18
+ assertion = isbn input `shouldBe` expected
19
+
20
+ data Case = Case { description :: String
21
+ , input :: String
22
+ , expected :: Bool
23
+ }
24
+
25
+ cases :: [Case]
26
+ cases = [ Case { description = "valid isbn number"
27
+ , input = "3-598-21508-8"
28
+ , expected = True
29
+ }
30
+ , Case { description = "invalid isbn check digit"
31
+ , input = "3-598-21508-9"
32
+ , expected = False
33
+ }
34
+ , Case { description = "valid isbn number with a check digit of 10"
35
+ , input = "3-598-21507-X"
36
+ , expected = True
37
+ }
38
+ , Case { description = "check digit is a character other than X"
39
+ , input = "3-598-21507-A"
40
+ , expected = False
41
+ }
42
+ , Case { description = "invalid character in isbn"
43
+ , input = "3-598-2K507-0"
44
+ , expected = False
45
+ }
46
+ , Case { description = "X is only valid as a check digit"
47
+ , input = "3-598-2X507-9"
48
+ , expected = False
49
+ }
50
+ , Case { description = "valid isbn without separating dashes"
51
+ , input = "3598215088"
52
+ , expected = True
53
+ }
54
+ , Case { description = "isbn without separating dashes and X as check digit"
55
+ , input = "359821507"
56
+ , expected = False
57
+ }
58
+ , Case { description = "too long isbn and no dashes"
59
+ , input = "3598215078X"
60
+ , expected = False
61
+ }
62
+ , Case { description = "isbn without check digit"
63
+ , input = "3-598-21507"
64
+ , expected = False
65
+ }
66
+ , Case { description = "too long isbn"
67
+ , input = "3-598-21507-XX"
68
+ , expected = False
69
+ }
70
+ , Case { description = "check digit of X should not be used for 0"
71
+ , input = "3-598-21515-X"
72
+ , expected = False
73
+ }
74
+ ]
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -9,8 +9,8 @@ actual dirt, and grow actual plants.
9
9
 
10
10
  They've chosen to grow grass, clover, radishes, and violets.
11
11
 
12
- To this end, the children have put little cups along the window sills, and
13
- planted one type of plant in each cup, choosing randomly from the available
12
+ To this end, the children have put little cups along the window sills, and
13
+ planted one type of plant in each cup, choosing randomly from the available
14
14
  types of seeds.
15
15
 
16
16
  ```text
@@ -25,7 +25,7 @@ There are 12 children in the class:
25
25
  - Eve, Fred, Ginny, Harriet,
26
26
  - Ileana, Joseph, Kincaid, and Larry.
27
27
 
28
- Each child gets 4 cups, two on each row. Their teacher assigns cups to
28
+ Each child gets 4 cups, two on each row. Their teacher assigns cups to
29
29
  the children alphabetically by their names.
30
30
 
31
31
  The following diagram represents Alice's plants:
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1,5 +1,5 @@
1
1
  name: leap
2
- version: 1.1.0.4
2
+ version: 1.2.0.5
3
3
 
4
4
  dependencies:
5
5
  - base
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -30,7 +30,7 @@ cases = [ Case { description = "year not divisible by 4: common year"
30
30
  , expected = False
31
31
  }
32
32
  , Case { description = "year divisible by 4, not divisible by 100: leap year"
33
- , input = 2020
33
+ , input = 1996
34
34
  , expected = True
35
35
  }
36
36
  , Case { description = "year divisible by 100, not divisible by 400: common year"
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -1,5 +1,5 @@
1
1
  name: nth-prime
2
- version: 1.0.0.3
2
+ version: 2.0.0.4
3
3
 
4
4
  dependencies:
5
5
  - base
@@ -1 +1 @@
1
- resolver: lts-8.21
1
+ resolver: lts-9.11
@@ -2,8 +2,8 @@
2
2
 
3
3
  Given a single stranded DNA string, compute how many times each nucleotide occurs in the string.
4
4
 
5
- The genetic language of every living thing on the planet is DNA.
6
- DNA is a large molecule that is built from an extremely long sequence of individual elements called nucleotides.
5
+ The genetic language of every living thing on the planet is DNA.
6
+ DNA is a large molecule that is built from an extremely long sequence of individual elements called nucleotides.
7
7
  4 types exist in DNA and these differ only slightly and can be represented as the following symbols: 'A' for adenine, 'C' for cytosine, 'G' for guanine, and 'T' thymine.
8
8
 
9
9
  Here is an analogy:
@@ -1,5 +1,5 @@
1
1
  name: nucleotide-count
2
- version: 1.0.0.3
2
+ version: 1.2.0.4
3
3
 
4
4
  dependencies:
5
5
  - base