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
@@ -1,10 +1,10 @@
|
|
1
1
|
defmodule Triangle do
|
2
|
-
def kind(a, b, c), do: kind
|
2
|
+
def kind(a, b, c), do: kind(Enum.sort([a, b, c]))
|
3
3
|
|
4
|
-
defp kind([a, _, _]) when a <= 0, do: {
|
5
|
-
defp kind([a, b, c]) when a + b <= c, do: {
|
6
|
-
defp kind([x, x, x]), do: {
|
7
|
-
defp kind([x, x, _]), do: {
|
8
|
-
defp kind([_, x, x]), do: {
|
9
|
-
defp kind([_, _, _]), do: {
|
4
|
+
defp kind([a, _, _]) when a <= 0, do: {:error, "all side lengths must be positive"}
|
5
|
+
defp kind([a, b, c]) when a + b <= c, do: {:error, "side lengths violate triangle inequality"}
|
6
|
+
defp kind([x, x, x]), do: {:ok, :equilateral}
|
7
|
+
defp kind([x, x, _]), do: {:ok, :isosceles}
|
8
|
+
defp kind([_, x, x]), do: {:ok, :isosceles}
|
9
|
+
defp kind([_, _, _]), do: {:ok, :scalene}
|
10
10
|
end
|
@@ -4,8 +4,7 @@ defmodule Triangle do
|
|
4
4
|
@doc """
|
5
5
|
Return the kind of triangle of a triangle with 'a', 'b' and 'c' as lengths.
|
6
6
|
"""
|
7
|
-
@spec kind(number, number, number) :: {
|
7
|
+
@spec kind(number, number, number) :: {:ok, kind} | {:error, String.t()}
|
8
8
|
def kind(a, b, c) do
|
9
|
-
|
10
9
|
end
|
11
10
|
end
|
@@ -2,84 +2,84 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("triangle.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 TriangleTest do
|
9
9
|
use ExUnit.Case
|
10
10
|
|
11
11
|
# @tag :pending
|
12
12
|
test "equilateral triangles have equal sides" do
|
13
|
-
assert Triangle.kind(2, 2, 2) == {
|
13
|
+
assert Triangle.kind(2, 2, 2) == {:ok, :equilateral}
|
14
14
|
end
|
15
15
|
|
16
16
|
@tag :pending
|
17
17
|
test "larger equilateral triangles also have equal sides" do
|
18
|
-
assert Triangle.kind(10, 10, 10) == {
|
18
|
+
assert Triangle.kind(10, 10, 10) == {:ok, :equilateral}
|
19
19
|
end
|
20
20
|
|
21
21
|
@tag :pending
|
22
22
|
test "isosceles triangles have last two sides equal" do
|
23
|
-
assert Triangle.kind(3, 4, 4) == {
|
23
|
+
assert Triangle.kind(3, 4, 4) == {:ok, :isosceles}
|
24
24
|
end
|
25
25
|
|
26
26
|
@tag :pending
|
27
27
|
test "isosceles triangles have first and last sides equal" do
|
28
|
-
assert Triangle.kind(4, 3, 4) == {
|
28
|
+
assert Triangle.kind(4, 3, 4) == {:ok, :isosceles}
|
29
29
|
end
|
30
30
|
|
31
31
|
@tag :pending
|
32
32
|
test "isosceles triangles have two first sides equal" do
|
33
|
-
assert Triangle.kind(4, 4, 3) == {
|
33
|
+
assert Triangle.kind(4, 4, 3) == {:ok, :isosceles}
|
34
34
|
end
|
35
35
|
|
36
36
|
@tag :pending
|
37
37
|
test "isosceles triangles have in fact exactly two sides equal" do
|
38
|
-
assert Triangle.kind(10, 10, 2) == {
|
38
|
+
assert Triangle.kind(10, 10, 2) == {:ok, :isosceles}
|
39
39
|
end
|
40
40
|
|
41
41
|
@tag :pending
|
42
42
|
test "scalene triangles have no equal sides" do
|
43
|
-
assert Triangle.kind(3, 4, 5) == {
|
43
|
+
assert Triangle.kind(3, 4, 5) == {:ok, :scalene}
|
44
44
|
end
|
45
45
|
|
46
46
|
@tag :pending
|
47
47
|
test "scalene triangles have no equal sides at a larger scale too" do
|
48
|
-
assert Triangle.kind(10, 11, 12) == {
|
48
|
+
assert Triangle.kind(10, 11, 12) == {:ok, :scalene}
|
49
49
|
end
|
50
50
|
|
51
51
|
@tag :pending
|
52
52
|
test "scalene triangles have no equal sides in descending order either" do
|
53
|
-
assert Triangle.kind(5, 4, 2) == {
|
53
|
+
assert Triangle.kind(5, 4, 2) == {:ok, :scalene}
|
54
54
|
end
|
55
55
|
|
56
56
|
@tag :pending
|
57
57
|
test "very small triangles are legal" do
|
58
|
-
assert Triangle.kind(0.4, 0.6, 0.3) == {
|
58
|
+
assert Triangle.kind(0.4, 0.6, 0.3) == {:ok, :scalene}
|
59
59
|
end
|
60
60
|
|
61
61
|
@tag :pending
|
62
62
|
test "triangles with no size are illegal" do
|
63
|
-
assert Triangle.kind(0, 0, 0) == {
|
63
|
+
assert Triangle.kind(0, 0, 0) == {:error, "all side lengths must be positive"}
|
64
64
|
end
|
65
65
|
|
66
66
|
@tag :pending
|
67
67
|
test "triangles with negative sides are illegal" do
|
68
|
-
assert Triangle.kind(3, 4, -5) == {
|
68
|
+
assert Triangle.kind(3, 4, -5) == {:error, "all side lengths must be positive"}
|
69
69
|
end
|
70
70
|
|
71
71
|
@tag :pending
|
72
72
|
test "triangles violating triangle inequality are illegal" do
|
73
|
-
assert Triangle.kind(1, 1, 3) == {
|
73
|
+
assert Triangle.kind(1, 1, 3) == {:error, "side lengths violate triangle inequality"}
|
74
74
|
end
|
75
75
|
|
76
76
|
@tag :pending
|
77
77
|
test "triangles violating triangle inequality are illegal 2" do
|
78
|
-
assert Triangle.kind(2, 4, 2) == {
|
78
|
+
assert Triangle.kind(2, 4, 2) == {:error, "side lengths violate triangle inequality"}
|
79
79
|
end
|
80
80
|
|
81
81
|
@tag :pending
|
82
82
|
test "triangles violating triangle inequality are illegal 3" do
|
83
|
-
assert Triangle.kind(7, 3, 2) == {
|
83
|
+
assert Triangle.kind(7, 3, 2) == {:error, "side lengths violate triangle inequality"}
|
84
84
|
end
|
85
85
|
end
|
@@ -14,10 +14,10 @@ defmodule TwelveDays do
|
|
14
14
|
{"twelve", "twelfth", "Drummers Drumming"}
|
15
15
|
]
|
16
16
|
|
17
|
-
for {
|
17
|
+
for {{count, ordinal, gift}, number} <- @days |> Enum.with_index(1) do
|
18
18
|
defp count(unquote(number)), do: unquote(count)
|
19
19
|
defp ordinal(unquote(number)), do: unquote(ordinal)
|
20
|
-
defp gift(unquote(number)), do: "#{count(unquote(number))} #{
|
20
|
+
defp gift(unquote(number)), do: "#{count(unquote(number))} #{unquote(gift)}"
|
21
21
|
end
|
22
22
|
|
23
23
|
@doc """
|
@@ -26,11 +26,16 @@ defmodule TwelveDays do
|
|
26
26
|
"""
|
27
27
|
@spec verse(number :: integer) :: String.t()
|
28
28
|
def verse(number) do
|
29
|
-
"On the #{ordinal(number)} day of Christmas my true love gave to me, #{
|
29
|
+
"On the #{ordinal(number)} day of Christmas my true love gave to me, #{
|
30
|
+
gifts_for_day(number, [])
|
31
|
+
}."
|
30
32
|
end
|
31
33
|
|
32
34
|
defp gifts_for_day(1, []), do: gift(1)
|
33
|
-
|
35
|
+
|
36
|
+
defp gifts_for_day(1, results),
|
37
|
+
do: ["and #{gift(1)}" | results] |> Enum.reverse() |> Enum.join(", ")
|
38
|
+
|
34
39
|
defp gifts_for_day(number, results), do: gifts_for_day(number - 1, [gift(number) | results])
|
35
40
|
|
36
41
|
@doc """
|
@@ -47,7 +52,6 @@ defmodule TwelveDays do
|
|
47
52
|
@doc """
|
48
53
|
Sing all 12 verses, in order, one verse per line.
|
49
54
|
"""
|
50
|
-
@spec sing():: String.t()
|
55
|
+
@spec sing() :: String.t()
|
51
56
|
def sing, do: verses(1, 12)
|
52
57
|
end
|
53
|
-
|
@@ -2,85 +2,95 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("twelve_days.exs", __DIR__)
|
3
3
|
end
|
4
4
|
|
5
|
-
ExUnit.start
|
6
|
-
ExUnit.configure
|
5
|
+
ExUnit.start()
|
6
|
+
ExUnit.configure(trace: true, exclude: :pending)
|
7
7
|
|
8
8
|
defmodule TwelveDaysTest do
|
9
9
|
use ExUnit.Case
|
10
10
|
|
11
11
|
describe "verse" do
|
12
|
-
|
12
|
+
# @tag :pending
|
13
13
|
test "first verse" do
|
14
|
-
assert TwelveDays.verse(1) ==
|
14
|
+
assert TwelveDays.verse(1) ==
|
15
|
+
"On the first day of Christmas my true love gave to me, a Partridge in a Pear Tree."
|
15
16
|
end
|
16
17
|
|
17
18
|
@tag :pending
|
18
19
|
test "sixth verse" do
|
19
|
-
assert TwelveDays.verse(6) ==
|
20
|
+
assert TwelveDays.verse(6) ==
|
21
|
+
"On the sixth day of Christmas my true love gave to me, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree."
|
20
22
|
end
|
21
23
|
|
22
24
|
@tag :pending
|
23
25
|
test "last verse" do
|
24
|
-
assert TwelveDays.verse(12) ==
|
26
|
+
assert TwelveDays.verse(12) ==
|
27
|
+
"On the twelfth day of Christmas my true love gave to me, twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree."
|
25
28
|
end
|
26
29
|
end
|
27
30
|
|
28
31
|
describe "verses" do
|
29
32
|
@tag :pending
|
30
33
|
test "1-3" do
|
31
|
-
assert TwelveDays.verses(1, 3) ==
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
assert TwelveDays.verses(1, 3) ==
|
35
|
+
"""
|
36
|
+
On the first day of Christmas my true love gave to me, a Partridge in a Pear Tree.
|
37
|
+
On the second day of Christmas my true love gave to me, two Turtle Doves, and a Partridge in a Pear Tree.
|
38
|
+
On the third day of Christmas my true love gave to me, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
39
|
+
"""
|
40
|
+
|> String.trim()
|
36
41
|
end
|
37
42
|
|
38
43
|
@tag :pending
|
39
44
|
test "4-6" do
|
40
|
-
assert TwelveDays.verses(4, 6) ==
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
+
assert TwelveDays.verses(4, 6) ==
|
46
|
+
"""
|
47
|
+
On the fourth day of Christmas my true love gave to me, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
48
|
+
On the fifth day of Christmas my true love gave to me, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
49
|
+
On the sixth day of Christmas my true love gave to me, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
50
|
+
"""
|
51
|
+
|> String.trim()
|
45
52
|
end
|
46
53
|
|
47
54
|
@tag :pending
|
48
55
|
test "1-12" do
|
49
|
-
assert TwelveDays.verses(1, 12) ==
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
56
|
+
assert TwelveDays.verses(1, 12) ==
|
57
|
+
"""
|
58
|
+
On the first day of Christmas my true love gave to me, a Partridge in a Pear Tree.
|
59
|
+
On the second day of Christmas my true love gave to me, two Turtle Doves, and a Partridge in a Pear Tree.
|
60
|
+
On the third day of Christmas my true love gave to me, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
61
|
+
On the fourth day of Christmas my true love gave to me, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
62
|
+
On the fifth day of Christmas my true love gave to me, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
63
|
+
On the sixth day of Christmas my true love gave to me, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
64
|
+
On the seventh day of Christmas my true love gave to me, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
65
|
+
On the eighth day of Christmas my true love gave to me, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
66
|
+
On the ninth day of Christmas my true love gave to me, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
67
|
+
On the tenth day of Christmas my true love gave to me, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
68
|
+
On the eleventh day of Christmas my true love gave to me, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
69
|
+
On the twelfth day of Christmas my true love gave to me, twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
70
|
+
"""
|
71
|
+
|> String.trim()
|
63
72
|
end
|
64
73
|
end
|
65
74
|
|
66
75
|
describe "sing" do
|
67
76
|
@tag :pending
|
68
77
|
test "all 12 verses" do
|
69
|
-
assert TwelveDays.sing ==
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
78
|
+
assert TwelveDays.sing() ==
|
79
|
+
"""
|
80
|
+
On the first day of Christmas my true love gave to me, a Partridge in a Pear Tree.
|
81
|
+
On the second day of Christmas my true love gave to me, two Turtle Doves, and a Partridge in a Pear Tree.
|
82
|
+
On the third day of Christmas my true love gave to me, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
83
|
+
On the fourth day of Christmas my true love gave to me, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
84
|
+
On the fifth day of Christmas my true love gave to me, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
85
|
+
On the sixth day of Christmas my true love gave to me, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
86
|
+
On the seventh day of Christmas my true love gave to me, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
87
|
+
On the eighth day of Christmas my true love gave to me, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
88
|
+
On the ninth day of Christmas my true love gave to me, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
89
|
+
On the tenth day of Christmas my true love gave to me, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
90
|
+
On the eleventh day of Christmas my true love gave to me, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
91
|
+
On the twelfth day of Christmas my true love gave to me, twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
|
92
|
+
"""
|
93
|
+
|> String.trim()
|
83
94
|
end
|
84
95
|
end
|
85
96
|
end
|
86
|
-
|
@@ -3,15 +3,15 @@ defmodule Words do
|
|
3
3
|
|
4
4
|
def count(sentence) do
|
5
5
|
sentence
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
|> String.downcase()
|
7
|
+
|> remove_punctuation
|
8
|
+
|> to_words
|
9
|
+
|> summarize
|
10
10
|
end
|
11
11
|
|
12
12
|
defp remove_punctuation(string), do: String.replace(string, @ascii_punctuation, " ")
|
13
13
|
|
14
|
-
defp to_words(sentence), do: List.flatten
|
14
|
+
defp to_words(sentence), do: List.flatten(String.split(sentence))
|
15
15
|
|
16
16
|
defp summarize(words) do
|
17
17
|
Enum.reduce(words, %{}, &add_count/2)
|
@@ -2,25 +2,25 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("word_count.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 WordsTest do
|
9
9
|
use ExUnit.Case
|
10
10
|
|
11
11
|
test "count one word" do
|
12
|
-
assert Words.count("word") == %{
|
12
|
+
assert Words.count("word") == %{"word" => 1}
|
13
13
|
end
|
14
14
|
|
15
15
|
@tag :pending
|
16
16
|
test "count one of each" do
|
17
|
-
expected = %{
|
17
|
+
expected = %{"one" => 1, "of" => 1, "each" => 1}
|
18
18
|
assert Words.count("one of each") == expected
|
19
19
|
end
|
20
20
|
|
21
21
|
@tag :pending
|
22
22
|
test "count multiple occurrences" do
|
23
|
-
expected = %{
|
23
|
+
expected = %{"one" => 1, "fish" => 4, "two" => 1, "red" => 1, "blue" => 1}
|
24
24
|
assert Words.count("one fish two fish red fish blue fish") == expected
|
25
25
|
end
|
26
26
|
|
@@ -6,7 +6,7 @@ defmodule Wordy do
|
|
6
6
|
@doc """
|
7
7
|
Calculate the math problem in the sentence.
|
8
8
|
"""
|
9
|
-
@spec answer(String.t) :: integer
|
9
|
+
@spec answer(String.t()) :: integer
|
10
10
|
def answer(question) do
|
11
11
|
question
|
12
12
|
|> tokenize
|
@@ -17,34 +17,33 @@ defmodule Wordy do
|
|
17
17
|
|
18
18
|
defp tokenize(sentence) do
|
19
19
|
Regex.scan(~r/(#{all_matchers()})/, sentence)
|
20
|
-
|> Enum.map(&
|
20
|
+
|> Enum.map(&Enum.at(&1, 0))
|
21
21
|
end
|
22
22
|
|
23
23
|
defp all_matchers do
|
24
|
-
Enum.map(@parts, &
|
24
|
+
Enum.map(@parts, & &1.matcher) |> Enum.join("|")
|
25
25
|
end
|
26
26
|
|
27
27
|
defp parse(tokens) do
|
28
|
-
for token <- tokens,
|
29
|
-
part = Enum.find(@parts, &(&1.match?(token))) do
|
28
|
+
for token <- tokens, part = Enum.find(@parts, & &1.match?(token)) do
|
30
29
|
part.parse(token)
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
34
33
|
defp validate(parsed) do
|
35
|
-
if Enum.find(parsed, &(
|
34
|
+
if Enum.find(parsed, &is_function(&1)) do
|
36
35
|
parsed
|
37
36
|
else
|
38
37
|
raise ArgumentError
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
42
|
-
defp calculate([
|
41
|
+
defp calculate([left | []]) do
|
43
42
|
left
|
44
43
|
end
|
45
44
|
|
46
|
-
defp calculate([
|
47
|
-
calculate([
|
45
|
+
defp calculate([left, operation, right | t]) do
|
46
|
+
calculate([operation.(left, right) | t])
|
48
47
|
end
|
49
48
|
|
50
49
|
defmodule Number do
|
@@ -53,7 +52,7 @@ defmodule Wordy do
|
|
53
52
|
end
|
54
53
|
|
55
54
|
def match?(token) do
|
56
|
-
String.match?(token
|
55
|
+
String.match?(token, ~r/#{matcher()}/)
|
57
56
|
end
|
58
57
|
|
59
58
|
def parse(token) do
|
@@ -67,7 +66,7 @@ defmodule Wordy do
|
|
67
66
|
end
|
68
67
|
|
69
68
|
def match?(token) do
|
70
|
-
String.match?(token
|
69
|
+
String.match?(token, ~r/#{matcher()}/)
|
71
70
|
end
|
72
71
|
|
73
72
|
def parse(_) do
|
@@ -85,7 +84,7 @@ defmodule Wordy do
|
|
85
84
|
end
|
86
85
|
|
87
86
|
def match?(token) do
|
88
|
-
String.match?(token
|
87
|
+
String.match?(token, ~r/#{matcher()}/)
|
89
88
|
end
|
90
89
|
|
91
90
|
def parse(_) do
|
@@ -103,7 +102,7 @@ defmodule Wordy do
|
|
103
102
|
end
|
104
103
|
|
105
104
|
def match?(token) do
|
106
|
-
String.match?(token
|
105
|
+
String.match?(token, ~r/#{matcher()}/)
|
107
106
|
end
|
108
107
|
|
109
108
|
def parse(_) do
|
@@ -121,7 +120,7 @@ defmodule Wordy do
|
|
121
120
|
end
|
122
121
|
|
123
122
|
def match?(token) do
|
124
|
-
String.match?(token
|
123
|
+
String.match?(token, ~r/#{matcher()}/)
|
125
124
|
end
|
126
125
|
|
127
126
|
def parse(_) do
|