trackler 2.2.1.59 → 2.2.1.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/food-chain/canonical-data.json +31 -23
- data/problem-specifications/exercises/house/canonical-data.json +45 -33
- data/problem-specifications/exercises/house/description.md +1 -1
- data/problem-specifications/exercises/kindergarten-garden/description.md +3 -3
- data/problem-specifications/exercises/nucleotide-count/description.md +2 -2
- data/problem-specifications/exercises/palindrome-products/description.md +1 -1
- data/problem-specifications/exercises/rectangles/description.md +9 -9
- data/problem-specifications/exercises/twelve-days/canonical-data.json +171 -0
- data/problem-specifications/exercises/two-bucket/description.md +7 -7
- data/tracks/c/docs/CONTRIBUTING.md +88 -39
- data/tracks/c/exercises/phone-number/test/test_phone_number.c +33 -29
- data/tracks/c/exercises/triangle/src/example.c +12 -12
- data/tracks/c/exercises/triangle/src/example.h +3 -3
- data/tracks/c/exercises/triangle/test/test_triangle.c +16 -16
- data/tracks/c/exercises/word-count/src/example.c +12 -3
- data/tracks/c/exercises/word-count/src/word_count.h +10 -5
- data/tracks/c/exercises/word-count/test/test_word_count.c +248 -58
- data/tracks/ceylon/exercises/hamming/source/hamming/HammingTest.ceylon +3 -3
- data/tracks/ceylon/exercises/leap/source/leap/LeapTest.ceylon +2 -2
- data/tracks/dart/exercises/phone-number/README.md +1 -1
- data/tracks/dart/exercises/phone-number/test/phone_number_test.dart +5 -5
- data/tracks/gnu-apl/.dockerignore +5 -0
- data/tracks/gnu-apl/.travis.yml +9 -4
- data/tracks/gnu-apl/Dockerfiles/release.dockerfile +15 -0
- data/tracks/gnu-apl/Dockerfiles/svn.dockerfile +22 -0
- data/tracks/gnu-apl/README.md +1 -1
- data/tracks/gnu-apl/bin/install-apl +26 -0
- data/tracks/gnu-apl/test.apl +7 -6
- data/tracks/go/docs/TESTS.md +1 -1
- data/tracks/haskell/.travis.yml +1 -1
- data/tracks/haskell/config.json +9 -0
- data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
- data/tracks/haskell/exercises/acronym/package.yaml +1 -1
- data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
- data/tracks/haskell/exercises/acronym/test/Tests.hs +3 -0
- data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
- data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
- data/tracks/haskell/exercises/alphametics/examples/success-standard/src/Alphametics.hs +2 -1
- data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
- data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
- data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary/stack.yaml +1 -1
- data/tracks/haskell/exercises/bob/stack.yaml +1 -1
- data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
- data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
- data/tracks/haskell/exercises/change/stack.yaml +1 -1
- data/tracks/haskell/exercises/clock/stack.yaml +1 -1
- data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -1
- data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/connect/stack.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/test/Tests.hs +9 -5
- data/tracks/haskell/exercises/custom-set/package.yaml +1 -1
- data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
- data/tracks/haskell/exercises/custom-set/test/Tests.hs +3 -0
- data/tracks/haskell/exercises/diamond/stack.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/README.md +3 -3
- data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
- data/tracks/haskell/exercises/etl/stack.yaml +1 -1
- data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
- data/tracks/haskell/exercises/forth/stack.yaml +1 -1
- data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
- data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
- data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
- data/tracks/haskell/exercises/grains/stack.yaml +1 -1
- data/tracks/haskell/exercises/hamming/package.yaml +1 -1
- data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
- data/tracks/haskell/exercises/hamming/test/Tests.hs +4 -4
- data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
- data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
- data/tracks/haskell/exercises/house/README.md +1 -1
- data/tracks/haskell/exercises/house/stack.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/README.md +96 -0
- data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/src/IsbnVerifier.hs +10 -0
- data/tracks/haskell/exercises/isbn-verifier/package.yaml +20 -0
- data/tracks/haskell/exercises/isbn-verifier/src/IsbnVerifier.hs +4 -0
- data/tracks/haskell/exercises/isbn-verifier/stack.yaml +1 -0
- data/tracks/haskell/exercises/isbn-verifier/test/Tests.hs +74 -0
- data/tracks/haskell/exercises/isogram/stack.yaml +1 -1
- data/tracks/haskell/exercises/kindergarten-garden/README.md +3 -3
- data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
- data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
- data/tracks/haskell/exercises/leap/package.yaml +1 -1
- data/tracks/haskell/exercises/leap/stack.yaml +1 -1
- data/tracks/haskell/exercises/leap/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
- data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
- data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
- data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
- data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
- data/tracks/haskell/exercises/nth-prime/package.yaml +1 -1
- data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/README.md +2 -2
- data/tracks/haskell/exercises/nucleotide-count/package.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/test/Tests.hs +6 -0
- data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/octal/stack.yaml +1 -1
- data/tracks/haskell/exercises/palindrome-products/README.md +1 -1
- data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
- data/tracks/haskell/exercises/pangram/package.yaml +1 -1
- data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
- data/tracks/haskell/exercises/pangram/test/Tests.hs +6 -2
- data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
- data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/phone-number/README.md +1 -1
- data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
- data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
- data/tracks/haskell/exercises/pov/stack.yaml +1 -1
- data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
- data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
- data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
- data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
- data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
- data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
- data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
- data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
- data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
- data/tracks/haskell/exercises/say/stack.yaml +1 -1
- data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
- data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
- data/tracks/haskell/exercises/series/stack.yaml +1 -1
- data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
- data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
- data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/strain/stack.yaml +1 -1
- data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
- data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
- data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/wordy/examples/success-standard/src/WordProblem.hs +6 -5
- data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
- data/tracks/haskell/exercises/zebra-puzzle/package.yaml +1 -1
- data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
- data/tracks/haskell/exercises/zipper/README.md +1 -1
- data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
- data/tracks/javascript/.eslintignore +43 -0
- data/tracks/javascript/.travis.yml +2 -1
- data/tracks/javascript/exercises/bowling/README.md +5 -5
- data/tracks/javascript/exercises/crypto-square/example.js +2 -1
- data/tracks/javascript/exercises/diffie-hellman/diffie-hellman.spec.js +20 -20
- data/tracks/javascript/exercises/diffie-hellman/example.js +10 -10
- data/tracks/javascript/exercises/largest-series-product/example.js +2 -1
- data/tracks/javascript/exercises/sieve/example.js +5 -2
- data/tracks/javascript/package-lock.json +129 -76
- data/tracks/javascript/package.json +6 -5
- data/tracks/ocaml/config.json +10 -0
- data/tracks/ocaml/exercises/hamming/test.ml +3 -3
- data/tracks/ocaml/exercises/leap/test.ml +2 -2
- data/tracks/ocaml/exercises/pangram/test.ml +3 -3
- data/tracks/ocaml/exercises/rectangles/.merlin +5 -0
- data/tracks/ocaml/exercises/rectangles/Makefile +11 -0
- data/tracks/ocaml/exercises/rectangles/example.ml +30 -0
- data/tracks/ocaml/exercises/rectangles/rectangles.mli +1 -0
- data/tracks/ocaml/exercises/rectangles/test.ml +72 -0
- data/tracks/ocaml/tools/test-generator/templates/ocaml/leap/test.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/ocaml/rectangles/test.ml +15 -0
- data/tracks/pony/README.md +1 -1
- data/tracks/pony/exercises/atbash-cipher/example.pony +6 -10
- data/tracks/pony/exercises/difference-of-squares/example.pony +3 -7
- data/tracks/rust/_test/count-ignores.sh +2 -2
- data/tracks/rust/config.json +24 -0
- data/tracks/rust/config/maintainers.json +10 -0
- data/tracks/rust/exercises/acronym/README.md +0 -1
- data/tracks/rust/exercises/all-your-base/README.md +1 -1
- data/tracks/rust/exercises/allergies/README.md +0 -1
- data/tracks/rust/exercises/alphametics/README.md +2 -2
- data/tracks/rust/exercises/atbash-cipher/README.md +2 -1
- data/tracks/rust/exercises/beer-song/README.md +1 -1
- data/tracks/rust/exercises/bowling/README.md +20 -6
- data/tracks/rust/exercises/circular-buffer/README.md +13 -6
- data/tracks/rust/exercises/crypto-square/README.md +10 -8
- data/tracks/rust/exercises/dominoes/Cargo.toml +1 -1
- data/tracks/rust/exercises/etl/README.md +2 -0
- data/tracks/rust/exercises/grade-school/README.md +0 -1
- data/tracks/rust/exercises/grains/README.md +0 -1
- data/tracks/rust/exercises/isbn-verifier/Cargo.lock +4 -0
- data/tracks/rust/exercises/isbn-verifier/Cargo.toml +3 -0
- data/tracks/rust/exercises/isbn-verifier/README.md +74 -0
- data/tracks/rust/exercises/isbn-verifier/example.rs +44 -0
- data/tracks/rust/exercises/isbn-verifier/src/lib.rs +4 -0
- data/tracks/rust/exercises/isbn-verifier/tests/isbn-verifier.rs +83 -0
- data/tracks/rust/exercises/isogram/README.md +3 -2
- data/tracks/rust/exercises/leap/README.md +1 -1
- data/tracks/rust/exercises/luhn/README.md +7 -7
- data/tracks/rust/exercises/nucleotide-count/README.md +8 -22
- data/tracks/rust/exercises/ocr-numbers/README.md +5 -5
- data/tracks/rust/exercises/pangram/README.md +1 -1
- data/tracks/rust/exercises/pascals-triangle/README.md +1 -1
- data/tracks/rust/exercises/perfect-numbers/README.md +2 -2
- data/tracks/rust/exercises/phone-number/README.md +3 -2
- data/tracks/rust/exercises/protein-translation/README.md +4 -5
- data/tracks/rust/exercises/proverb/README.md +13 -11
- data/tracks/rust/exercises/proverb/example.rs +14 -15
- data/tracks/rust/exercises/proverb/tests/proverb.rs +40 -13
- data/tracks/rust/exercises/pythagorean-triplet/README.md +3 -3
- data/tracks/rust/exercises/queen-attack/README.md +1 -1
- data/tracks/rust/exercises/rectangles/README.md +7 -7
- data/tracks/rust/exercises/roman-numerals/README.md +1 -1
- data/tracks/rust/exercises/rotational-cipher/README.md +2 -1
- data/tracks/rust/exercises/run-length-encoding/README.md +4 -4
- data/tracks/rust/exercises/scrabble-score/README.md +3 -1
- data/tracks/rust/exercises/space-age/README.md +1 -1
- data/tracks/rust/exercises/tournament/README.md +5 -5
- data/tracks/rust/exercises/triangle/README.md +9 -6
- data/tracks/rust/exercises/two-bucket/Cargo.lock +4 -0
- data/tracks/rust/exercises/two-bucket/Cargo.toml +3 -0
- data/tracks/rust/exercises/two-bucket/README.md +69 -0
- data/tracks/rust/exercises/two-bucket/example.rs +129 -0
- data/tracks/rust/exercises/two-bucket/src/lib.rs +26 -0
- data/tracks/rust/exercises/two-bucket/tests/two-bucket.rs +68 -0
- data/tracks/rust/exercises/variable-length-quantity/README.md +6 -7
- data/tracks/rust/exercises/word-count/README.md +1 -2
- data/tracks/rust/exercises/wordy/README.md +0 -5
- metadata +33 -4
- data/tracks/go/.github/PULL_REQUEST_TEMPLATE.md +0 -23
- data/tracks/ruby/.github/PULL_REQUEST_TEMPLATE.md +0 -40
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
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 `
|
|
11
|
-
like `
|
|
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
|
|
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-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
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 = "
|
|
71
|
-
, strand2 = "
|
|
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 = "
|
|
76
|
-
, strand2 = "
|
|
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-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# House
|
|
2
2
|
|
|
3
|
-
|
|
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-
|
|
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,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 @@
|
|
|
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-
|
|
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-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
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 =
|
|
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-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-9.11
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
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:
|