trackler 2.2.1.62 → 2.2.1.63
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/all-your-base/canonical-data.json +20 -29
- data/problem-specifications/exercises/forth/canonical-data.json +52 -5
- data/problem-specifications/exercises/isbn-verifier/canonical-data.json +15 -15
- data/problem-specifications/exercises/protein-translation/canonical-data.json +153 -0
- data/problem-specifications/exercises/reverse-string/canonical-data.json +39 -0
- data/problem-specifications/exercises/reverse-string/description.md +5 -0
- data/problem-specifications/exercises/reverse-string/metadata.yml +5 -0
- data/tracks/c/config.json +42 -41
- data/tracks/csharp/config.json +13 -0
- data/tracks/csharp/exercises/Exercises.sln +6 -0
- data/tracks/csharp/exercises/isbn-verifier/Example.cs +27 -0
- data/tracks/csharp/exercises/isbn-verifier/IsbnVerifier.cs +9 -0
- data/tracks/csharp/exercises/isbn-verifier/IsbnVerifier.csproj +19 -0
- data/tracks/csharp/exercises/isbn-verifier/IsbnVerifierTest.cs +84 -0
- data/tracks/csharp/exercises/isbn-verifier/README.md +40 -0
- data/tracks/csharp/generators/Exercises/IsbnVerifier.cs +15 -0
- data/tracks/delphi/config.json +28 -28
- data/tracks/erlang/config.json +10 -0
- data/tracks/erlang/exercises/accumulate/rebar.config +1 -1
- data/tracks/erlang/exercises/accumulate/test/accumulate_tests.erl +9 -7
- data/tracks/erlang/exercises/all-your-base/rebar.config +1 -1
- data/tracks/erlang/exercises/all-your-base/test/all_your_base_tests.erl +26 -24
- data/tracks/erlang/exercises/allergies/rebar.config +1 -1
- data/tracks/erlang/exercises/allergies/test/allergies_tests.erl +19 -17
- data/tracks/erlang/exercises/anagram/rebar.config +1 -3
- data/tracks/erlang/exercises/anagram/test/anagram_tests.erl +14 -12
- data/tracks/erlang/exercises/atbash-cipher/rebar.config +1 -1
- data/tracks/erlang/exercises/atbash-cipher/test/atbash_cipher_tests.erl +7 -5
- data/tracks/erlang/exercises/bank-account/rebar.config +1 -1
- data/tracks/erlang/exercises/bank-account/test/bank_account_tests.erl +52 -51
- data/tracks/erlang/exercises/beer-song/rebar.config +30 -0
- data/tracks/erlang/exercises/beer-song/test/beer_song_tests.erl +11 -10
- data/tracks/erlang/exercises/bob/rebar.config +1 -1
- data/tracks/erlang/exercises/bob/test/bob_tests.erl +33 -35
- data/tracks/erlang/exercises/circular-buffer/rebar.config +1 -1
- data/tracks/erlang/exercises/circular-buffer/test/circular_buffer_tests.erl +33 -32
- data/tracks/erlang/exercises/clock/rebar.config +1 -1
- data/tracks/erlang/exercises/clock/test/clock_tests.erl +57 -50
- data/tracks/erlang/exercises/collatz-conjecture/rebar.config +1 -1
- data/tracks/erlang/exercises/collatz-conjecture/test/collatz_conjecture_tests.erl +11 -9
- data/tracks/erlang/exercises/complex-numbers/rebar.config +1 -1
- data/tracks/erlang/exercises/complex-numbers/test/complex_numbers_tests.erl +102 -76
- data/tracks/erlang/exercises/custom-set/rebar.config +1 -1
- data/tracks/erlang/exercises/custom-set/test/custom_set_tests.erl +100 -109
- data/tracks/erlang/exercises/difference-of-squares/rebar.config +1 -1
- data/tracks/erlang/exercises/difference-of-squares/test/difference_of_squares_tests.erl +8 -7
- data/tracks/erlang/exercises/etl/rebar.config +1 -1
- data/tracks/erlang/exercises/etl/test/etl_tests.erl +6 -5
- data/tracks/erlang/exercises/gigasecond/rebar.config +1 -1
- data/tracks/erlang/exercises/gigasecond/test/gigasecond_tests.erl +9 -8
- data/tracks/erlang/exercises/grade-school/rebar.config +1 -1
- data/tracks/erlang/exercises/grade-school/test/grade_school_tests.erl +27 -23
- data/tracks/erlang/exercises/grains/rebar.config +1 -1
- data/tracks/erlang/exercises/grains/test/grains_tests.erl +7 -6
- data/tracks/erlang/exercises/hamming/rebar.config +1 -1
- data/tracks/erlang/exercises/hamming/test/hamming_tests.erl +20 -23
- data/tracks/erlang/exercises/hello-world/rebar.config +1 -1
- data/tracks/erlang/exercises/hello-world/test/hello_world_tests.erl +6 -4
- data/tracks/erlang/exercises/isogram/rebar.config +1 -1
- data/tracks/erlang/exercises/isogram/test/isogram_tests.erl +14 -12
- data/tracks/erlang/exercises/largest-series-product/rebar.config +1 -1
- data/tracks/erlang/exercises/largest-series-product/test/largest_series_product_tests.erl +22 -21
- data/tracks/erlang/exercises/leap/rebar.config +1 -1
- data/tracks/erlang/exercises/leap/test/leap_tests.erl +8 -7
- data/tracks/erlang/exercises/luhn/rebar.config +1 -1
- data/tracks/erlang/exercises/luhn/test/luhn_tests.erl +18 -16
- data/tracks/erlang/exercises/meetup/rebar.config +1 -1
- data/tracks/erlang/exercises/meetup/test/meetup_tests.erl +96 -95
- data/tracks/erlang/exercises/nucleotide-count/rebar.config +1 -1
- data/tracks/erlang/exercises/nucleotide-count/test/nucleotide_count_tests.erl +12 -11
- data/tracks/erlang/exercises/pangram/README.md +60 -0
- data/tracks/erlang/exercises/{accumulate → pangram}/include/exercism.hrl +0 -0
- data/tracks/erlang/exercises/{beer-song/rebar.conf → pangram/rebar.config} +0 -0
- data/tracks/erlang/exercises/pangram/src/example.erl +11 -0
- data/tracks/erlang/exercises/pangram/src/pangram.app.src +9 -0
- data/tracks/erlang/exercises/pangram/src/pangram.erl +8 -0
- data/tracks/erlang/exercises/pangram/test/pangram_tests.erl +38 -0
- data/tracks/erlang/exercises/parallel-letter-frequency/rebar.config +1 -1
- data/tracks/erlang/exercises/parallel-letter-frequency/test/parallel_letter_frequency_tests.erl +7 -6
- data/tracks/erlang/exercises/phone-number/rebar.config +1 -1
- data/tracks/erlang/exercises/phone-number/test/phone_number_tests.erl +13 -12
- data/tracks/erlang/exercises/rna-transcription/rebar.config +1 -1
- data/tracks/erlang/exercises/rna-transcription/test/rna_transcription_tests.erl +13 -11
- data/tracks/erlang/exercises/robot-simulator/rebar.config +1 -1
- data/tracks/erlang/exercises/robot-simulator/test/robot_simulator_tests.erl +70 -69
- data/tracks/erlang/exercises/roman-numerals/rebar.config +1 -1
- data/tracks/erlang/exercises/roman-numerals/test/roman_numerals_tests.erl +6 -5
- data/tracks/erlang/exercises/rotational-cipher/rebar.config +1 -8
- data/tracks/erlang/exercises/rotational-cipher/test/rotational_cipher_tests.erl +29 -27
- data/tracks/erlang/exercises/scrabble-score/rebar.config +1 -1
- data/tracks/erlang/exercises/scrabble-score/test/scrabble_score_tests.erl +6 -5
- data/tracks/erlang/exercises/series/rebar.config +1 -1
- data/tracks/erlang/exercises/series/test/series_tests.erl +6 -5
- data/tracks/erlang/exercises/sieve/rebar.config +1 -1
- data/tracks/erlang/exercises/sieve/test/sieve_tests.erl +10 -8
- data/tracks/erlang/exercises/space-age/rebar.config +1 -1
- data/tracks/erlang/exercises/space-age/test/space_age_tests.erl +20 -19
- data/tracks/erlang/exercises/spiral-matrix/rebar.config +1 -1
- data/tracks/erlang/exercises/spiral-matrix/test/spiral_matrix_tests.erl +12 -10
- data/tracks/erlang/exercises/strain/rebar.config +1 -1
- data/tracks/erlang/exercises/strain/test/strain_tests.erl +17 -16
- data/tracks/erlang/exercises/sum-of-multiples/rebar.config +1 -1
- data/tracks/erlang/exercises/sum-of-multiples/test/sum_of_multiples_tests.erl +16 -15
- data/tracks/erlang/exercises/triangle/rebar.config +1 -1
- data/tracks/erlang/exercises/triangle/test/triangle_tests.erl +20 -19
- data/tracks/erlang/exercises/two-fer/rebar.config +1 -1
- data/tracks/erlang/exercises/two-fer/test/two_fer_tests.erl +8 -7
- data/tracks/erlang/exercises/word-count/rebar.config +1 -1
- data/tracks/erlang/exercises/word-count/test/word_count_tests.erl +6 -5
- data/tracks/erlang/exercises/zipper/rebar.config +1 -1
- data/tracks/erlang/exercises/zipper/test/zipper_tests.erl +47 -46
- data/tracks/erlang/testgen/src/tgen.erl +8 -6
- data/tracks/erlang/testgen/src/tgen_bob.erl +1 -1
- data/tracks/erlang/testgen/src/tgen_collatz-conjecture.erl +2 -2
- data/tracks/erlang/testgen/src/tgen_complex-numbers.erl +11 -11
- data/tracks/erlang/testgen/src/tgen_custom-set.erl +14 -14
- data/tracks/erlang/testgen/src/tgen_hamming.erl +2 -2
- data/tracks/erlang/testgen/src/tgen_hello-world.erl +1 -1
- data/tracks/erlang/testgen/src/tgen_leap.erl +1 -1
- data/tracks/erlang/testgen/src/tgen_rna-transcription.erl +2 -2
- data/tracks/erlang/testgen/src/tgs.erl +6 -0
- data/tracks/fsharp/exercises/beer-song/BeerSong.fs +1 -5
- data/tracks/fsharp/exercises/beer-song/BeerSongTest.fs +342 -20
- data/tracks/fsharp/exercises/beer-song/Example.fs +16 -10
- data/tracks/fsharp/exercises/food-chain/Example.fs +1 -1
- data/tracks/fsharp/exercises/food-chain/FoodChain.fs +1 -3
- data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +11 -11
- data/tracks/fsharp/exercises/house/Example.fs +1 -1
- data/tracks/fsharp/exercises/house/House.fs +1 -3
- data/tracks/fsharp/exercises/house/HouseTest.fs +202 -202
- data/tracks/fsharp/exercises/proverb/Example.fs +9 -9
- data/tracks/fsharp/exercises/proverb/Proverb.fs +1 -3
- data/tracks/fsharp/exercises/proverb/ProverbTest.fs +50 -21
- data/tracks/fsharp/exercises/twelve-days/Example.fs +4 -4
- data/tracks/fsharp/exercises/twelve-days/TwelveDays.fs +2 -6
- data/tracks/fsharp/exercises/twelve-days/TwelveDaysTest.fs +81 -57
- data/tracks/fsharp/generators/Generators.fs +39 -15
- data/tracks/go/bin/run-generators +5 -1
- data/tracks/go/config.json +14 -2
- data/tracks/go/exercises/accumulate/example.go +2 -1
- data/tracks/go/exercises/zebra-puzzle/.meta/hints.md +24 -0
- data/tracks/go/exercises/zebra-puzzle/README.md +76 -0
- data/tracks/go/exercises/zebra-puzzle/example.go +256 -0
- data/tracks/go/exercises/zebra-puzzle/zebra_puzzle_test.go +18 -0
- data/tracks/haskell/exercises/forth/package.yaml +1 -1
- data/tracks/haskell/exercises/forth/test/Tests.hs +1 -4
- data/tracks/haskell/exercises/pascals-triangle/package.yaml +1 -1
- data/tracks/haskell/exercises/pascals-triangle/test/Tests.hs +22 -1
- data/tracks/java/POLICIES.md +3 -3
- data/tracks/java/config.json +21 -2
- data/tracks/java/exercises/atbash-cipher/.meta/src/reference/java/Atbash.java +12 -12
- data/tracks/java/exercises/protein-translation/.meta/src/reference/java/ProteinTranslator.java +47 -0
- data/tracks/java/exercises/protein-translation/.meta/version +1 -0
- data/tracks/java/exercises/protein-translation/README.md +58 -0
- data/tracks/java/exercises/protein-translation/build.gradle +18 -0
- data/tracks/java/exercises/protein-translation/src/main/java/ProteinTranslator.java +8 -0
- data/tracks/java/exercises/protein-translation/src/test/java/ProteinTranslatorTest.java +179 -0
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/javascript/.eslintignore +2 -2
- data/tracks/javascript/exercises/accumulate/example.js +1 -2
- data/tracks/javascript/exercises/grains/example.js +6 -3
- data/tracks/kotlin/exercises/beer-song/.meta/src/reference/kotlin/BeerSong.kt +3 -3
- data/tracks/kotlin/exercises/beer-song/.meta/version +1 -1
- data/tracks/kotlin/exercises/beer-song/README.md +1 -1
- data/tracks/kotlin/exercises/beer-song/src/test/kotlin/BeerSongTest.kt +6 -6
- data/tracks/kotlin/exercises/forth/.meta/version +1 -1
- data/tracks/kotlin/exercises/forth/src/test/kotlin/ForthEvaluatorTest.kt +0 -7
- data/tracks/kotlin/exercises/meetup/README.md +16 -12
- data/tracks/kotlin/exercises/nth-prime/.meta/src/reference/kotlin/Prime.kt +7 -2
- data/tracks/kotlin/exercises/nth-prime/.meta/version +1 -1
- data/tracks/kotlin/exercises/nth-prime/src/test/kotlin/PrimeTest.kt +10 -1
- data/tracks/kotlin/exercises/nucleotide-count/README.md +2 -2
- data/tracks/kotlin/exercises/pascals-triangle/.meta/src/reference/kotlin/PascalsTriangle.kt +1 -1
- data/tracks/kotlin/exercises/pascals-triangle/.meta/version +1 -1
- data/tracks/kotlin/exercises/pascals-triangle/src/test/kotlin/PascalsTriangleTest.kt +58 -1
- data/tracks/kotlin/exercises/sum-of-multiples/README.md +3 -3
- data/tracks/ocaml/exercises/forth/test.ml +1 -3
- data/tracks/ocaml/exercises/rectangles/example.ml +11 -11
- data/tracks/php/exercises/bob/example.php +2 -2
- data/tracks/purescript/config.json +3 -3
- data/tracks/python/config.json +34 -22
- data/tracks/python/exercises/alphametics/example.py +90 -34
- data/tracks/python/exercises/ocr-numbers/example.py +18 -21
- data/tracks/python/exercises/ocr-numbers/ocr_numbers.py +1 -5
- data/tracks/python/exercises/ocr-numbers/ocr_numbers_test.py +124 -106
- data/tracks/python/exercises/simple-linked-list/README.md +49 -0
- data/tracks/python/exercises/simple-linked-list/example.py +67 -0
- data/tracks/python/exercises/simple-linked-list/hints.md +10 -0
- data/tracks/python/exercises/simple-linked-list/simple_linked_list.py +33 -0
- data/tracks/python/exercises/simple-linked-list/simple_linked_list_test.py +112 -0
- data/tracks/rust/README.md +2 -0
- data/tracks/rust/bin/init_exercise.py +586 -0
- data/tracks/rust/config.json +20 -10
- data/tracks/rust/exercises/book-store/.gitignore +3 -0
- data/tracks/rust/exercises/book-store/Cargo-example.toml +7 -0
- data/tracks/rust/exercises/book-store/Cargo.toml +6 -0
- data/tracks/rust/exercises/book-store/README.md +107 -0
- data/tracks/rust/exercises/book-store/example.rs +187 -0
- data/tracks/rust/exercises/book-store/src/lib.rs +3 -0
- data/tracks/rust/exercises/book-store/tests/book-store.rs +130 -0
- data/tracks/sml/config.json +8 -8
- data/tracks/typescript/config.json +6 -6
- metadata +43 -46
- data/tracks/erlang/exercises/all-your-base/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/allergies/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/anagram/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/atbash-cipher/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/bank-account/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/beer-song/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/bob/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/circular-buffer/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/clock/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/collatz-conjecture/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/complex-numbers/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/custom-set/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/difference-of-squares/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/etl/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/gigasecond/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/grade-school/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/grains/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/hamming/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/hello-world/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/isogram/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/largest-series-product/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/leap/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/luhn/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/meetup/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/nucleotide-count/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/parallel-letter-frequency/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/phone-number/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/rna-transcription/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/robot-simulator/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/roman-numerals/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/rotational-cipher/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/scrabble-score/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/series/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/sieve/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/space-age/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/spiral-matrix/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/strain/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/sum-of-multiples/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/triangle/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/two-fer/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/word-count/include/exercism.hrl +0 -11
- data/tracks/erlang/exercises/zipper/include/exercism.hrl +0 -11
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
class Node(object):
|
|
2
|
+
def __init__(self, value):
|
|
3
|
+
self._value = value
|
|
4
|
+
self._next = None
|
|
5
|
+
|
|
6
|
+
def value(self):
|
|
7
|
+
return self._value
|
|
8
|
+
|
|
9
|
+
def next(self):
|
|
10
|
+
return self._next
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class LinkedIterator(object):
|
|
14
|
+
def __init__(self, linked_list):
|
|
15
|
+
self.current = linked_list._head
|
|
16
|
+
|
|
17
|
+
def __iter__(self):
|
|
18
|
+
return self
|
|
19
|
+
|
|
20
|
+
def __next__(self):
|
|
21
|
+
if self.current is None:
|
|
22
|
+
raise StopIteration
|
|
23
|
+
value = self.current.value()
|
|
24
|
+
self.current = self.current.next()
|
|
25
|
+
return value
|
|
26
|
+
|
|
27
|
+
def next(self):
|
|
28
|
+
return self.__next__()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class LinkedList(object):
|
|
32
|
+
def __init__(self, values=[]):
|
|
33
|
+
self._head = None
|
|
34
|
+
self._len = 0
|
|
35
|
+
[self.push(v) for v in values]
|
|
36
|
+
|
|
37
|
+
def __iter__(self):
|
|
38
|
+
return LinkedIterator(self)
|
|
39
|
+
|
|
40
|
+
def __len__(self):
|
|
41
|
+
return self._len
|
|
42
|
+
|
|
43
|
+
def head(self):
|
|
44
|
+
if self._head is None:
|
|
45
|
+
raise EmptyListException()
|
|
46
|
+
return self._head
|
|
47
|
+
|
|
48
|
+
def push(self, value):
|
|
49
|
+
newNode = Node(value)
|
|
50
|
+
newNode._next = self._head
|
|
51
|
+
self._head = newNode
|
|
52
|
+
self._len += 1
|
|
53
|
+
|
|
54
|
+
def pop(self):
|
|
55
|
+
if self._head is None:
|
|
56
|
+
raise EmptyListException()
|
|
57
|
+
self._len -= 1
|
|
58
|
+
ret = self._head.value()
|
|
59
|
+
self._head = self._head.next()
|
|
60
|
+
return ret
|
|
61
|
+
|
|
62
|
+
def reversed(self):
|
|
63
|
+
return LinkedList(self)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class EmptyListException(Exception):
|
|
67
|
+
pass
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
## Hints
|
|
2
|
+
|
|
3
|
+
To support `list()`, see [implementing an iterator for a class.](https://docs.python.org/3/tutorial/classes.html#iterators)
|
|
4
|
+
|
|
5
|
+
Additionally, note that Python2's `next()` has been replaced by `__next__()` in Python3. For dual compatibility, `next()` can be implemented as:
|
|
6
|
+
|
|
7
|
+
```Python
|
|
8
|
+
def next(self):
|
|
9
|
+
return self.__next__()
|
|
10
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
class Node(object):
|
|
2
|
+
def __init__(self, value):
|
|
3
|
+
pass
|
|
4
|
+
|
|
5
|
+
def value(self):
|
|
6
|
+
pass
|
|
7
|
+
|
|
8
|
+
def next(self):
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class LinkedList(object):
|
|
13
|
+
def __init__(self, values=[]):
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
def __len__(self):
|
|
17
|
+
pass
|
|
18
|
+
|
|
19
|
+
def head(self):
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
def push(self, value):
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
def pop(self):
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
def reversed(self):
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class EmptyListException(Exception):
|
|
33
|
+
pass
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
from simple_linked_list import LinkedList, EmptyListException
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# No canonical data available for this exercise
|
|
7
|
+
|
|
8
|
+
class LinkedListTest(unittest.TestCase):
|
|
9
|
+
def test_empty_list_has_len_zero(self):
|
|
10
|
+
sut = LinkedList()
|
|
11
|
+
self.assertEqual(len(sut), 0)
|
|
12
|
+
|
|
13
|
+
def test_singleton_list_has_len_one(self):
|
|
14
|
+
sut = LinkedList([1])
|
|
15
|
+
self.assertEqual(len(sut), 1)
|
|
16
|
+
|
|
17
|
+
def test_non_empty_list_has_correct_len(self):
|
|
18
|
+
sut = LinkedList([1, 2, 3])
|
|
19
|
+
self.assertEqual(len(sut), 3)
|
|
20
|
+
|
|
21
|
+
def test_error_on_empty_list_head(self):
|
|
22
|
+
sut = LinkedList()
|
|
23
|
+
with self.assertRaises(EmptyListException):
|
|
24
|
+
sut.head()
|
|
25
|
+
|
|
26
|
+
def test_singleton_list_has_head(self):
|
|
27
|
+
sut = LinkedList([1])
|
|
28
|
+
self.assertEqual(sut.head().value(), 1)
|
|
29
|
+
|
|
30
|
+
def test_non_empty_list_has_correct_head(self):
|
|
31
|
+
sut = LinkedList([1, 2])
|
|
32
|
+
self.assertEqual(sut.head().value(), 2)
|
|
33
|
+
|
|
34
|
+
def test_can_push_to_non_empty_list(self):
|
|
35
|
+
sut = LinkedList([1, 2, 3])
|
|
36
|
+
sut.push(4)
|
|
37
|
+
self.assertEqual(len(sut), 4)
|
|
38
|
+
|
|
39
|
+
def test_pushing_to_empty_list_changes_head(self):
|
|
40
|
+
sut = LinkedList()
|
|
41
|
+
sut.push(5)
|
|
42
|
+
self.assertEqual(len(sut), 1)
|
|
43
|
+
self.assertEqual(sut.head().value(), 5)
|
|
44
|
+
|
|
45
|
+
def test_can_from_non_empty_list(self):
|
|
46
|
+
sut = LinkedList([3, 4, 5])
|
|
47
|
+
self.assertEqual(sut.pop(), 5)
|
|
48
|
+
self.assertEqual(len(sut), 2)
|
|
49
|
+
self.assertEqual(sut.head().value(), 4)
|
|
50
|
+
|
|
51
|
+
def test_pop_from_singleton_list_removes_head(self):
|
|
52
|
+
sut = LinkedList([1])
|
|
53
|
+
self.assertEqual(sut.pop(), 1)
|
|
54
|
+
with self.assertRaises(EmptyListException):
|
|
55
|
+
sut.head()
|
|
56
|
+
|
|
57
|
+
def test_error_on_empty_list_pop(self):
|
|
58
|
+
sut = LinkedList()
|
|
59
|
+
with self.assertRaises(EmptyListException):
|
|
60
|
+
sut.pop()
|
|
61
|
+
|
|
62
|
+
def test_push_and_pop(self):
|
|
63
|
+
sut = LinkedList([1, 2])
|
|
64
|
+
sut.push(3)
|
|
65
|
+
self.assertEqual(len(sut), 3)
|
|
66
|
+
self.assertEqual(sut.pop(), 3)
|
|
67
|
+
self.assertEqual(sut.pop(), 2)
|
|
68
|
+
self.assertEqual(sut.pop(), 1)
|
|
69
|
+
self.assertEqual(len(sut), 0)
|
|
70
|
+
sut.push(4)
|
|
71
|
+
self.assertEqual(len(sut), 1)
|
|
72
|
+
self.assertEqual(sut.head().value(), 4)
|
|
73
|
+
|
|
74
|
+
def test_singleton_list_head_has_no_next(self):
|
|
75
|
+
sut = LinkedList([1])
|
|
76
|
+
self.assertIsNone(sut.head().next())
|
|
77
|
+
|
|
78
|
+
def test_non_empty_list_traverse(self):
|
|
79
|
+
sut = LinkedList(range(10))
|
|
80
|
+
current = sut.head()
|
|
81
|
+
for i in range(10):
|
|
82
|
+
self.assertEqual(current.value(), 9 - i)
|
|
83
|
+
current = current.next()
|
|
84
|
+
self.assertIsNone(current)
|
|
85
|
+
|
|
86
|
+
def test_empty_linked_list_to_list_is_empty(self):
|
|
87
|
+
sut = LinkedList()
|
|
88
|
+
self.assertEqual(list(sut), [])
|
|
89
|
+
|
|
90
|
+
def test_singleton_linked_list_to_list_list_with_singular_element(self):
|
|
91
|
+
sut = LinkedList([1])
|
|
92
|
+
self.assertEqual(list(sut), [1])
|
|
93
|
+
|
|
94
|
+
def test_non_empty_linked_list_to_list_is_list_with_all_elements(self):
|
|
95
|
+
sut = LinkedList([1, 2, 3])
|
|
96
|
+
self.assertEqual(list(sut), [3, 2, 1])
|
|
97
|
+
|
|
98
|
+
def test_reversed_empty_list_is_empty_list(self):
|
|
99
|
+
sut = LinkedList([])
|
|
100
|
+
self.assertEqual(list(sut.reversed()), [])
|
|
101
|
+
|
|
102
|
+
def test_reversed_singleton_list_is_same_list(self):
|
|
103
|
+
sut = LinkedList([1])
|
|
104
|
+
self.assertEqual(list(sut.reversed()), [1])
|
|
105
|
+
|
|
106
|
+
def test_reverse_non_empty_list(self):
|
|
107
|
+
sut = LinkedList([1, 2, 3])
|
|
108
|
+
self.assertEqual(list(sut.reversed()), [1, 2, 3])
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
if __name__ == '__main__':
|
|
112
|
+
unittest.main()
|
data/tracks/rust/README.md
CHANGED
|
@@ -66,6 +66,8 @@ Please see the documentation about [adding new exercises](https://github.com/exe
|
|
|
66
66
|
|
|
67
67
|
Note that:
|
|
68
68
|
|
|
69
|
+
- The simplest way to generate a project template is to run `bin/init_exercise.py`. You'll need a Python installation >= 3.5 in order to run this script, but it will automate most of the following points for you.
|
|
70
|
+
|
|
69
71
|
- Each exercise must stand on its own. Do not reference files outside the exercise directory. They will not be included when the user fetches the exercise.
|
|
70
72
|
|
|
71
73
|
- Exercises must conform to the Exercism-wide standards described in [the documentation](https://github.com/exercism/docs/tree/master/language-tracks/exercises).
|