trackler 2.2.1.109 → 2.2.1.110
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/tracks/c/config.json +2 -0
- data/tracks/clojure/exercises/armstrong-numbers/test/armstrong_numbers_test.clj +1 -1
- data/tracks/elixir/.formatter.exs +3 -0
- data/tracks/elixir/exercises/accumulate/accumulate_test.exs +8 -8
- data/tracks/elixir/exercises/acronym/acronym_test.exs +2 -2
- data/tracks/elixir/exercises/acronym/example.exs +3 -4
- data/tracks/elixir/exercises/all-your-base/all-your-base-test.exs +2 -2
- data/tracks/elixir/exercises/all-your-base/example.exs +14 -7
- data/tracks/elixir/exercises/allergies/allergies.exs +2 -4
- data/tracks/elixir/exercises/allergies/allergies_test.exs +17 -11
- data/tracks/elixir/exercises/anagram/anagram.exs +1 -2
- data/tracks/elixir/exercises/anagram/anagram_test.exs +13 -13
- data/tracks/elixir/exercises/anagram/example.exs +2 -1
- data/tracks/elixir/exercises/atbash-cipher/atbash_cipher.exs +2 -2
- data/tracks/elixir/exercises/atbash-cipher/atbash_cipher_test.exs +2 -2
- data/tracks/elixir/exercises/bank-account/bank_account_test.exs +10 -5
- data/tracks/elixir/exercises/beer-song/beer_song.exs +2 -2
- data/tracks/elixir/exercises/beer-song/beer_song_test.exs +225 -225
- data/tracks/elixir/exercises/beer-song/example.exs +5 -3
- data/tracks/elixir/exercises/binary-search-tree/binary_search_tree_test.exs +2 -2
- data/tracks/elixir/exercises/binary-search-tree/example.exs +1 -1
- data/tracks/elixir/exercises/binary-search/binary_search.exs +0 -1
- data/tracks/elixir/exercises/binary-search/binary_search_test.exs +2 -2
- data/tracks/elixir/exercises/binary-search/example.exs +3 -1
- data/tracks/elixir/exercises/binary/binary.exs +1 -1
- data/tracks/elixir/exercises/binary/binary_test.exs +2 -2
- data/tracks/elixir/exercises/binary/example.exs +2 -2
- data/tracks/elixir/exercises/bob/bob.exs +1 -2
- data/tracks/elixir/exercises/bob/bob_test.exs +2 -2
- data/tracks/elixir/exercises/bowling/bowling.exs +2 -3
- data/tracks/elixir/exercises/bowling/bowling_test.exs +54 -275
- data/tracks/elixir/exercises/bowling/example.exs +24 -10
- data/tracks/elixir/exercises/bracket-push/bracket_push.exs +1 -2
- data/tracks/elixir/exercises/bracket-push/bracket_push_test.exs +5 -3
- data/tracks/elixir/exercises/bracket-push/example.exs +8 -3
- data/tracks/elixir/exercises/change/change.exs +1 -2
- data/tracks/elixir/exercises/change/change_test.exs +2 -2
- data/tracks/elixir/exercises/change/example.exs +5 -1
- data/tracks/elixir/exercises/clock/clock_test.exs +8 -8
- data/tracks/elixir/exercises/clock/example.exs +5 -3
- data/tracks/elixir/exercises/collatz-conjecture/collatz_conjecture.exs +0 -1
- data/tracks/elixir/exercises/collatz-conjecture/collatz_conjecture_test.exs +3 -3
- data/tracks/elixir/exercises/collatz-conjecture/example.exs +1 -1
- data/tracks/elixir/exercises/connect/connect.exs +1 -2
- data/tracks/elixir/exercises/connect/connect_test.exs +40 -30
- data/tracks/elixir/exercises/connect/example.exs +12 -10
- data/tracks/elixir/exercises/crypto-square/crypto_square.exs +1 -2
- data/tracks/elixir/exercises/crypto-square/crypto_square_test.exs +2 -2
- data/tracks/elixir/exercises/crypto-square/example.exs +6 -5
- data/tracks/elixir/exercises/custom-set/custom_set.exs +1 -1
- data/tracks/elixir/exercises/custom-set/custom_set_test.exs +2 -2
- data/tracks/elixir/exercises/custom-set/example.exs +5 -4
- data/tracks/elixir/exercises/diamond/diamond.exs +1 -2
- data/tracks/elixir/exercises/diamond/diamond_test.exs +20 -18
- data/tracks/elixir/exercises/diamond/example.exs +10 -10
- data/tracks/elixir/exercises/difference-of-squares/difference_of_squares.exs +1 -5
- data/tracks/elixir/exercises/difference-of-squares/difference_of_squares_test.exs +5 -6
- data/tracks/elixir/exercises/difference-of-squares/example.exs +3 -4
- data/tracks/elixir/exercises/diffie-hellman/diffie_hellman.exs +7 -3
- data/tracks/elixir/exercises/diffie-hellman/diffie_hellman_test.exs +43 -23
- data/tracks/elixir/exercises/diffie-hellman/example.exs +10 -6
- data/tracks/elixir/exercises/dominoes/dominoes.exs +0 -1
- data/tracks/elixir/exercises/dominoes/dominoes_test.exs +16 -6
- data/tracks/elixir/exercises/dominoes/example.exs +9 -5
- data/tracks/elixir/exercises/dot-dsl/dot.exs +0 -1
- data/tracks/elixir/exercises/dot-dsl/dot_dsl_test.exs +107 -58
- data/tracks/elixir/exercises/dot-dsl/example.exs +18 -10
- data/tracks/elixir/exercises/etl/etl.exs +0 -1
- data/tracks/elixir/exercises/etl/etl_test.exs +34 -13
- data/tracks/elixir/exercises/etl/example.exs +6 -6
- data/tracks/elixir/exercises/flatten-array/flatten_array.exs +0 -1
- data/tracks/elixir/exercises/flatten-array/flatten_array_test.exs +8 -8
- data/tracks/elixir/exercises/forth/example.exs +5 -5
- data/tracks/elixir/exercises/forth/forth.exs +6 -9
- data/tracks/elixir/exercises/forth/forth_test.exs +107 -64
- data/tracks/elixir/exercises/gigasecond/example.exs +1 -1
- data/tracks/elixir/exercises/gigasecond/gigasecond.exs +2 -2
- data/tracks/elixir/exercises/gigasecond/gigasecond_test.exs +2 -2
- data/tracks/elixir/exercises/grade-school/example.exs +3 -3
- data/tracks/elixir/exercises/grade-school/grade_school_test.exs +26 -22
- data/tracks/elixir/exercises/grade-school/school.exs +3 -6
- data/tracks/elixir/exercises/grains/example.exs +10 -3
- data/tracks/elixir/exercises/grains/grains.exs +0 -2
- data/tracks/elixir/exercises/grains/grains_test.exs +16 -14
- data/tracks/elixir/exercises/grep/example.exs +22 -18
- data/tracks/elixir/exercises/grep/grep.exs +1 -2
- data/tracks/elixir/exercises/grep/grep_test.exs +108 -112
- data/tracks/elixir/exercises/hamming/example.exs +3 -2
- data/tracks/elixir/exercises/hamming/hamming_test.exs +7 -4
- data/tracks/elixir/exercises/hello-world/example.exs +1 -1
- data/tracks/elixir/exercises/hello-world/hello_world.exs +1 -1
- data/tracks/elixir/exercises/hello-world/hello_world_test.exs +2 -2
- data/tracks/elixir/exercises/hexadecimal/example.exs +8 -7
- data/tracks/elixir/exercises/hexadecimal/hexadecimal.exs +0 -1
- data/tracks/elixir/exercises/hexadecimal/hexadecimal_test.exs +3 -3
- data/tracks/elixir/exercises/isbn-verifier/example.exs +1 -1
- data/tracks/elixir/exercises/isbn-verifier/isbn_verifier.exs +1 -2
- data/tracks/elixir/exercises/isbn-verifier/isbn_verifier_test.exs +2 -2
- data/tracks/elixir/exercises/isogram/example.exs +5 -5
- data/tracks/elixir/exercises/isogram/isogram.exs +1 -3
- data/tracks/elixir/exercises/isogram/isogram_test.exs +2 -3
- data/tracks/elixir/exercises/kindergarten-garden/example.exs +15 -3
- data/tracks/elixir/exercises/kindergarten-garden/garden_test.exs +17 -4
- data/tracks/elixir/exercises/largest-series-product/example.exs +10 -9
- data/tracks/elixir/exercises/largest-series-product/largest_series_product.exs +1 -3
- data/tracks/elixir/exercises/largest-series-product/largest_series_product_test.exs +6 -4
- data/tracks/elixir/exercises/leap/example.exs +2 -2
- data/tracks/elixir/exercises/leap/leap.exs +0 -1
- data/tracks/elixir/exercises/leap/leap_test.exs +2 -2
- data/tracks/elixir/exercises/list-ops/example.exs +10 -9
- data/tracks/elixir/exercises/list-ops/list_ops.exs +1 -8
- data/tracks/elixir/exercises/list-ops/list_ops_test.exs +22 -25
- data/tracks/elixir/exercises/luhn/example.exs +16 -17
- data/tracks/elixir/exercises/luhn/luhn.exs +0 -2
- data/tracks/elixir/exercises/luhn/luhn_test.exs +2 -2
- data/tracks/elixir/exercises/markdown/example.exs +40 -14
- data/tracks/elixir/exercises/markdown/markdown.exs +8 -4
- data/tracks/elixir/exercises/markdown/markdown_test.exs +6 -3
- data/tracks/elixir/exercises/matrix/example.exs +6 -6
- data/tracks/elixir/exercises/matrix/matrix.exs +0 -1
- data/tracks/elixir/exercises/matrix/matrix_test.exs +11 -11
- data/tracks/elixir/exercises/meetup/example.exs +20 -13
- data/tracks/elixir/exercises/meetup/meetup.exs +8 -4
- data/tracks/elixir/exercises/meetup/meetup_test.exs +2 -2
- data/tracks/elixir/exercises/minesweeper/minesweeper.exs +1 -3
- data/tracks/elixir/exercises/minesweeper/minesweeper_test.exs +7 -21
- data/tracks/elixir/exercises/nth-prime/example.exs +7 -7
- data/tracks/elixir/exercises/nth-prime/nth_prime.exs +0 -1
- data/tracks/elixir/exercises/nth-prime/nth_prime_test.exs +3 -3
- data/tracks/elixir/exercises/nucleotide-count/example.exs +4 -3
- data/tracks/elixir/exercises/nucleotide-count/nucleotide_count.exs +0 -3
- data/tracks/elixir/exercises/nucleotide-count/nucleotide_count_test.exs +2 -2
- data/tracks/elixir/exercises/ocr-numbers/example.exs +3 -3
- data/tracks/elixir/exercises/ocr-numbers/ocr_numbers.exs +1 -2
- data/tracks/elixir/exercises/ocr-numbers/ocr_numbers_test.exs +54 -70
- data/tracks/elixir/exercises/palindrome-products/example.exs +3 -6
- data/tracks/elixir/exercises/palindrome-products/palindrome_products.exs +0 -1
- data/tracks/elixir/exercises/palindrome-products/palindrome_products_test.exs +8 -8
- data/tracks/elixir/exercises/pangram/pangram.exs +1 -1
- data/tracks/elixir/exercises/pangram/pangram_test.exs +5 -3
- data/tracks/elixir/exercises/parallel-letter-frequency/example.exs +7 -5
- data/tracks/elixir/exercises/parallel-letter-frequency/frequency.exs +1 -2
- data/tracks/elixir/exercises/parallel-letter-frequency/parallel_letter_frequency_test.exs +3 -4
- data/tracks/elixir/exercises/pascals-triangle/example.exs +2 -1
- data/tracks/elixir/exercises/pascals-triangle/pascals_triangle_test.exs +26 -8
- data/tracks/elixir/exercises/perfect-numbers/example.exs +8 -6
- data/tracks/elixir/exercises/perfect-numbers/perfect_numbers.exs +1 -2
- data/tracks/elixir/exercises/perfect-numbers/perfect_numbers_test.exs +18 -17
- data/tracks/elixir/exercises/phone-number/example.exs +19 -11
- data/tracks/elixir/exercises/phone-number/phone_number.exs +3 -3
- data/tracks/elixir/exercises/phone-number/phone_number_test.exs +2 -2
- data/tracks/elixir/exercises/pig-latin/pig_latin.exs +0 -1
- data/tracks/elixir/exercises/pig-latin/pig_latin_test.exs +3 -3
- data/tracks/elixir/exercises/poker/example.exs +104 -41
- data/tracks/elixir/exercises/poker/poker.exs +0 -1
- data/tracks/elixir/exercises/poker/poker_test.exs +7 -5
- data/tracks/elixir/exercises/prime-factors/example.exs +4 -8
- data/tracks/elixir/exercises/prime-factors/prime_factors.exs +0 -1
- data/tracks/elixir/exercises/prime-factors/prime_factors_test.exs +5 -5
- data/tracks/elixir/exercises/protein-translation/example.exs +14 -12
- data/tracks/elixir/exercises/protein-translation/protein_translation.exs +2 -3
- data/tracks/elixir/exercises/protein-translation/protein_translation_test.exs +26 -26
- data/tracks/elixir/exercises/pythagorean-triplet/example.exs +5 -4
- data/tracks/elixir/exercises/pythagorean-triplet/pythagorean_triplet.exs +0 -5
- data/tracks/elixir/exercises/pythagorean-triplet/pythagorean_triplet_test.exs +3 -3
- data/tracks/elixir/exercises/queen-attack/example.exs +9 -7
- data/tracks/elixir/exercises/queen-attack/queen_attack.exs +1 -4
- data/tracks/elixir/exercises/rail-fence-cipher/example.exs +18 -15
- data/tracks/elixir/exercises/rail-fence-cipher/rail_fence_cipher.exs +2 -4
- data/tracks/elixir/exercises/rail-fence-cipher/rail_fence_cipher_test.exs +2 -2
- data/tracks/elixir/exercises/raindrops/example.exs +3 -2
- data/tracks/elixir/exercises/raindrops/raindrops.exs +1 -2
- data/tracks/elixir/exercises/raindrops/raindrops_test.exs +2 -2
- data/tracks/elixir/exercises/rna-transcription/example.exs +1 -1
- data/tracks/elixir/exercises/rna-transcription/rna_transcription.exs +0 -1
- data/tracks/elixir/exercises/rna-transcription/rna_transcription_test.exs +2 -2
- data/tracks/elixir/exercises/robot-simulator/example.exs +33 -19
- data/tracks/elixir/exercises/robot-simulator/robot_simulator.exs +3 -5
- data/tracks/elixir/exercises/robot-simulator/robot_simulator_test.exs +26 -25
- data/tracks/elixir/exercises/roman-numerals/example.exs +14 -13
- data/tracks/elixir/exercises/roman-numerals/roman.exs +1 -1
- data/tracks/elixir/exercises/roman-numerals/roman_numerals_test.exs +2 -2
- data/tracks/elixir/exercises/rotational-cipher/example.exs +12 -8
- data/tracks/elixir/exercises/rotational-cipher/rotational_cipher.exs +0 -1
- data/tracks/elixir/exercises/rotational-cipher/rotational_cipher_test.exs +6 -4
- data/tracks/elixir/exercises/run-length-encoding/example.exs +20 -8
- data/tracks/elixir/exercises/run-length-encoding/rle.exs +2 -4
- data/tracks/elixir/exercises/run-length-encoding/rle_test.exs +6 -4
- data/tracks/elixir/exercises/saddle-points/example.exs +4 -3
- data/tracks/elixir/exercises/saddle-points/saddle_points.exs +0 -3
- data/tracks/elixir/exercises/saddle-points/saddle_points_test.exs +2 -2
- data/tracks/elixir/exercises/say/say.exs +1 -1
- data/tracks/elixir/exercises/say/say_test.exs +5 -3
- data/tracks/elixir/exercises/scale-generator/example.exs +20 -9
- data/tracks/elixir/exercises/scale-generator/scale_generator.exs +2 -2
- data/tracks/elixir/exercises/scale-generator/scale_generator_test.exs +16 -17
- data/tracks/elixir/exercises/scrabble-score/scrabble.exs +1 -2
- data/tracks/elixir/exercises/scrabble-score/scrabble_score_test.exs +2 -2
- data/tracks/elixir/exercises/secret-handshake/example.exs +4 -4
- data/tracks/elixir/exercises/secret-handshake/secret_handshake.exs +0 -1
- data/tracks/elixir/exercises/secret-handshake/secret_handshake_test.exs +3 -3
- data/tracks/elixir/exercises/series/example.exs +2 -2
- data/tracks/elixir/exercises/series/series.exs +0 -1
- data/tracks/elixir/exercises/series/series_test.exs +3 -4
- data/tracks/elixir/exercises/sieve/example.exs +4 -5
- data/tracks/elixir/exercises/sieve/sieve.exs +0 -3
- data/tracks/elixir/exercises/sieve/sieve_test.exs +173 -21
- data/tracks/elixir/exercises/simple-cipher/example.exs +8 -8
- data/tracks/elixir/exercises/simple-cipher/simple_cipher.exs +0 -1
- data/tracks/elixir/exercises/simple-cipher/simple_cipher_test.exs +3 -4
- data/tracks/elixir/exercises/simple-linked-list/example.exs +3 -1
- data/tracks/elixir/exercises/simple-linked-list/linked_list_test.exs +5 -2
- data/tracks/elixir/exercises/space-age/example.exs +5 -6
- data/tracks/elixir/exercises/space-age/space_age.exs +9 -3
- data/tracks/elixir/exercises/space-age/space_age_test.exs +2 -2
- data/tracks/elixir/exercises/spiral-matrix/example.exs +10 -5
- data/tracks/elixir/exercises/spiral-matrix/spiral.exs +0 -1
- data/tracks/elixir/exercises/spiral-matrix/spiral_test.exs +21 -21
- data/tracks/elixir/exercises/strain/example.exs +5 -4
- data/tracks/elixir/exercises/strain/strain.exs +2 -2
- data/tracks/elixir/exercises/strain/strain_test.exs +12 -7
- data/tracks/elixir/exercises/sublist/example.exs +11 -7
- data/tracks/elixir/exercises/sublist/sublist.exs +0 -1
- data/tracks/elixir/exercises/sublist/sublist_test.exs +16 -18
- data/tracks/elixir/exercises/sum-of-multiples/example.exs +3 -4
- data/tracks/elixir/exercises/sum-of-multiples/sum_of_multiples.exs +0 -1
- data/tracks/elixir/exercises/sum-of-multiples/sum_of_multiples_test.exs +4 -4
- data/tracks/elixir/exercises/test_helper.exs +4 -4
- data/tracks/elixir/exercises/tournament/example.exs +20 -13
- data/tracks/elixir/exercises/tournament/tournament.exs +0 -1
- data/tracks/elixir/exercises/tournament/tournament_test.exs +37 -30
- data/tracks/elixir/exercises/transpose/example.exs +4 -4
- data/tracks/elixir/exercises/transpose/transpose.exs +1 -1
- data/tracks/elixir/exercises/transpose/transpose_test.exs +89 -156
- data/tracks/elixir/exercises/triangle/example.exs +7 -7
- data/tracks/elixir/exercises/triangle/triangle.exs +1 -2
- data/tracks/elixir/exercises/triangle/triangle_test.exs +17 -17
- data/tracks/elixir/exercises/twelve-days/example.exs +10 -6
- data/tracks/elixir/exercises/twelve-days/twelve_days.exs +1 -2
- data/tracks/elixir/exercises/twelve-days/twelve_days_test.exs +55 -45
- data/tracks/elixir/exercises/word-count/example.exs +5 -5
- data/tracks/elixir/exercises/word-count/word_count.exs +1 -2
- data/tracks/elixir/exercises/word-count/word_count_test.exs +5 -5
- data/tracks/elixir/exercises/wordy/example.exs +13 -14
- data/tracks/elixir/exercises/wordy/wordy.exs +1 -4
- data/tracks/elixir/exercises/wordy/wordy_test.exs +2 -2
- data/tracks/elixir/exercises/zipper/example.exs +48 -37
- data/tracks/elixir/exercises/zipper/zipper.exs +20 -14
- data/tracks/elixir/exercises/zipper/zipper_test.exs +19 -20
- data/tracks/go/.travis.yml +1 -1
- data/tracks/go/exercises/paasio/paasio_test.go +76 -0
- data/tracks/ocaml/exercises/acronym/test.ml +3 -5
- data/tracks/ocaml/exercises/all-your-base/test.ml +2 -2
- data/tracks/ocaml/exercises/anagram/test.ml +1 -9
- data/tracks/ocaml/exercises/atbash-cipher/test.ml +1 -1
- data/tracks/ocaml/exercises/binary-search/test.ml +1 -1
- data/tracks/ocaml/exercises/bob/test.ml +1 -1
- data/tracks/ocaml/exercises/bracket-push/test.ml +1 -1
- data/tracks/ocaml/exercises/connect/test.ml +1 -1
- data/tracks/ocaml/exercises/difference-of-squares/test.ml +1 -1
- data/tracks/ocaml/exercises/dominoes/test.ml +1 -1
- data/tracks/ocaml/exercises/hello-world/test.ml +1 -1
- data/tracks/ocaml/exercises/leap/test.ml +2 -2
- data/tracks/ocaml/exercises/luhn/test.ml +2 -2
- data/tracks/ocaml/exercises/pangram/test.ml +1 -1
- data/tracks/ocaml/exercises/phone-number/test.ml +7 -3
- data/tracks/ocaml/exercises/prime-factors/test.ml +1 -1
- data/tracks/ocaml/exercises/raindrops/test.ml +1 -1
- data/tracks/ocaml/exercises/react/example.ml +1 -1
- data/tracks/ocaml/exercises/roman-numerals/test.ml +3 -1
- data/tracks/ocaml/exercises/run-length-encoding/test.ml +1 -1
- data/tracks/ocaml/exercises/space-age/test.ml +1 -1
- data/tracks/ocaml/exercises/word-count/test.ml +1 -1
- data/tracks/swift/circle.yml +21 -2
- metadata +3 -2
@@ -2,8 +2,8 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("etl.exs", __DIR__)
|
3
3
|
end
|
4
4
|
|
5
|
-
ExUnit.start
|
6
|
-
ExUnit.configure
|
5
|
+
ExUnit.start()
|
6
|
+
ExUnit.configure(exclude: :pending, trace: true)
|
7
7
|
|
8
8
|
defmodule TransformTest do
|
9
9
|
use ExUnit.Case
|
@@ -27,6 +27,7 @@ defmodule TransformTest do
|
|
27
27
|
@tag :pending
|
28
28
|
test "more keys" do
|
29
29
|
old = %{1 => ["APPLE", "ARTICHOKE"], 2 => ["BOAT", "BALLERINA"]}
|
30
|
+
|
30
31
|
expected = %{
|
31
32
|
"apple" => 1,
|
32
33
|
"artichoke" => 1,
|
@@ -40,21 +41,41 @@ defmodule TransformTest do
|
|
40
41
|
@tag :pending
|
41
42
|
test "full dataset" do
|
42
43
|
old = %{
|
43
|
-
1 =>
|
44
|
-
2 =>
|
45
|
-
3 =>
|
46
|
-
4 =>
|
47
|
-
5 =>
|
48
|
-
8 =>
|
44
|
+
1 => ~W(A E I O U L N R S T),
|
45
|
+
2 => ~W(D G),
|
46
|
+
3 => ~W(B C M P),
|
47
|
+
4 => ~W(F H V W Y),
|
48
|
+
5 => ~W(K),
|
49
|
+
8 => ~W(J X),
|
49
50
|
10 => ~W(Q Z)
|
50
51
|
}
|
51
52
|
|
52
53
|
expected = %{
|
53
|
-
"a" => 1,
|
54
|
-
"
|
55
|
-
"
|
56
|
-
"
|
57
|
-
"
|
54
|
+
"a" => 1,
|
55
|
+
"b" => 3,
|
56
|
+
"c" => 3,
|
57
|
+
"d" => 2,
|
58
|
+
"e" => 1,
|
59
|
+
"f" => 4,
|
60
|
+
"g" => 2,
|
61
|
+
"h" => 4,
|
62
|
+
"i" => 1,
|
63
|
+
"j" => 8,
|
64
|
+
"k" => 5,
|
65
|
+
"l" => 1,
|
66
|
+
"m" => 3,
|
67
|
+
"n" => 1,
|
68
|
+
"o" => 1,
|
69
|
+
"p" => 3,
|
70
|
+
"q" => 10,
|
71
|
+
"r" => 1,
|
72
|
+
"s" => 1,
|
73
|
+
"t" => 1,
|
74
|
+
"u" => 1,
|
75
|
+
"v" => 4,
|
76
|
+
"w" => 4,
|
77
|
+
"x" => 8,
|
78
|
+
"y" => 4,
|
58
79
|
"z" => 10
|
59
80
|
}
|
60
81
|
|
@@ -9,15 +9,15 @@ defmodule ETL do
|
|
9
9
|
"""
|
10
10
|
def transform(input) do
|
11
11
|
input
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
|> Map.to_list()
|
13
|
+
|> invert
|
14
|
+
|> List.flatten()
|
15
|
+
|> Enum.into(%{})
|
16
16
|
end
|
17
17
|
|
18
18
|
defp invert(pairs) do
|
19
|
-
Enum.map(pairs, fn
|
20
|
-
Enum.map(values, fn
|
19
|
+
Enum.map(pairs, fn {key, values} ->
|
20
|
+
Enum.map(values, fn value -> {String.downcase(value), key} end)
|
21
21
|
end)
|
22
22
|
end
|
23
23
|
end
|
@@ -2,38 +2,38 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("flatten_array.exs", __DIR__)
|
3
3
|
end
|
4
4
|
|
5
|
-
ExUnit.start
|
6
|
-
ExUnit.configure
|
5
|
+
ExUnit.start()
|
6
|
+
ExUnit.configure(exclude: :pending, trace: true)
|
7
7
|
|
8
8
|
defmodule FlattenArrayTest do
|
9
9
|
use ExUnit.Case
|
10
10
|
|
11
11
|
test "returns original list if there is nothing to flatten" do
|
12
|
-
assert FlattenArray.flatten([1, 2, 3]) ==
|
12
|
+
assert FlattenArray.flatten([1, 2, 3]) == [1, 2, 3]
|
13
13
|
end
|
14
14
|
|
15
15
|
@tag :pending
|
16
16
|
test "flattens an empty nested list" do
|
17
|
-
assert FlattenArray.flatten([[]]) ==
|
17
|
+
assert FlattenArray.flatten([[]]) == []
|
18
18
|
end
|
19
19
|
|
20
20
|
@tag :pending
|
21
21
|
test "flattens a nested list" do
|
22
|
-
assert FlattenArray.flatten([1,[2,[3],4],5,[6,[7,8]]]) == [1, 2, 3, 4, 5, 6, 7, 8]
|
22
|
+
assert FlattenArray.flatten([1, [2, [3], 4], 5, [6, [7, 8]]]) == [1, 2, 3, 4, 5, 6, 7, 8]
|
23
23
|
end
|
24
24
|
|
25
25
|
@tag :pending
|
26
26
|
test "removes nil from list" do
|
27
|
-
assert FlattenArray.flatten([1, nil, 2]) ==
|
27
|
+
assert FlattenArray.flatten([1, nil, 2]) == [1, 2]
|
28
28
|
end
|
29
29
|
|
30
30
|
@tag :pending
|
31
31
|
test "removes nil from a nested list" do
|
32
|
-
assert FlattenArray.flatten([1, [2, nil, 4], 5]) ==
|
32
|
+
assert FlattenArray.flatten([1, [2, nil, 4], 5]) == [1, 2, 4, 5]
|
33
33
|
end
|
34
34
|
|
35
35
|
@tag :pending
|
36
36
|
test "returns an empty list if all values in nested list are nil" do
|
37
|
-
assert FlattenArray.flatten([nil, [nil], [nil, [nil]]]) ==
|
37
|
+
assert FlattenArray.flatten([nil, [nil], [nil, [nil]]]) == []
|
38
38
|
end
|
39
39
|
end
|
@@ -135,11 +135,11 @@ defmodule Forth do
|
|
135
135
|
Regex.scan(~r/[\p{L}\p{N}\p{S}\p{P}]+/u, s)
|
136
136
|
|> Stream.map(&hd/1)
|
137
137
|
|> Enum.map(fn t ->
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
138
|
+
case Integer.parse(t) do
|
139
|
+
{i, ""} -> i
|
140
|
+
_ -> t
|
141
|
+
end
|
142
|
+
end)
|
143
143
|
end
|
144
144
|
|
145
145
|
@doc """
|
@@ -6,24 +6,21 @@ defmodule Forth do
|
|
6
6
|
"""
|
7
7
|
@spec new() :: evaluator
|
8
8
|
def new() do
|
9
|
-
|
10
9
|
end
|
11
10
|
|
12
11
|
@doc """
|
13
12
|
Evaluate an input string, updating the evaluator state.
|
14
13
|
"""
|
15
|
-
@spec eval(evaluator, String.t) :: evaluator
|
14
|
+
@spec eval(evaluator, String.t()) :: evaluator
|
16
15
|
def eval(ev, s) do
|
17
|
-
|
18
16
|
end
|
19
17
|
|
20
18
|
@doc """
|
21
19
|
Return the current stack as a string with the element on top of the stack
|
22
20
|
being the rightmost element in the string.
|
23
21
|
"""
|
24
|
-
@spec format_stack(evaluator) :: String.t
|
22
|
+
@spec format_stack(evaluator) :: String.t()
|
25
23
|
def format_stack(ev) do
|
26
|
-
|
27
24
|
end
|
28
25
|
|
29
26
|
defmodule StackUnderflow do
|
@@ -32,13 +29,13 @@ defmodule Forth do
|
|
32
29
|
end
|
33
30
|
|
34
31
|
defmodule InvalidWord do
|
35
|
-
defexception
|
36
|
-
def message(e), do: "invalid word: #{inspect
|
32
|
+
defexception word: nil
|
33
|
+
def message(e), do: "invalid word: #{inspect(e.word)}"
|
37
34
|
end
|
38
35
|
|
39
36
|
defmodule UnknownWord do
|
40
|
-
defexception
|
41
|
-
def message(e), do: "unknown word: #{inspect
|
37
|
+
defexception word: nil
|
38
|
+
def message(e), do: "unknown word: #{inspect(e.word)}"
|
42
39
|
end
|
43
40
|
|
44
41
|
defmodule DivisionByZero do
|
@@ -2,167 +2,210 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("forth.exs", __DIR__)
|
3
3
|
end
|
4
4
|
|
5
|
-
ExUnit.start
|
6
|
-
ExUnit.configure
|
5
|
+
ExUnit.start()
|
6
|
+
ExUnit.configure(exclude: :pending, trace: true)
|
7
7
|
|
8
8
|
defmodule ForthTest do
|
9
9
|
use ExUnit.Case
|
10
10
|
|
11
11
|
# @tag :pending
|
12
12
|
test "no input, no stack" do
|
13
|
-
s = Forth.new |> Forth.format_stack
|
13
|
+
s = Forth.new() |> Forth.format_stack()
|
14
14
|
assert s == ""
|
15
15
|
end
|
16
16
|
|
17
17
|
@tag :pending
|
18
18
|
test "numbers just get pushed onto the stack" do
|
19
|
-
s =
|
20
|
-
|
21
|
-
|
19
|
+
s =
|
20
|
+
Forth.new()
|
21
|
+
|> Forth.eval("1 2 3 4 5")
|
22
|
+
|> Forth.format_stack()
|
23
|
+
|
22
24
|
assert s == "1 2 3 4 5"
|
23
25
|
end
|
24
26
|
|
25
27
|
@tag :pending
|
26
28
|
test "non-word characters are separators" do
|
27
29
|
# Note the Ogham Space Mark ( ), this is a spacing character.
|
28
|
-
s =
|
29
|
-
|
30
|
-
|
30
|
+
s =
|
31
|
+
Forth.new()
|
32
|
+
|> Forth.eval("1\x002\x013\n4\r5 6\t7")
|
33
|
+
|> Forth.format_stack()
|
34
|
+
|
31
35
|
assert s == "1 2 3 4 5 6 7"
|
32
36
|
end
|
33
37
|
|
34
38
|
@tag :pending
|
35
39
|
test "basic arithmetic" do
|
36
|
-
s =
|
37
|
-
|
38
|
-
|
40
|
+
s =
|
41
|
+
Forth.new()
|
42
|
+
|> Forth.eval("1 2 + 4 -")
|
43
|
+
|> Forth.format_stack()
|
44
|
+
|
39
45
|
assert s == "-1"
|
40
|
-
|
41
|
-
|
42
|
-
|
46
|
+
# integer division
|
47
|
+
s =
|
48
|
+
Forth.new()
|
49
|
+
|> Forth.eval("2 4 * 3 /")
|
50
|
+
|> Forth.format_stack()
|
51
|
+
|
43
52
|
assert s == "2"
|
44
53
|
end
|
45
54
|
|
46
55
|
@tag :pending
|
47
56
|
test "division by zero" do
|
48
57
|
assert_raise Forth.DivisionByZero, fn ->
|
49
|
-
Forth.new |> Forth.eval("4 2 2 - /")
|
58
|
+
Forth.new() |> Forth.eval("4 2 2 - /")
|
50
59
|
end
|
51
60
|
end
|
52
61
|
|
53
62
|
@tag :pending
|
54
63
|
test "dup" do
|
55
|
-
s =
|
56
|
-
|
57
|
-
|
64
|
+
s =
|
65
|
+
Forth.new()
|
66
|
+
|> Forth.eval("1 DUP")
|
67
|
+
|> Forth.format_stack()
|
68
|
+
|
58
69
|
assert s == "1 1"
|
59
|
-
|
60
|
-
|
61
|
-
|
70
|
+
|
71
|
+
s =
|
72
|
+
Forth.new()
|
73
|
+
|> Forth.eval("1 2 Dup")
|
74
|
+
|> Forth.format_stack()
|
75
|
+
|
62
76
|
assert s == "1 2 2"
|
77
|
+
|
63
78
|
assert_raise Forth.StackUnderflow, fn ->
|
64
|
-
Forth.new |> Forth.eval("dup")
|
79
|
+
Forth.new() |> Forth.eval("dup")
|
65
80
|
end
|
66
81
|
end
|
67
82
|
|
68
83
|
@tag :pending
|
69
84
|
test "drop" do
|
70
|
-
s =
|
71
|
-
|
72
|
-
|
85
|
+
s =
|
86
|
+
Forth.new()
|
87
|
+
|> Forth.eval("1 drop")
|
88
|
+
|> Forth.format_stack()
|
89
|
+
|
73
90
|
assert s == ""
|
74
|
-
|
75
|
-
|
76
|
-
|
91
|
+
|
92
|
+
s =
|
93
|
+
Forth.new()
|
94
|
+
|> Forth.eval("1 2 drop")
|
95
|
+
|> Forth.format_stack()
|
96
|
+
|
77
97
|
assert s == "1"
|
98
|
+
|
78
99
|
assert_raise Forth.StackUnderflow, fn ->
|
79
|
-
Forth.new |> Forth.eval("drop")
|
100
|
+
Forth.new() |> Forth.eval("drop")
|
80
101
|
end
|
81
102
|
end
|
82
103
|
|
83
104
|
@tag :pending
|
84
105
|
test "swap" do
|
85
|
-
s =
|
86
|
-
|
87
|
-
|
106
|
+
s =
|
107
|
+
Forth.new()
|
108
|
+
|> Forth.eval("1 2 swap")
|
109
|
+
|> Forth.format_stack()
|
110
|
+
|
88
111
|
assert s == "2 1"
|
89
|
-
|
90
|
-
|
91
|
-
|
112
|
+
|
113
|
+
s =
|
114
|
+
Forth.new()
|
115
|
+
|> Forth.eval("1 2 3 swap")
|
116
|
+
|> Forth.format_stack()
|
117
|
+
|
92
118
|
assert s == "1 3 2"
|
119
|
+
|
93
120
|
assert_raise Forth.StackUnderflow, fn ->
|
94
|
-
Forth.new |> Forth.eval("1 swap")
|
121
|
+
Forth.new() |> Forth.eval("1 swap")
|
95
122
|
end
|
123
|
+
|
96
124
|
assert_raise Forth.StackUnderflow, fn ->
|
97
|
-
Forth.new |> Forth.eval("swap")
|
125
|
+
Forth.new() |> Forth.eval("swap")
|
98
126
|
end
|
99
127
|
end
|
100
128
|
|
101
129
|
@tag :pending
|
102
130
|
test "over" do
|
103
|
-
s =
|
104
|
-
|
105
|
-
|
131
|
+
s =
|
132
|
+
Forth.new()
|
133
|
+
|> Forth.eval("1 2 over")
|
134
|
+
|> Forth.format_stack()
|
135
|
+
|
106
136
|
assert s == "1 2 1"
|
107
|
-
|
108
|
-
|
109
|
-
|
137
|
+
|
138
|
+
s =
|
139
|
+
Forth.new()
|
140
|
+
|> Forth.eval("1 2 3 over")
|
141
|
+
|> Forth.format_stack()
|
142
|
+
|
110
143
|
assert s == "1 2 3 2"
|
144
|
+
|
111
145
|
assert_raise Forth.StackUnderflow, fn ->
|
112
|
-
Forth.new |> Forth.eval("1 over")
|
146
|
+
Forth.new() |> Forth.eval("1 over")
|
113
147
|
end
|
148
|
+
|
114
149
|
assert_raise Forth.StackUnderflow, fn ->
|
115
|
-
Forth.new |> Forth.eval("over")
|
150
|
+
Forth.new() |> Forth.eval("over")
|
116
151
|
end
|
117
152
|
end
|
118
153
|
|
119
154
|
@tag :pending
|
120
155
|
test "defining a new word" do
|
121
|
-
s =
|
122
|
-
|
123
|
-
|
124
|
-
|
156
|
+
s =
|
157
|
+
Forth.new()
|
158
|
+
|> Forth.eval(": dup-twice dup dup ;")
|
159
|
+
|> Forth.eval("1 dup-twice")
|
160
|
+
|> Forth.format_stack()
|
161
|
+
|
125
162
|
assert s == "1 1 1"
|
126
163
|
end
|
127
164
|
|
128
165
|
@tag :pending
|
129
166
|
test "redefining an existing word" do
|
130
|
-
s =
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
167
|
+
s =
|
168
|
+
Forth.new()
|
169
|
+
|> Forth.eval(": foo dup ;")
|
170
|
+
|> Forth.eval(": foo dup dup ;")
|
171
|
+
|> Forth.eval("1 foo")
|
172
|
+
|> Forth.format_stack()
|
173
|
+
|
135
174
|
assert s == "1 1 1"
|
136
175
|
end
|
137
176
|
|
138
177
|
@tag :pending
|
139
178
|
test "redefining an existing built-in word" do
|
140
|
-
s =
|
141
|
-
|
142
|
-
|
143
|
-
|
179
|
+
s =
|
180
|
+
Forth.new()
|
181
|
+
|> Forth.eval(": swap dup ;")
|
182
|
+
|> Forth.eval("1 swap")
|
183
|
+
|> Forth.format_stack()
|
184
|
+
|
144
185
|
assert s == "1 1"
|
145
186
|
end
|
146
187
|
|
147
188
|
@tag :pending
|
148
189
|
test "defining words with odd characters" do
|
149
|
-
s =
|
150
|
-
|
151
|
-
|
190
|
+
s =
|
191
|
+
Forth.new()
|
192
|
+
|> Forth.eval(": € 220371 ; €")
|
193
|
+
|> Forth.format_stack()
|
194
|
+
|
152
195
|
assert s == "220371"
|
153
196
|
end
|
154
197
|
|
155
198
|
@tag :pending
|
156
199
|
test "defining a number" do
|
157
200
|
assert_raise Forth.InvalidWord, fn ->
|
158
|
-
Forth.new |> Forth.eval(": 1 2 ;")
|
201
|
+
Forth.new() |> Forth.eval(": 1 2 ;")
|
159
202
|
end
|
160
203
|
end
|
161
204
|
|
162
205
|
@tag :pending
|
163
206
|
test "calling a non-existing word" do
|
164
207
|
assert_raise Forth.UnknownWord, fn ->
|
165
|
-
Forth.new |> Forth.eval("1 foo")
|
208
|
+
Forth.new() |> Forth.eval("1 foo")
|
166
209
|
end
|
167
210
|
end
|
168
211
|
end
|