trackler 2.2.1.54 → 2.2.1.55
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/dominoes/description.md +3 -3
- data/problem-specifications/exercises/two-fer/description.md +0 -28
- data/tracks/c/config.json +12 -0
- data/tracks/c/exercises/queen-attack/README.md +65 -0
- data/tracks/c/exercises/queen-attack/makefile +15 -0
- data/tracks/c/exercises/queen-attack/src/example.c +25 -0
- data/tracks/c/exercises/queen-attack/src/queen_attack.h +19 -0
- data/tracks/c/exercises/queen-attack/test/test_queen_attack.c +190 -0
- data/tracks/c/exercises/queen-attack/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/queen-attack/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/queen-attack/test/vendor/unity_internals.h +701 -0
- data/tracks/common-lisp/exercises/acronym/README.md +1 -1
- data/tracks/delphi/exercises/two-fer/README.md +0 -28
- data/tracks/ecmascript/config.json +41 -0
- data/tracks/ecmascript/exercises/accumulate/package.json +5 -3
- data/tracks/ecmascript/exercises/acronym/package.json +5 -3
- data/tracks/ecmascript/exercises/all-your-base/package.json +5 -3
- data/tracks/ecmascript/exercises/allergies/package.json +5 -3
- data/tracks/ecmascript/exercises/alphametics/package.json +5 -3
- data/tracks/ecmascript/exercises/anagram/package.json +5 -3
- data/tracks/ecmascript/exercises/atbash-cipher/package.json +5 -3
- data/tracks/ecmascript/exercises/beer-song/package.json +5 -3
- data/tracks/ecmascript/exercises/binary-search-tree/package.json +5 -3
- data/tracks/ecmascript/exercises/binary-search/package.json +5 -3
- data/tracks/ecmascript/exercises/binary/package.json +5 -3
- data/tracks/ecmascript/exercises/bob/package.json +5 -3
- data/tracks/ecmascript/exercises/bowling/package.json +2 -2
- data/tracks/ecmascript/exercises/bracket-push/package.json +5 -3
- data/tracks/ecmascript/exercises/change/README.md +44 -0
- data/tracks/ecmascript/exercises/change/change.spec.js +80 -0
- data/tracks/ecmascript/exercises/change/example.js +120 -0
- data/tracks/ecmascript/exercises/change/package.json +69 -0
- data/tracks/ecmascript/exercises/circular-buffer/package.json +5 -3
- data/tracks/ecmascript/exercises/clock/package.json +5 -3
- data/tracks/ecmascript/exercises/collatz-conjecture/package.json +6 -4
- data/tracks/ecmascript/exercises/connect/package.json +5 -3
- data/tracks/ecmascript/exercises/crypto-square/package.json +5 -3
- data/tracks/ecmascript/exercises/custom-set/package.json +5 -3
- data/tracks/ecmascript/exercises/diamond/package.json +5 -3
- data/tracks/ecmascript/exercises/difference-of-squares/package.json +5 -3
- data/tracks/ecmascript/exercises/diffie-hellman/package.json +5 -3
- data/tracks/ecmascript/exercises/etl/package.json +5 -3
- data/tracks/ecmascript/exercises/flatten-array/package.json +5 -3
- data/tracks/ecmascript/exercises/food-chain/package.json +5 -3
- data/tracks/ecmascript/exercises/gigasecond/package.json +5 -3
- data/tracks/ecmascript/exercises/grade-school/package.json +5 -3
- data/tracks/ecmascript/exercises/grains/package.json +5 -3
- data/tracks/ecmascript/exercises/hamming/package.json +5 -3
- data/tracks/ecmascript/exercises/hello-world/package.json +5 -3
- data/tracks/ecmascript/exercises/hexadecimal/package.json +5 -3
- data/tracks/ecmascript/exercises/isbn-verifier/README.md +62 -0
- data/tracks/ecmascript/exercises/isbn-verifier/example.js +17 -0
- data/tracks/ecmascript/exercises/isbn-verifier/isbn-verifier.spec.js +81 -0
- data/tracks/ecmascript/exercises/isbn-verifier/package.json +71 -0
- data/tracks/ecmascript/exercises/isogram/package.json +5 -3
- data/tracks/ecmascript/exercises/kindergarten-garden/package.json +5 -3
- data/tracks/ecmascript/exercises/largest-series-product/package.json +5 -3
- data/tracks/ecmascript/exercises/leap/package.json +5 -3
- data/tracks/ecmascript/exercises/linked-list/package.json +5 -3
- data/tracks/ecmascript/exercises/list-ops/package.json +5 -3
- data/tracks/ecmascript/exercises/luhn/package.json +5 -3
- data/tracks/ecmascript/exercises/matrix/package.json +5 -3
- data/tracks/ecmascript/exercises/meetup/package.json +5 -3
- data/tracks/ecmascript/exercises/minesweeper/package.json +5 -3
- data/tracks/ecmascript/exercises/nth-prime/package.json +5 -3
- data/tracks/ecmascript/exercises/ocr-numbers/package.json +5 -3
- data/tracks/ecmascript/exercises/octal/package.json +5 -3
- data/tracks/ecmascript/exercises/palindrome-products/package.json +5 -3
- data/tracks/ecmascript/exercises/pangram/package.json +5 -3
- data/tracks/ecmascript/exercises/pascals-triangle/package.json +5 -3
- data/tracks/ecmascript/exercises/perfect-numbers/package.json +5 -3
- data/tracks/ecmascript/exercises/phone-number/package.json +5 -3
- data/tracks/ecmascript/exercises/pig-latin/package.json +5 -3
- data/tracks/ecmascript/exercises/prime-factors/package.json +5 -3
- data/tracks/ecmascript/exercises/proverb/package.json +5 -3
- data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +5 -3
- data/tracks/ecmascript/exercises/queen-attack/package.json +5 -3
- data/tracks/ecmascript/exercises/raindrops/package.json +5 -3
- data/tracks/ecmascript/exercises/rna-transcription/package.json +5 -3
- data/tracks/ecmascript/exercises/robot-name/package.json +5 -3
- data/tracks/ecmascript/exercises/robot-simulator/package.json +5 -3
- data/tracks/ecmascript/exercises/roman-numerals/package.json +5 -3
- data/tracks/ecmascript/exercises/run-length-encoding/package.json +5 -3
- data/tracks/ecmascript/exercises/saddle-points/package.json +5 -3
- data/tracks/ecmascript/exercises/say/package.json +5 -3
- data/tracks/ecmascript/exercises/scrabble-score/package.json +5 -3
- data/tracks/ecmascript/exercises/secret-handshake/package.json +5 -3
- data/tracks/ecmascript/exercises/series/package.json +5 -3
- data/tracks/ecmascript/exercises/sieve/package.json +5 -3
- data/tracks/ecmascript/exercises/simple-cipher/package.json +5 -3
- data/tracks/ecmascript/exercises/simple-linked-list/package.json +5 -3
- data/tracks/ecmascript/exercises/space-age/package.json +5 -3
- data/tracks/ecmascript/exercises/strain/package.json +5 -3
- data/tracks/ecmascript/exercises/sublist/package.json +5 -3
- data/tracks/ecmascript/exercises/sum-of-multiples/package.json +5 -3
- data/tracks/ecmascript/exercises/transpose/README.md +94 -0
- data/tracks/ecmascript/exercises/transpose/example.js +12 -0
- data/tracks/ecmascript/exercises/transpose/package.json +71 -0
- data/tracks/ecmascript/exercises/transpose/transpose.spec.js +67 -0
- data/tracks/ecmascript/exercises/triangle/package.json +5 -3
- data/tracks/ecmascript/exercises/trinary/package.json +5 -3
- data/tracks/ecmascript/exercises/twelve-days/package.json +5 -3
- data/tracks/ecmascript/exercises/two-bucket/package.json +5 -3
- data/tracks/ecmascript/exercises/two-fer/package.json +5 -3
- data/tracks/ecmascript/exercises/word-count/package.json +5 -3
- data/tracks/ecmascript/exercises/word-search/package.json +5 -3
- data/tracks/ecmascript/exercises/wordy/package.json +5 -3
- data/tracks/ecmascript/package-lock.json +6219 -0
- data/tracks/ecmascript/package.json +5 -3
- data/tracks/erlang/exercises/collatz-conjecture/src/collatz_conjecture.erl +3 -4
- data/tracks/erlang/exercises/collatz-conjecture/src/example.erl +3 -3
- data/tracks/erlang/exercises/collatz-conjecture/test/collatz_conjecture_tests.erl +13 -9
- data/tracks/erlang/exercises/hello-world/src/hello_world.erl +2 -2
- data/tracks/erlang/exercises/leap/src/example.erl +1 -1
- data/tracks/erlang/exercises/leap/src/leap.erl +3 -3
- data/tracks/erlang/exercises/leap/test/leap_tests.erl +9 -9
- data/tracks/erlang/testgen/src/testgen.erl +16 -13
- data/tracks/erlang/testgen/src/tgen.erl +65 -38
- data/tracks/erlang/testgen/src/tgen_collatz-conjecture.erl +38 -0
- data/tracks/erlang/testgen/src/tgen_hello-world.erl +11 -19
- data/tracks/erlang/testgen/src/tgen_leap.erl +31 -0
- data/tracks/erlang/testgen/src/tgs.erl +80 -0
- data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +78 -23
- data/tracks/fsharp/exercises/anagram/AnagramTest.fs +66 -34
- data/tracks/fsharp/exercises/connect/ConnectTest.fs +81 -68
- data/tracks/fsharp/exercises/connect/Example.fs +9 -5
- data/tracks/fsharp/exercises/food-chain/Example.fs +5 -9
- data/tracks/fsharp/exercises/food-chain/FoodChain.fs +2 -2
- data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +143 -75
- data/tracks/fsharp/exercises/hamming/Example.fs +8 -4
- data/tracks/fsharp/exercises/hamming/Hamming.fs +1 -1
- data/tracks/fsharp/exercises/hamming/HammingTest.fs +53 -13
- data/tracks/fsharp/exercises/house/Example.fs +5 -6
- data/tracks/fsharp/exercises/house/House.fs +3 -1
- data/tracks/fsharp/exercises/house/HouseTest.fs +272 -96
- data/tracks/fsharp/exercises/meetup/Example.fs +1 -1
- data/tracks/fsharp/exercises/meetup/Meetup.fs +1 -1
- data/tracks/fsharp/exercises/meetup/MeetupTest.fs +384 -73
- data/tracks/fsharp/exercises/ocr-numbers/Example.fs +43 -35
- data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +160 -125
- data/tracks/fsharp/exercises/two-fer/Example.fs +4 -2
- data/tracks/fsharp/exercises/two-fer/TwoFer.fs +1 -1
- data/tracks/fsharp/exercises/two-fer/TwoFerTest.fs +7 -4
- data/tracks/fsharp/generators/Common.fs +6 -2
- data/tracks/fsharp/generators/Exercise.fs +14 -13
- data/tracks/fsharp/generators/Generators.fs +145 -2
- data/tracks/fsharp/generators/Options.fs +4 -6
- data/tracks/fsharp/generators/Output.fs +2 -2
- data/tracks/fsharp/generators/Program.fs +4 -3
- data/tracks/java/exercises/saddle-points/README.md +1 -1
- data/tracks/java/exercises/two-fer/README.md +0 -28
- data/tracks/javascript/exercises/beer-song/example.js +18 -14
- data/tracks/kotlin/exercises/saddle-points/README.md +1 -1
- data/tracks/kotlin/exercises/two-fer/README.md +0 -28
- data/tracks/lua/config.json +12 -0
- data/tracks/lua/exercises/collatz-conjecture/README.md +43 -0
- data/tracks/lua/exercises/collatz-conjecture/collatz-conjecture_spec.lua +33 -0
- data/tracks/lua/exercises/collatz-conjecture/example.lua +16 -0
- data/tracks/python/config.json +4 -1
- data/tracks/python/exercises/binary-search/binary_search_test.py +2 -0
- data/tracks/python/exercises/change/change_test.py +2 -0
- data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +56 -50
- data/tracks/python/exercises/forth/example.py +3 -1
- data/tracks/python/exercises/forth/forth_test.py +43 -26
- data/tracks/python/exercises/nth-prime/nth_prime.py +1 -1
- data/tracks/python/exercises/rna-transcription/README.md +5 -0
- data/tracks/python/exercises/rna-transcription/example.py +1 -1
- data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +7 -4
- data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +9 -7
- data/tracks/python/exercises/saddle-points/saddle_points_test.py +15 -5
- data/tracks/python/exercises/simple-cipher/simple_cipher.py +7 -1
- data/tracks/python/exercises/word-count/example.py +6 -4
- data/tracks/python/exercises/word-count/word_count_test.py +49 -22
- data/tracks/python/exercises/word-search/word_search_test.py +104 -12
- data/tracks/rust/.travis.yml +2 -0
- data/tracks/rust/README.md +5 -0
- data/tracks/rust/_test/check-exercises.sh +0 -6
- data/tracks/rust/_test/ensure-lib-src-rs-exist.sh +19 -0
- data/tracks/rust/_test/ensure-stubs-compile.sh +26 -0
- data/tracks/rust/config.json +12 -0
- data/tracks/rust/config/exercise-readme-insert.md +3 -2
- data/tracks/rust/docs/ABOUT.md +2 -2
- data/tracks/rust/docs/LEARNING.md +1 -1
- data/tracks/rust/docs/RESOURCES.md +1 -1
- data/tracks/rust/docs/TESTS.md +2 -2
- data/tracks/rust/exercises/accumulate/README.md +3 -2
- data/tracks/rust/exercises/acronym/README.md +3 -2
- data/tracks/rust/exercises/all-your-base/README.md +3 -2
- data/tracks/rust/exercises/allergies/README.md +3 -2
- data/tracks/rust/exercises/alphametics/README.md +3 -2
- data/tracks/rust/exercises/anagram/README.md +3 -2
- data/tracks/rust/exercises/atbash-cipher/README.md +3 -2
- data/tracks/rust/exercises/beer-song/README.md +3 -2
- data/tracks/rust/exercises/beer-song/src/lib.rs +2 -2
- data/tracks/rust/exercises/binary-search/README.md +3 -2
- data/tracks/rust/exercises/bob/README.md +3 -2
- data/tracks/rust/exercises/bob/src/lib.rs +1 -1
- data/tracks/rust/exercises/bowling/README.md +3 -2
- data/tracks/rust/exercises/bracket-push/HINTS.md +1 -1
- data/tracks/rust/exercises/bracket-push/README.md +4 -3
- data/tracks/rust/exercises/circular-buffer/README.md +3 -2
- data/tracks/rust/exercises/clock/README.md +3 -2
- data/tracks/rust/exercises/collatz-conjecture/README.md +3 -2
- data/tracks/rust/exercises/collatz-conjecture/src/lib.rs +1 -1
- data/tracks/rust/exercises/crypto-square/README.md +3 -2
- data/tracks/rust/exercises/custom-set/README.md +3 -2
- data/tracks/rust/exercises/decimal/.meta/ALLOWED_TO_NOT_COMPILE +2 -0
- data/tracks/rust/exercises/decimal/README.md +3 -2
- data/tracks/rust/exercises/difference-of-squares/README.md +3 -2
- data/tracks/rust/exercises/difference-of-squares/src/lib.rs +3 -3
- data/tracks/rust/exercises/dominoes/README.md +3 -2
- data/tracks/rust/exercises/etl/README.md +3 -2
- data/tracks/rust/exercises/forth/README.md +3 -2
- data/tracks/rust/exercises/forth/src/lib.rs +3 -0
- data/tracks/rust/exercises/gigasecond/README.md +3 -2
- data/tracks/rust/exercises/grade-school/README.md +3 -2
- data/tracks/rust/exercises/grains/README.md +3 -2
- data/tracks/rust/exercises/hamming/README.md +3 -2
- data/tracks/rust/exercises/hello-world/GETTING_STARTED.md +1 -1
- data/tracks/rust/exercises/hello-world/README.md +3 -2
- data/tracks/rust/exercises/hexadecimal/README.md +3 -2
- data/tracks/rust/exercises/isogram/.gitignore +8 -0
- data/tracks/rust/exercises/isogram/Cargo.toml +3 -0
- data/tracks/rust/exercises/isogram/README.md +52 -0
- data/tracks/rust/exercises/isogram/example.rs +12 -0
- data/tracks/rust/exercises/isogram/src/lib.rs +0 -0
- data/tracks/rust/exercises/isogram/tests/isogram.rs +72 -0
- data/tracks/rust/exercises/largest-series-product/README.md +3 -2
- data/tracks/rust/exercises/leap/README.md +3 -2
- data/tracks/rust/exercises/leap/src/lib.rs +1 -1
- data/tracks/rust/exercises/luhn-from/README.md +3 -2
- data/tracks/rust/exercises/luhn-trait/.meta/description.md +2 -2
- data/tracks/rust/exercises/luhn-trait/README.md +5 -4
- data/tracks/rust/exercises/luhn/README.md +3 -2
- data/tracks/rust/exercises/minesweeper/README.md +3 -2
- data/tracks/rust/exercises/nth-prime/README.md +3 -2
- data/tracks/rust/exercises/nucleotide-codons/README.md +3 -2
- data/tracks/rust/exercises/nucleotide-count/README.md +3 -2
- data/tracks/rust/exercises/ocr-numbers/README.md +3 -2
- data/tracks/rust/exercises/pangram/README.md +3 -2
- data/tracks/rust/exercises/parallel-letter-frequency/HINTS.md +1 -1
- data/tracks/rust/exercises/parallel-letter-frequency/README.md +4 -3
- data/tracks/rust/exercises/pascals-triangle/README.md +3 -2
- data/tracks/rust/exercises/perfect-numbers/README.md +3 -2
- data/tracks/rust/exercises/phone-number/README.md +3 -2
- data/tracks/rust/exercises/pig-latin/README.md +3 -2
- data/tracks/rust/exercises/poker/README.md +3 -2
- data/tracks/rust/exercises/prime-factors/README.md +3 -2
- data/tracks/rust/exercises/protein-translation/README.md +3 -2
- data/tracks/rust/exercises/proverb/README.md +3 -2
- data/tracks/rust/exercises/proverb/src/lib.rs +1 -1
- data/tracks/rust/exercises/pythagorean-triplet/README.md +3 -2
- data/tracks/rust/exercises/queen-attack/README.md +3 -2
- data/tracks/rust/exercises/raindrops/README.md +3 -2
- data/tracks/rust/exercises/raindrops/src/lib.rs +1 -1
- data/tracks/rust/exercises/react/README.md +3 -2
- data/tracks/rust/exercises/rectangles/README.md +3 -2
- data/tracks/rust/exercises/rna-transcription/README.md +3 -2
- data/tracks/rust/exercises/robot-name/README.md +3 -2
- data/tracks/rust/exercises/robot-simulator/README.md +3 -2
- data/tracks/rust/exercises/roman-numerals/README.md +3 -2
- data/tracks/rust/exercises/rotational-cipher/README.md +3 -2
- data/tracks/rust/exercises/run-length-encoding/README.md +3 -2
- data/tracks/rust/exercises/say/README.md +3 -2
- data/tracks/rust/exercises/scrabble-score/README.md +3 -2
- data/tracks/rust/exercises/sieve/README.md +3 -2
- data/tracks/rust/exercises/space-age/README.md +3 -2
- data/tracks/rust/exercises/sublist/README.md +3 -2
- data/tracks/rust/exercises/sum-of-multiples/README.md +3 -2
- data/tracks/rust/exercises/sum-of-multiples/src/lib.rs +1 -1
- data/tracks/rust/exercises/tournament/README.md +3 -2
- data/tracks/rust/exercises/triangle/HINTS.md +2 -2
- data/tracks/rust/exercises/triangle/README.md +5 -4
- data/tracks/rust/exercises/variable-length-quantity/README.md +3 -2
- data/tracks/rust/exercises/word-count/README.md +3 -2
- data/tracks/rust/exercises/wordy/README.md +3 -2
- metadata +38 -3
- data/tracks/ecmascript/yarn.lock +0 -3144
@@ -9,7 +9,7 @@
|
|
9
9
|
"url": "https://github.com/exercism/xecmascript"
|
10
10
|
},
|
11
11
|
"devDependencies": {
|
12
|
-
"babel-jest": "^
|
12
|
+
"babel-jest": "^21.2.0",
|
13
13
|
"babel-plugin-transform-builtin-extend": "^1.1.2",
|
14
14
|
"babel-preset-env": "^1.4.0",
|
15
15
|
"eslint": "^3.19.0",
|
@@ -17,7 +17,7 @@
|
|
17
17
|
"eslint-plugin-import": "^2.2.0",
|
18
18
|
"eslint-plugin-jsx-a11y": "^5.0.1",
|
19
19
|
"eslint-plugin-react": "^7.0.1",
|
20
|
-
"jest": "^
|
20
|
+
"jest": "^21.2.1"
|
21
21
|
},
|
22
22
|
"jest": {
|
23
23
|
"modulePathIgnorePatterns": [
|
@@ -9,7 +9,7 @@
|
|
9
9
|
"url": "https://github.com/exercism/xecmascript"
|
10
10
|
},
|
11
11
|
"devDependencies": {
|
12
|
-
"babel-jest": "^
|
12
|
+
"babel-jest": "^21.2.0",
|
13
13
|
"babel-plugin-transform-builtin-extend": "^1.1.2",
|
14
14
|
"babel-preset-env": "^1.4.0",
|
15
15
|
"eslint": "^3.19.0",
|
@@ -17,7 +17,7 @@
|
|
17
17
|
"eslint-plugin-import": "^2.2.0",
|
18
18
|
"eslint-plugin-jsx-a11y": "^5.0.1",
|
19
19
|
"eslint-plugin-react": "^7.0.1",
|
20
|
-
"jest": "^
|
20
|
+
"jest": "^21.2.1"
|
21
21
|
},
|
22
22
|
"jest": {
|
23
23
|
"modulePathIgnorePatterns": [
|
@@ -37,7 +37,9 @@
|
|
37
37
|
]
|
38
38
|
}
|
39
39
|
],
|
40
|
-
[
|
40
|
+
[
|
41
|
+
"transform-regenerator"
|
42
|
+
]
|
41
43
|
]
|
42
44
|
},
|
43
45
|
"scripts": {
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Change
|
2
|
+
|
3
|
+
Correctly determine the change to be given using the least number of coins.
|
4
|
+
|
5
|
+
The solution will need to accept a value of change to be given and an array of
|
6
|
+
coin denominations. The program returns the array of coin denominations to
|
7
|
+
produce the correct amount of change. For example, if change for 37 cents
|
8
|
+
is required from coins with the denominations of 1, 5, 10 and 25 then the
|
9
|
+
result is an array with the values: 1, 1, 10 and 25.
|
10
|
+
|
11
|
+
## Setup
|
12
|
+
|
13
|
+
Go through the setup instructions for ECMAScript to
|
14
|
+
install the necessary dependencies:
|
15
|
+
|
16
|
+
http://exercism.io/languages/ecmascript
|
17
|
+
|
18
|
+
## Requirements
|
19
|
+
|
20
|
+
Install assignment dependencies:
|
21
|
+
|
22
|
+
```bash
|
23
|
+
$ npm install
|
24
|
+
```
|
25
|
+
|
26
|
+
## Making the Test Suite Pass
|
27
|
+
|
28
|
+
Execute the tests with:
|
29
|
+
|
30
|
+
```bash
|
31
|
+
$ npm test
|
32
|
+
```
|
33
|
+
|
34
|
+
In the test suite, all tests but the first have been skipped.
|
35
|
+
|
36
|
+
Once you get a test passing, you can enable the next one by
|
37
|
+
changing `xtest` to `test`.
|
38
|
+
|
39
|
+
## Source
|
40
|
+
|
41
|
+
Unknown
|
42
|
+
|
43
|
+
## Submitting Incomplete Solutions
|
44
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import Change from './change';
|
2
|
+
|
3
|
+
describe('Change', () => {
|
4
|
+
test('test change for 1 cent', () => {
|
5
|
+
const change = new Change();
|
6
|
+
const result = change.calculate([1, 5, 10, 25], 1);
|
7
|
+
expect(result).toEqual([1]);
|
8
|
+
});
|
9
|
+
|
10
|
+
xtest('test single coin change', () => {
|
11
|
+
const change = new Change();
|
12
|
+
const result = change.calculate([1, 5, 10, 25, 100], 25);
|
13
|
+
expect(result).toEqual([25]);
|
14
|
+
});
|
15
|
+
|
16
|
+
xtest('test multiple coin change', () => {
|
17
|
+
const change = new Change();
|
18
|
+
const result = change.calculate([1, 5, 10, 25, 100], 15);
|
19
|
+
expect(result).toEqual([5, 10]);
|
20
|
+
});
|
21
|
+
|
22
|
+
xtest('test change with Lilliputian Coins where a greedy algorithm fails', () => {
|
23
|
+
// https://en.wikipedia.org/wiki/Change-making_problem#Greedy_method
|
24
|
+
const change = new Change();
|
25
|
+
const result = change.calculate([1, 4, 15, 20, 50], 23);
|
26
|
+
expect(result).toEqual([4, 4, 15]);
|
27
|
+
});
|
28
|
+
|
29
|
+
xtest('test change with Lower Elbonia Coins where a greedy algorithm fails', () => {
|
30
|
+
// https://en.wikipedia.org/wiki/Change-making_problem#Greedy_method
|
31
|
+
const change = new Change();
|
32
|
+
const result = change.calculate([1, 5, 10, 21, 25], 63);
|
33
|
+
expect(result).toEqual([21, 21, 21]);
|
34
|
+
});
|
35
|
+
|
36
|
+
xtest('test large amount of change', () => {
|
37
|
+
const change = new Change();
|
38
|
+
const result = change.calculate([1, 2, 5, 10, 20, 50, 100], 999);
|
39
|
+
expect(result).toEqual([2, 2, 5, 20, 20, 50, 100, 100, 100, 100, 100, 100, 100, 100, 100]);
|
40
|
+
});
|
41
|
+
|
42
|
+
xtest('test possible change without unit coins available', () => {
|
43
|
+
const change = new Change();
|
44
|
+
const result = change.calculate([2, 5, 10, 20, 50], 21);
|
45
|
+
expect(result).toEqual([2, 2, 2, 5, 10]);
|
46
|
+
});
|
47
|
+
|
48
|
+
xtest('test another possible change without unit coins available', () => {
|
49
|
+
const change = new Change();
|
50
|
+
const result = change.calculate([4, 5], 27);
|
51
|
+
expect(result).toEqual([4, 4, 4, 5, 5, 5]);
|
52
|
+
});
|
53
|
+
|
54
|
+
xtest('test no coins make 0 change', () => {
|
55
|
+
const change = new Change();
|
56
|
+
const result = change.calculate([1, 5, 10, 21, 25], 0);
|
57
|
+
expect(result).toEqual([]);
|
58
|
+
});
|
59
|
+
|
60
|
+
xtest('error testing for change smaller than the smallest of coins', () => {
|
61
|
+
const change = new Change();
|
62
|
+
const message = 'The total 3 cannot be represented in the given currency.';
|
63
|
+
const test = () => { change.calculate([5, 10], 3); };
|
64
|
+
expect(test).toThrowError(Error, message);
|
65
|
+
});
|
66
|
+
|
67
|
+
xtest('error testing if no combination can add up to target', () => {
|
68
|
+
const change = new Change();
|
69
|
+
const message = 'The total 94 cannot be represented in the given currency.';
|
70
|
+
const test = () => { change.calculate([5, 10], 94); };
|
71
|
+
expect(test).toThrowError(Error, message);
|
72
|
+
});
|
73
|
+
|
74
|
+
xtest('negative change is rejected', () => {
|
75
|
+
const change = new Change();
|
76
|
+
const message = 'Negative totals are not allowed.';
|
77
|
+
const test = () => { change.calculate([1, 2, 5], -5); };
|
78
|
+
expect(test).toThrowError(Error, message);
|
79
|
+
});
|
80
|
+
});
|
@@ -0,0 +1,120 @@
|
|
1
|
+
// data structure to hold each candidate solution that is generated
|
2
|
+
class Candidate {
|
3
|
+
constructor() {
|
4
|
+
this.wasSearched = false;
|
5
|
+
this.coins = [];
|
6
|
+
}
|
7
|
+
|
8
|
+
searched() {
|
9
|
+
this.wasSearched = true;
|
10
|
+
}
|
11
|
+
|
12
|
+
isSearched() {
|
13
|
+
return this.wasSearched;
|
14
|
+
}
|
15
|
+
|
16
|
+
getCoins() {
|
17
|
+
return this.coins;
|
18
|
+
}
|
19
|
+
|
20
|
+
addCoin(coin) {
|
21
|
+
const sortNum = (a, b) => a - b;
|
22
|
+
|
23
|
+
this.coins.push(coin);
|
24
|
+
this.coins.sort(sortNum);
|
25
|
+
}
|
26
|
+
|
27
|
+
getCoinCount() {
|
28
|
+
return this.coins.length;
|
29
|
+
}
|
30
|
+
|
31
|
+
getSum() {
|
32
|
+
const getSum = (total, num) => total + num;
|
33
|
+
return this.coins.reduce(getSum);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
export default class Change {
|
38
|
+
constructor() {
|
39
|
+
this.candidates = [];
|
40
|
+
}
|
41
|
+
calculate(coinArray, target) {
|
42
|
+
const { candidates } = this;
|
43
|
+
// fill the array with 0 to start
|
44
|
+
candidates[target] = 0;
|
45
|
+
candidates.fill(0);
|
46
|
+
|
47
|
+
const isNumber = element => typeof (element) === 'number';
|
48
|
+
|
49
|
+
// save a new candidate to the candidates array
|
50
|
+
const saveCandidate = (candidate) => {
|
51
|
+
const sum = candidate.getSum();
|
52
|
+
|
53
|
+
if (sum <= target) {
|
54
|
+
if (!isNumber(candidates[sum])) {
|
55
|
+
if (candidates[sum].getCoinCount() > candidate.getCoinCount()) {
|
56
|
+
candidates[sum] = candidate;
|
57
|
+
}
|
58
|
+
} else {
|
59
|
+
candidates[sum] = candidate;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
};
|
63
|
+
|
64
|
+
// initialize the candidate array with the given coins only
|
65
|
+
const initialize = () => {
|
66
|
+
coinArray.forEach((coin) => {
|
67
|
+
const candidate = new Candidate();
|
68
|
+
candidate.addCoin(coin);
|
69
|
+
saveCandidate(candidate);
|
70
|
+
});
|
71
|
+
};
|
72
|
+
|
73
|
+
// is everthing searched?
|
74
|
+
const isDone = () => candidates.every(
|
75
|
+
candidate => isNumber(candidate) || candidate.isSearched());
|
76
|
+
|
77
|
+
// get the next unsearched member of the candidate array
|
78
|
+
const getNext = () => candidates.find(
|
79
|
+
candidate => !isNumber(candidate) && !candidate.isSearched());
|
80
|
+
|
81
|
+
// for the candidate, generate another candate for each of the possible coins
|
82
|
+
const branch = (current) => {
|
83
|
+
coinArray.forEach((coin) => {
|
84
|
+
// make a new Candidate for coin type
|
85
|
+
const candidate = new Candidate();
|
86
|
+
// copy the curent coins into it and add the new coin type
|
87
|
+
current.getCoins().forEach((currentCoin) => {
|
88
|
+
candidate.addCoin(currentCoin);
|
89
|
+
});
|
90
|
+
candidate.addCoin(coin);
|
91
|
+
saveCandidate(candidate);
|
92
|
+
});
|
93
|
+
};
|
94
|
+
|
95
|
+
// validation checks up front
|
96
|
+
if (target === 0) return [];
|
97
|
+
|
98
|
+
if (target < 0) {
|
99
|
+
throw new Error('Negative totals are not allowed.');
|
100
|
+
}
|
101
|
+
|
102
|
+
if (target < Math.min.apply(null, coinArray)) {
|
103
|
+
throw new Error(`The total ${target} cannot be represented in the given currency.`);
|
104
|
+
}
|
105
|
+
|
106
|
+
|
107
|
+
initialize();
|
108
|
+
|
109
|
+
// process the arrange until everything is searched
|
110
|
+
while (!isDone()) {
|
111
|
+
const candidate = getNext();
|
112
|
+
branch(candidate);
|
113
|
+
candidate.searched();
|
114
|
+
}
|
115
|
+
|
116
|
+
// print the result
|
117
|
+
if (!isNumber(candidates[target])) return candidates[target].getCoins();
|
118
|
+
throw new Error(`The total ${target} cannot be represented in the given currency.`);
|
119
|
+
}
|
120
|
+
}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
{
|
2
|
+
"name": "xecmascript",
|
3
|
+
"version": "0.0.0",
|
4
|
+
"description": "Exercism exercises in ECMAScript 6.",
|
5
|
+
"author": "Katrina Owen",
|
6
|
+
"private": true,
|
7
|
+
"repository": {
|
8
|
+
"type": "git",
|
9
|
+
"url": "https://github.com/exercism/xecmascript"
|
10
|
+
},
|
11
|
+
"devDependencies": {
|
12
|
+
"babel-jest": "^20.0.3",
|
13
|
+
"babel-plugin-transform-builtin-extend": "^1.1.2",
|
14
|
+
"babel-preset-env": "^1.4.0",
|
15
|
+
"eslint": "^3.19.0",
|
16
|
+
"eslint-config-airbnb": "^15.0.1",
|
17
|
+
"eslint-plugin-import": "^2.2.0",
|
18
|
+
"eslint-plugin-jsx-a11y": "^5.0.1",
|
19
|
+
"eslint-plugin-react": "^7.0.1",
|
20
|
+
"jest": "^20.0.4"
|
21
|
+
},
|
22
|
+
"jest": {
|
23
|
+
"modulePathIgnorePatterns": [
|
24
|
+
"package.json"
|
25
|
+
]
|
26
|
+
},
|
27
|
+
"babel": {
|
28
|
+
"presets": [
|
29
|
+
"env"
|
30
|
+
],
|
31
|
+
"plugins": [
|
32
|
+
[
|
33
|
+
"babel-plugin-transform-builtin-extend",
|
34
|
+
{
|
35
|
+
"globals": [
|
36
|
+
"Error"
|
37
|
+
]
|
38
|
+
}
|
39
|
+
],
|
40
|
+
["transform-regenerator"]
|
41
|
+
]
|
42
|
+
},
|
43
|
+
"scripts": {
|
44
|
+
"test": "jest --no-cache ./*",
|
45
|
+
"watch": "jest --no-cache --watch ./*",
|
46
|
+
"lint": "eslint .",
|
47
|
+
"lint-test": "eslint . && jest --no-cache ./* "
|
48
|
+
},
|
49
|
+
"eslintConfig": {
|
50
|
+
"parserOptions": {
|
51
|
+
"ecmaVersion": 6,
|
52
|
+
"sourceType": "module"
|
53
|
+
},
|
54
|
+
"env": {
|
55
|
+
"es6": true,
|
56
|
+
"node": true,
|
57
|
+
"jest": true
|
58
|
+
},
|
59
|
+
"extends": "airbnb",
|
60
|
+
"rules": {
|
61
|
+
"import/no-unresolved": "off",
|
62
|
+
"import/extensions": "off"
|
63
|
+
}
|
64
|
+
},
|
65
|
+
"licenses": [
|
66
|
+
"MIT"
|
67
|
+
],
|
68
|
+
"dependencies": {}
|
69
|
+
}
|
@@ -9,7 +9,7 @@
|
|
9
9
|
"url": "https://github.com/exercism/xecmascript"
|
10
10
|
},
|
11
11
|
"devDependencies": {
|
12
|
-
"babel-jest": "^
|
12
|
+
"babel-jest": "^21.2.0",
|
13
13
|
"babel-plugin-transform-builtin-extend": "^1.1.2",
|
14
14
|
"babel-preset-env": "^1.4.0",
|
15
15
|
"eslint": "^3.19.0",
|
@@ -17,7 +17,7 @@
|
|
17
17
|
"eslint-plugin-import": "^2.2.0",
|
18
18
|
"eslint-plugin-jsx-a11y": "^5.0.1",
|
19
19
|
"eslint-plugin-react": "^7.0.1",
|
20
|
-
"jest": "^
|
20
|
+
"jest": "^21.2.1"
|
21
21
|
},
|
22
22
|
"jest": {
|
23
23
|
"modulePathIgnorePatterns": [
|
@@ -37,7 +37,9 @@
|
|
37
37
|
]
|
38
38
|
}
|
39
39
|
],
|
40
|
-
[
|
40
|
+
[
|
41
|
+
"transform-regenerator"
|
42
|
+
]
|
41
43
|
]
|
42
44
|
},
|
43
45
|
"scripts": {
|
@@ -9,7 +9,7 @@
|
|
9
9
|
"url": "https://github.com/exercism/xecmascript"
|
10
10
|
},
|
11
11
|
"devDependencies": {
|
12
|
-
"babel-jest": "^
|
12
|
+
"babel-jest": "^21.2.0",
|
13
13
|
"babel-plugin-transform-builtin-extend": "^1.1.2",
|
14
14
|
"babel-preset-env": "^1.4.0",
|
15
15
|
"eslint": "^3.19.0",
|
@@ -17,7 +17,7 @@
|
|
17
17
|
"eslint-plugin-import": "^2.2.0",
|
18
18
|
"eslint-plugin-jsx-a11y": "^5.0.1",
|
19
19
|
"eslint-plugin-react": "^7.0.1",
|
20
|
-
"jest": "^
|
20
|
+
"jest": "^21.2.1"
|
21
21
|
},
|
22
22
|
"jest": {
|
23
23
|
"modulePathIgnorePatterns": [
|
@@ -37,7 +37,9 @@
|
|
37
37
|
]
|
38
38
|
}
|
39
39
|
],
|
40
|
-
[
|
40
|
+
[
|
41
|
+
"transform-regenerator"
|
42
|
+
]
|
41
43
|
]
|
42
44
|
},
|
43
45
|
"scripts": {
|
@@ -9,7 +9,7 @@
|
|
9
9
|
"url": "https://github.com/exercism/xecmascript"
|
10
10
|
},
|
11
11
|
"devDependencies": {
|
12
|
-
"babel-jest": "^
|
12
|
+
"babel-jest": "^21.2.0",
|
13
13
|
"babel-plugin-transform-builtin-extend": "^1.1.2",
|
14
14
|
"babel-preset-env": "^1.4.0",
|
15
15
|
"eslint": "^3.19.0",
|
@@ -17,7 +17,7 @@
|
|
17
17
|
"eslint-plugin-import": "^2.2.0",
|
18
18
|
"eslint-plugin-jsx-a11y": "^5.0.1",
|
19
19
|
"eslint-plugin-react": "^7.0.1",
|
20
|
-
"jest": "^
|
20
|
+
"jest": "^21.2.1"
|
21
21
|
},
|
22
22
|
"jest": {
|
23
23
|
"modulePathIgnorePatterns": [
|
@@ -37,9 +37,11 @@
|
|
37
37
|
]
|
38
38
|
}
|
39
39
|
],
|
40
|
-
[
|
40
|
+
[
|
41
|
+
"transform-regenerator"
|
42
|
+
]
|
41
43
|
]
|
42
|
-
},
|
44
|
+
},
|
43
45
|
"scripts": {
|
44
46
|
"test": "jest --no-cache ./*",
|
45
47
|
"watch": "jest --no-cache --watch ./*",
|