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
@@ -15,7 +15,7 @@ So say you have a matrix like so:
|
|
15
15
|
It has a saddle point at (1, 0).
|
16
16
|
|
17
17
|
It's called a "saddle point" because it is greater than or equal to
|
18
|
-
every element in its row and
|
18
|
+
every element in its row and less than or equal to every element in
|
19
19
|
its column.
|
20
20
|
|
21
21
|
A matrix may have zero or more saddle points.
|
@@ -11,34 +11,6 @@ When X is a name or "you".
|
|
11
11
|
If the given name is "Alice", the result should be "One for Alice, one for me."
|
12
12
|
If no name is given, the result should be "One for you, one for me."
|
13
13
|
|
14
|
-
## Test-Driven Development
|
15
|
-
|
16
|
-
As programmers mature, they eventually want to test their code.
|
17
|
-
|
18
|
-
Here at Exercism we simulate [Test-Driven
|
19
|
-
Development](http://en.wikipedia.org/wiki/Test-driven_development) (TDD), where
|
20
|
-
you write your tests before writing any functionality. The simulation comes in
|
21
|
-
the form of a pre-written test suite, which will signal that you have solved
|
22
|
-
the problem.
|
23
|
-
|
24
|
-
It will also provide you with a safety net to explore other solutions without
|
25
|
-
breaking the functionality.
|
26
|
-
|
27
|
-
### A typical TDD workflow on Exercism:
|
28
|
-
|
29
|
-
1. Run the test file and pick one test that's failing.
|
30
|
-
2. Write some code to fix the test you picked.
|
31
|
-
3. Re-run the tests to confirm the test is now passing.
|
32
|
-
4. Repeat from step 1.
|
33
|
-
5. Submit your solution (`exercism submit /path/to/file`)
|
34
|
-
|
35
|
-
## Instructions
|
36
|
-
|
37
|
-
Submissions are encouraged to be general, within reason. Having said that, it's
|
38
|
-
also important not to over-engineer a solution.
|
39
|
-
|
40
|
-
It's important to remember that the goal is to make code as expressive and
|
41
|
-
readable as we can.
|
42
14
|
|
43
15
|
|
44
16
|
|
data/tracks/lua/config.json
CHANGED
@@ -920,6 +920,18 @@
|
|
920
920
|
],
|
921
921
|
"unlocked_by": "matrix",
|
922
922
|
"uuid": "beca7d79-9237-4344-b058-66e0fa840691"
|
923
|
+
},
|
924
|
+
{
|
925
|
+
"core": false,
|
926
|
+
"difficulty": 3,
|
927
|
+
"slug": "collatz-conjecture",
|
928
|
+
"topics": [
|
929
|
+
"control_flow_if_else_statements",
|
930
|
+
"control_flow_loops",
|
931
|
+
"mathematics"
|
932
|
+
],
|
933
|
+
"unlocked_by": "difference-of-squares",
|
934
|
+
"uuid": "bd4cd740-b78d-11e7-abc4-cec278b6b50a"
|
923
935
|
}
|
924
936
|
],
|
925
937
|
"foregone": [],
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Collatz Conjecture
|
2
|
+
|
3
|
+
The Collatz Conjecture or 3x+1 problem can be summarized as follows:
|
4
|
+
|
5
|
+
Take any positive integer n. If n is even, divide n by 2 to get n / 2. If n is
|
6
|
+
odd, multiply n by 3 and add 1 to get 3n + 1. Repeat the process indefinitely.
|
7
|
+
The conjecture states that no matter which number you start with, you will
|
8
|
+
always reach 1 eventually.
|
9
|
+
|
10
|
+
Given a number n, return the number of steps required to reach 1.
|
11
|
+
|
12
|
+
## Examples
|
13
|
+
|
14
|
+
Starting with n = 12, the steps would be as follows:
|
15
|
+
|
16
|
+
0. 12
|
17
|
+
1. 6
|
18
|
+
2. 3
|
19
|
+
3. 10
|
20
|
+
4. 5
|
21
|
+
5. 16
|
22
|
+
6. 8
|
23
|
+
7. 4
|
24
|
+
8. 2
|
25
|
+
9. 1
|
26
|
+
|
27
|
+
Resulting in 9 steps. So for input n = 12, the return value would be 9.
|
28
|
+
|
29
|
+
## Running the tests
|
30
|
+
|
31
|
+
To run the tests, run the command `busted .` from within the exercise directory.
|
32
|
+
|
33
|
+
## Further information
|
34
|
+
|
35
|
+
For more detailed information about the Lua track, including how to get help if
|
36
|
+
you're having trouble, please visit the exercism.io [Lua language page](http://exercism.io/languages/lua/about).
|
37
|
+
|
38
|
+
## Source
|
39
|
+
|
40
|
+
An unsolved problem in mathematics named after mathematician Lothar Collatz [https://en.wikipedia.org/wiki/3x_%2B_1_problem](https://en.wikipedia.org/wiki/3x_%2B_1_problem)
|
41
|
+
|
42
|
+
## Submitting Incomplete Solutions
|
43
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
local conjecture = require('collatz-conjecture')
|
2
|
+
|
3
|
+
describe('collatz-conjecture', function()
|
4
|
+
it('zero steps for one', function()
|
5
|
+
assert.are.equal(0, conjecture(1))
|
6
|
+
end)
|
7
|
+
|
8
|
+
it('divide if even', function()
|
9
|
+
assert.are.equal(4, conjecture(16))
|
10
|
+
end)
|
11
|
+
|
12
|
+
it('even and odd steps', function()
|
13
|
+
assert.are.equal(9, conjecture(12))
|
14
|
+
end)
|
15
|
+
|
16
|
+
it('large number of even and odd steps', function()
|
17
|
+
assert.are.equal(152, conjecture(1000000))
|
18
|
+
end)
|
19
|
+
|
20
|
+
it('zero is an error', function()
|
21
|
+
assert.has_error(
|
22
|
+
function() conjecture(0) end,
|
23
|
+
'Only positive numbers are allowed'
|
24
|
+
)
|
25
|
+
end)
|
26
|
+
|
27
|
+
it('negative value is an error', function()
|
28
|
+
assert.has_error(
|
29
|
+
function() conjecture(-15) end,
|
30
|
+
'Only positive numbers are allowed'
|
31
|
+
)
|
32
|
+
end)
|
33
|
+
end)
|
data/tracks/python/config.json
CHANGED
@@ -3,6 +3,8 @@ import unittest
|
|
3
3
|
from binary_search import binary_search
|
4
4
|
|
5
5
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
7
|
+
|
6
8
|
class BinarySearchTests(unittest.TestCase):
|
7
9
|
def test_finds_value_in_array_with_one_element(self):
|
8
10
|
self.assertEqual(binary_search([6], 6), 0)
|
@@ -7,43 +7,41 @@ from circular_buffer import (
|
|
7
7
|
)
|
8
8
|
|
9
9
|
|
10
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.1
|
11
|
+
|
10
12
|
class CircularBufferTest(unittest.TestCase):
|
11
13
|
def test_read_empty_buffer(self):
|
12
14
|
buf = CircularBuffer(1)
|
13
15
|
with self.assertRaises(BufferEmptyException):
|
14
16
|
buf.read()
|
15
17
|
|
18
|
+
def test_read_just_written_item(self):
|
19
|
+
buf = CircularBuffer(1)
|
20
|
+
buf.write('1')
|
21
|
+
self.assertEqual(buf.read(), '1')
|
22
|
+
|
16
23
|
def test_write_and_read_back_one_item(self):
|
17
24
|
buf = CircularBuffer(1)
|
18
25
|
buf.write('1')
|
19
|
-
self.assertEqual(
|
26
|
+
self.assertEqual(buf.read(), '1')
|
20
27
|
with self.assertRaises(BufferEmptyException):
|
21
28
|
buf.read()
|
22
29
|
|
23
|
-
def
|
30
|
+
def test_write_and_read_back_multiple_items_ordered(self):
|
24
31
|
buf = CircularBuffer(2)
|
25
32
|
buf.write('1')
|
26
33
|
buf.write('2')
|
27
34
|
self.assertEqual(buf.read(), '1')
|
28
35
|
self.assertEqual(buf.read(), '2')
|
29
|
-
with self.assertRaises(BufferEmptyException):
|
30
|
-
buf.read()
|
31
36
|
|
32
|
-
def
|
33
|
-
buf = CircularBuffer(
|
34
|
-
for c in '123':
|
35
|
-
buf.write(c)
|
36
|
-
buf.clear()
|
37
|
-
with self.assertRaises(BufferEmptyException):
|
38
|
-
buf.read()
|
37
|
+
def test_full_buffer_cant_written(self):
|
38
|
+
buf = CircularBuffer(1)
|
39
39
|
buf.write('1')
|
40
|
-
|
41
|
-
|
42
|
-
buf.write('3')
|
43
|
-
self.assertEqual(buf.read(), '2')
|
40
|
+
with self.assertRaises(BufferFullException):
|
41
|
+
buf.write('2')
|
44
42
|
|
45
43
|
def test_alternate_write_and_read(self):
|
46
|
-
buf = CircularBuffer(
|
44
|
+
buf = CircularBuffer(1)
|
47
45
|
buf.write('1')
|
48
46
|
self.assertEqual(buf.read(), '1')
|
49
47
|
buf.write('2')
|
@@ -53,56 +51,64 @@ class CircularBufferTest(unittest.TestCase):
|
|
53
51
|
buf = CircularBuffer(3)
|
54
52
|
buf.write('1')
|
55
53
|
buf.write('2')
|
56
|
-
buf.read()
|
54
|
+
self.assertEqual(buf.read(), '1')
|
57
55
|
buf.write('3')
|
58
|
-
buf.read()
|
56
|
+
self.assertEqual(buf.read(), '2')
|
59
57
|
self.assertEqual(buf.read(), '3')
|
60
58
|
|
61
|
-
def
|
62
|
-
buf = CircularBuffer(
|
59
|
+
def test_clearing_buffer(self):
|
60
|
+
buf = CircularBuffer(1)
|
63
61
|
buf.write('1')
|
64
|
-
buf.
|
65
|
-
with self.assertRaises(
|
66
|
-
buf.
|
62
|
+
buf.clear()
|
63
|
+
with self.assertRaises(BufferEmptyException):
|
64
|
+
buf.read()
|
67
65
|
|
68
|
-
def
|
69
|
-
buf = CircularBuffer(
|
66
|
+
def test_clear_free_buffer_for_write(self):
|
67
|
+
buf = CircularBuffer(1)
|
70
68
|
buf.write('1')
|
69
|
+
buf.clear()
|
71
70
|
buf.write('2')
|
72
|
-
buf.overwrite('A')
|
73
71
|
self.assertEqual(buf.read(), '2')
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
|
73
|
+
def test_clear_does_nothin_empty_buffer(self):
|
74
|
+
buf = CircularBuffer(1)
|
75
|
+
buf.clear()
|
76
|
+
buf.write('1')
|
77
|
+
self.assertEqual(buf.read(), '1')
|
77
78
|
|
78
79
|
def test_overwrite_non_full_buffer(self):
|
79
80
|
buf = CircularBuffer(2)
|
80
|
-
buf.
|
81
|
+
buf.write('1')
|
81
82
|
buf.overwrite('2')
|
82
83
|
self.assertEqual(buf.read(), '1')
|
83
84
|
self.assertEqual(buf.read(), '2')
|
84
|
-
with self.assertRaises(BufferEmptyException):
|
85
|
-
buf.read()
|
86
85
|
|
87
|
-
def
|
88
|
-
buf = CircularBuffer(
|
89
|
-
|
90
|
-
|
91
|
-
buf.
|
92
|
-
buf.read()
|
86
|
+
def test_overwrite_replaces_oldest_item(self):
|
87
|
+
buf = CircularBuffer(2)
|
88
|
+
buf.write('1')
|
89
|
+
buf.write('2')
|
90
|
+
buf.overwrite('3')
|
91
|
+
self.assertEqual(buf.read(), '2')
|
92
|
+
self.assertEqual(buf.read(), '3')
|
93
|
+
|
94
|
+
def test_write_full_buffer(self):
|
95
|
+
buf = CircularBuffer(2)
|
96
|
+
buf.write('1')
|
97
|
+
buf.write('2')
|
98
|
+
with self.assertRaises(BufferFullException):
|
99
|
+
buf.write('A')
|
100
|
+
|
101
|
+
def test_over_write_replaces_oldest_remaning_item(self):
|
102
|
+
buf = CircularBuffer(3)
|
103
|
+
buf.write('1')
|
104
|
+
buf.write('2')
|
105
|
+
buf.write('3')
|
106
|
+
self.assertEqual(buf.read(), '1')
|
93
107
|
buf.write('4')
|
94
|
-
buf.
|
95
|
-
|
96
|
-
|
97
|
-
buf.
|
98
|
-
buf.overwrite('B')
|
99
|
-
self.assertEqual(buf.read(), '6')
|
100
|
-
self.assertEqual(buf.read(), '7')
|
101
|
-
self.assertEqual(buf.read(), '8')
|
102
|
-
self.assertEqual(buf.read(), 'A')
|
103
|
-
self.assertEqual(buf.read(), 'B')
|
104
|
-
with self.assertRaises(BufferEmptyException):
|
105
|
-
buf.read()
|
108
|
+
buf.overwrite('5')
|
109
|
+
self.assertEqual(buf.read(), '3')
|
110
|
+
self.assertEqual(buf.read(), '4')
|
111
|
+
self.assertEqual(buf.read(), '5')
|
106
112
|
|
107
113
|
|
108
114
|
if __name__ == '__main__':
|
@@ -4,13 +4,30 @@ from forth import evaluate, StackUnderflowError
|
|
4
4
|
|
5
5
|
|
6
6
|
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.2.0
|
7
|
+
# Tests for case-insensitivity are track-specific
|
8
|
+
|
9
|
+
class ForthParsingTest(unittest.TestCase):
|
10
|
+
def test_empty_input_empty_stack(self):
|
11
|
+
input_data = []
|
12
|
+
expected = []
|
13
|
+
self.assertEqual(evaluate(input_data), expected)
|
14
|
+
|
15
|
+
def test_empty_line_empty_stack(self):
|
16
|
+
input_data = [""]
|
17
|
+
expected = []
|
18
|
+
self.assertEqual(evaluate(input_data), expected)
|
19
|
+
|
20
|
+
def test_numbers_just_get_pushed_to_stack(self):
|
21
|
+
input_data = ["1 2 3 4 5"]
|
22
|
+
expected = [1, 2, 3, 4, 5]
|
23
|
+
self.assertEqual(evaluate(input_data), expected)
|
7
24
|
|
8
25
|
|
9
26
|
class ForthAdditionTest(unittest.TestCase):
|
10
27
|
def test_can_add_two_numbers(self):
|
11
28
|
input_data = ["1 2 +"]
|
12
29
|
expected = [3]
|
13
|
-
self.assertEqual(
|
30
|
+
self.assertEqual(evaluate(input_data), expected)
|
14
31
|
|
15
32
|
def test_errors_if_there_is_nothing_on_the_stack(self):
|
16
33
|
input_data = ["+"]
|
@@ -27,7 +44,7 @@ class ForthSubtractionTest(unittest.TestCase):
|
|
27
44
|
def test_can_subtract_two_numbers(self):
|
28
45
|
input_data = ["3 4 -"]
|
29
46
|
expected = [-1]
|
30
|
-
self.assertEqual(
|
47
|
+
self.assertEqual(evaluate(input_data), expected)
|
31
48
|
|
32
49
|
def test_errors_if_there_is_nothing_on_the_stack(self):
|
33
50
|
input_data = ["-"]
|
@@ -44,7 +61,7 @@ class ForthMultiplicationTest(unittest.TestCase):
|
|
44
61
|
def test_can_multiply_two_numbers(self):
|
45
62
|
input_data = ["2 4 *"]
|
46
63
|
expected = [8]
|
47
|
-
self.assertEqual(
|
64
|
+
self.assertEqual(evaluate(input_data), expected)
|
48
65
|
|
49
66
|
def test_errors_if_there_is_nothing_on_the_stack(self):
|
50
67
|
input_data = ["*"]
|
@@ -59,14 +76,14 @@ class ForthMultiplicationTest(unittest.TestCase):
|
|
59
76
|
|
60
77
|
class ForthDivisionTest(unittest.TestCase):
|
61
78
|
def test_can_divide_two_numbers(self):
|
62
|
-
input_data = ["3
|
63
|
-
expected = [
|
64
|
-
self.assertEqual(
|
79
|
+
input_data = ["12 3 /"]
|
80
|
+
expected = [4]
|
81
|
+
self.assertEqual(evaluate(input_data), expected)
|
65
82
|
|
66
83
|
def test_performs_integer_division(self):
|
67
84
|
input_data = ["8 3 /"]
|
68
85
|
expected = [2]
|
69
|
-
self.assertEqual(
|
86
|
+
self.assertEqual(evaluate(input_data), expected)
|
70
87
|
|
71
88
|
def test_errors_if_dividing_by_zero(self):
|
72
89
|
input_data = ["4 0 /"]
|
@@ -88,24 +105,24 @@ class ForthCombinedArithmeticTest(unittest.TestCase):
|
|
88
105
|
def test_addition_and_subtraction(self):
|
89
106
|
input_data = ["1 2 + 4 -"]
|
90
107
|
expected = [-1]
|
91
|
-
self.assertEqual(
|
108
|
+
self.assertEqual(evaluate(input_data), expected)
|
92
109
|
|
93
110
|
def test_multiplication_and_division(self):
|
94
111
|
input_data = ["2 4 * 3 /"]
|
95
112
|
expected = [2]
|
96
|
-
self.assertEqual(
|
113
|
+
self.assertEqual(evaluate(input_data), expected)
|
97
114
|
|
98
115
|
|
99
116
|
class ForthDupTest(unittest.TestCase):
|
100
117
|
def test_copies_the_top_value_on_the_stack(self):
|
101
118
|
input_data = ["1 DUP"]
|
102
119
|
expected = [1, 1]
|
103
|
-
self.assertEqual(
|
120
|
+
self.assertEqual(evaluate(input_data), expected)
|
104
121
|
|
105
122
|
def test_is_case_insensitive(self):
|
106
123
|
input_data = ["1 2 Dup"]
|
107
124
|
expected = [1, 2, 2]
|
108
|
-
self.assertEqual(
|
125
|
+
self.assertEqual(evaluate(input_data), expected)
|
109
126
|
|
110
127
|
def test_errors_if_there_is_nothing_on_the_stack(self):
|
111
128
|
input_data = ["dup"]
|
@@ -117,17 +134,17 @@ class ForthDropTest(unittest.TestCase):
|
|
117
134
|
def test_removes_the_top_value_on_the_stack_if_it_is_the_only_one(self):
|
118
135
|
input_data = ["1 DROP"]
|
119
136
|
expected = []
|
120
|
-
self.assertEqual(
|
137
|
+
self.assertEqual(evaluate(input_data), expected)
|
121
138
|
|
122
139
|
def test_removes_the_top_value_on_the_stack_if_it_not_the_only_one(self):
|
123
140
|
input_data = ["3 4 DROP"]
|
124
141
|
expected = [3]
|
125
|
-
self.assertEqual(
|
142
|
+
self.assertEqual(evaluate(input_data), expected)
|
126
143
|
|
127
144
|
def test_is_case_insensitive(self):
|
128
145
|
input_data = ["1 2 Drop"]
|
129
146
|
expected = [1]
|
130
|
-
self.assertEqual(
|
147
|
+
self.assertEqual(evaluate(input_data), expected)
|
131
148
|
|
132
149
|
def test_errors_if_there_is_nothing_on_the_stack(self):
|
133
150
|
input_data = ["drop"]
|
@@ -139,17 +156,17 @@ class ForthSwapTest(unittest.TestCase):
|
|
139
156
|
def test_swaps_only_two_values_on_stack(self):
|
140
157
|
input_data = ["1 2 SWAP"]
|
141
158
|
expected = [2, 1]
|
142
|
-
self.assertEqual(
|
159
|
+
self.assertEqual(evaluate(input_data), expected)
|
143
160
|
|
144
161
|
def test_swaps_two_two_values_on_stack(self):
|
145
162
|
input_data = ["1 2 3 SWAP"]
|
146
163
|
expected = [1, 3, 2]
|
147
|
-
self.assertEqual(
|
164
|
+
self.assertEqual(evaluate(input_data), expected)
|
148
165
|
|
149
166
|
def test_is_case_insensitive(self):
|
150
167
|
input_data = ["3 4 Swap"]
|
151
168
|
expected = [4, 3]
|
152
|
-
self.assertEqual(
|
169
|
+
self.assertEqual(evaluate(input_data), expected)
|
153
170
|
|
154
171
|
def test_errors_if_there_is_nothing_on_the_stack(self):
|
155
172
|
input_data = ["swap"]
|
@@ -166,17 +183,17 @@ class ForthOverTest(unittest.TestCase):
|
|
166
183
|
def test_copies_the_second_element_if_there_are_only_two(self):
|
167
184
|
input_data = ["1 2 OVER"]
|
168
185
|
expected = [1, 2, 1]
|
169
|
-
self.assertEqual(
|
186
|
+
self.assertEqual(evaluate(input_data), expected)
|
170
187
|
|
171
188
|
def test_copies_the_second_element_if_there_are_more_than_two(self):
|
172
189
|
input_data = ["1 2 3 OVER"]
|
173
190
|
expected = [1, 2, 3, 2]
|
174
|
-
self.assertEqual(
|
191
|
+
self.assertEqual(evaluate(input_data), expected)
|
175
192
|
|
176
193
|
def test_is_case_insensitive(self):
|
177
194
|
input_data = ["3 4 Over"]
|
178
195
|
expected = [3, 4, 3]
|
179
|
-
self.assertEqual(
|
196
|
+
self.assertEqual(evaluate(input_data), expected)
|
180
197
|
|
181
198
|
def test_errors_if_there_is_nothing_on_the_stack(self):
|
182
199
|
input_data = ["over"]
|
@@ -196,7 +213,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
|
|
196
213
|
"1 dup-twice"
|
197
214
|
]
|
198
215
|
expected = [1, 1, 1]
|
199
|
-
self.assertEqual(
|
216
|
+
self.assertEqual(evaluate(input_data), expected)
|
200
217
|
|
201
218
|
def test_execute_in_the_right_order(self):
|
202
219
|
input_data = [
|
@@ -204,7 +221,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
|
|
204
221
|
"countup"
|
205
222
|
]
|
206
223
|
expected = [1, 2, 3]
|
207
|
-
self.assertEqual(
|
224
|
+
self.assertEqual(evaluate(input_data), expected)
|
208
225
|
|
209
226
|
def test_can_override_other_user_defined_words(self):
|
210
227
|
input_data = [
|
@@ -213,7 +230,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
|
|
213
230
|
"1 foo"
|
214
231
|
]
|
215
232
|
expected = [1, 1, 1]
|
216
|
-
self.assertEqual(
|
233
|
+
self.assertEqual(evaluate(input_data), expected)
|
217
234
|
|
218
235
|
def test_can_override_built_in_words(self):
|
219
236
|
input_data = [
|
@@ -221,7 +238,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
|
|
221
238
|
"1 swap"
|
222
239
|
]
|
223
240
|
expected = [1, 1]
|
224
|
-
self.assertEqual(
|
241
|
+
self.assertEqual(evaluate(input_data), expected)
|
225
242
|
|
226
243
|
def test_can_override_built_in_operators(self):
|
227
244
|
input_data = [
|
@@ -229,7 +246,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
|
|
229
246
|
"3 4 +"
|
230
247
|
]
|
231
248
|
expected = [12]
|
232
|
-
self.assertEqual(
|
249
|
+
self.assertEqual(evaluate(input_data), expected)
|
233
250
|
|
234
251
|
def test_is_case_insensitive(self):
|
235
252
|
input_data = [
|
@@ -237,7 +254,7 @@ class ForthUserDefinedWordsTest(unittest.TestCase):
|
|
237
254
|
"1 FOO"
|
238
255
|
]
|
239
256
|
expected = [1, 1]
|
240
|
-
self.assertEqual(
|
257
|
+
self.assertEqual(evaluate(input_data), expected)
|
241
258
|
|
242
259
|
def test_cannot_redefine_numbers(self):
|
243
260
|
input_data = [": 1 2 ;"]
|