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,15 +2,15 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("matrix.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 MatrixTest do
|
9
9
|
use ExUnit.Case
|
10
10
|
|
11
11
|
@input "1 2 3\n4 5 6\n7 8 9"
|
12
12
|
|
13
|
-
|
13
|
+
# @tag :pending
|
14
14
|
test "reading from and writing to string" do
|
15
15
|
matrix = Matrix.from_string(@input)
|
16
16
|
assert Matrix.to_string(matrix) == @input
|
@@ -21,10 +21,10 @@ defmodule MatrixTest do
|
|
21
21
|
matrix = Matrix.from_string(@input)
|
22
22
|
|
23
23
|
assert Matrix.rows(matrix) == [
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
[1, 2, 3],
|
25
|
+
[4, 5, 6],
|
26
|
+
[7, 8, 9]
|
27
|
+
]
|
28
28
|
end
|
29
29
|
|
30
30
|
@tag :pending
|
@@ -41,10 +41,10 @@ defmodule MatrixTest do
|
|
41
41
|
matrix = Matrix.from_string(@input)
|
42
42
|
|
43
43
|
assert Matrix.columns(matrix) == [
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
[1, 4, 7],
|
45
|
+
[2, 5, 8],
|
46
|
+
[3, 6, 9]
|
47
|
+
]
|
48
48
|
end
|
49
49
|
|
50
50
|
@tag :pending
|
@@ -4,8 +4,13 @@ defmodule Meetup do
|
|
4
4
|
"""
|
5
5
|
|
6
6
|
@type weekday ::
|
7
|
-
|
8
|
-
|
7
|
+
:monday
|
8
|
+
| :tuesday
|
9
|
+
| :wednesday
|
10
|
+
| :thursday
|
11
|
+
| :friday
|
12
|
+
| :saturday
|
13
|
+
| :sunday
|
9
14
|
|
10
15
|
@type schedule :: :first | :second | :third | :fourth | :last | :teenth
|
11
16
|
|
@@ -15,37 +20,39 @@ defmodule Meetup do
|
|
15
20
|
The schedule is in which week (1..4, last or "teenth") the meetup date should
|
16
21
|
fall.
|
17
22
|
"""
|
18
|
-
@spec meetup(pos_integer, pos_integer, weekday, schedule) :: :calendar.date
|
23
|
+
@spec meetup(pos_integer, pos_integer, weekday, schedule) :: :calendar.date()
|
19
24
|
def meetup(year, month, weekday, :last) do
|
20
25
|
start_day = :calendar.last_day_of_the_month(year, month) - 6
|
21
26
|
meetup_nth(year, month, start_day, weekday)
|
22
27
|
end
|
28
|
+
|
23
29
|
def meetup(year, month, weekday, schedule) do
|
24
30
|
meetup_nth(year, month, schedule_start(schedule), weekday)
|
25
31
|
end
|
26
32
|
|
27
33
|
defp meetup_nth(year, month, start_day, weekday) do
|
28
34
|
w = weekday_num(weekday)
|
35
|
+
|
29
36
|
case w - :calendar.day_of_the_week(year, month, start_day) do
|
30
|
-
|
31
|
-
|
37
|
+
n when n < 0 -> {year, month, start_day + n + 7}
|
38
|
+
n -> {year, month, start_day + n}
|
32
39
|
end
|
33
40
|
end
|
34
41
|
|
35
42
|
# Aliases for the day of week numbers from Erlang.
|
36
43
|
#
|
37
44
|
# Case matching is used because that's very fast in Elixir/Erlang.
|
38
|
-
defp weekday_num(:monday),
|
39
|
-
defp weekday_num(:tuesday),
|
45
|
+
defp weekday_num(:monday), do: 1
|
46
|
+
defp weekday_num(:tuesday), do: 2
|
40
47
|
defp weekday_num(:wednesday), do: 3
|
41
|
-
defp weekday_num(:thursday),
|
42
|
-
defp weekday_num(:friday),
|
43
|
-
defp weekday_num(:saturday),
|
44
|
-
defp weekday_num(:sunday),
|
48
|
+
defp weekday_num(:thursday), do: 4
|
49
|
+
defp weekday_num(:friday), do: 5
|
50
|
+
defp weekday_num(:saturday), do: 6
|
51
|
+
defp weekday_num(:sunday), do: 7
|
45
52
|
|
46
|
-
defp schedule_start(:first),
|
53
|
+
defp schedule_start(:first), do: 1
|
47
54
|
defp schedule_start(:second), do: 8
|
48
|
-
defp schedule_start(:third),
|
55
|
+
defp schedule_start(:third), do: 15
|
49
56
|
defp schedule_start(:fourth), do: 22
|
50
57
|
defp schedule_start(:teenth), do: 13
|
51
58
|
end
|
@@ -4,8 +4,13 @@ defmodule Meetup do
|
|
4
4
|
"""
|
5
5
|
|
6
6
|
@type weekday ::
|
7
|
-
|
8
|
-
|
7
|
+
:monday
|
8
|
+
| :tuesday
|
9
|
+
| :wednesday
|
10
|
+
| :thursday
|
11
|
+
| :friday
|
12
|
+
| :saturday
|
13
|
+
| :sunday
|
9
14
|
|
10
15
|
@type schedule :: :first | :second | :third | :fourth | :last | :teenth
|
11
16
|
|
@@ -15,8 +20,7 @@ defmodule Meetup do
|
|
15
20
|
The schedule is in which week (1..4, last or "teenth") the meetup date should
|
16
21
|
fall.
|
17
22
|
"""
|
18
|
-
@spec meetup(pos_integer, pos_integer, weekday, schedule) :: :calendar.date
|
23
|
+
@spec meetup(pos_integer, pos_integer, weekday, schedule) :: :calendar.date()
|
19
24
|
def meetup(year, month, weekday, schedule) do
|
20
|
-
|
21
25
|
end
|
22
26
|
end
|
@@ -2,8 +2,8 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("meetup.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 MeetupTest do
|
9
9
|
use ExUnit.Case
|
@@ -2,8 +2,8 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("minesweeper.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 MinesweeperTest do
|
9
9
|
use ExUnit.Case
|
@@ -18,25 +18,19 @@ defmodule MinesweeperTest do
|
|
18
18
|
|
19
19
|
@tag :pending
|
20
20
|
test "empty board" do
|
21
|
-
b = [" ",
|
22
|
-
" ",
|
23
|
-
" "]
|
21
|
+
b = [" ", " ", " "]
|
24
22
|
assert Minesweeper.annotate(clean(b)) == b
|
25
23
|
end
|
26
24
|
|
27
25
|
@tag :pending
|
28
26
|
test "board full of mines" do
|
29
|
-
b = ["***",
|
30
|
-
"***",
|
31
|
-
"***"]
|
27
|
+
b = ["***", "***", "***"]
|
32
28
|
assert Minesweeper.annotate(clean(b)) == b
|
33
29
|
end
|
34
30
|
|
35
31
|
@tag :pending
|
36
32
|
test "surrounded" do
|
37
|
-
b = ["***",
|
38
|
-
"*8*",
|
39
|
-
"***"]
|
33
|
+
b = ["***", "*8*", "***"]
|
40
34
|
assert Minesweeper.annotate(clean(b)) == b
|
41
35
|
end
|
42
36
|
|
@@ -48,21 +42,13 @@ defmodule MinesweeperTest do
|
|
48
42
|
|
49
43
|
@tag :pending
|
50
44
|
test "vertical line" do
|
51
|
-
b = ["1",
|
52
|
-
"*",
|
53
|
-
"2",
|
54
|
-
"*",
|
55
|
-
"1"]
|
45
|
+
b = ["1", "*", "2", "*", "1"]
|
56
46
|
assert Minesweeper.annotate(clean(b)) == b
|
57
47
|
end
|
58
48
|
|
59
49
|
@tag :pending
|
60
50
|
test "cross" do
|
61
|
-
b = [" 2*2 ",
|
62
|
-
"25*52",
|
63
|
-
"*****",
|
64
|
-
"25*52",
|
65
|
-
" 2*2 "]
|
51
|
+
b = [" 2*2 ", "25*52", "*****", "25*52", " 2*2 "]
|
66
52
|
assert Minesweeper.annotate(clean(b)) == b
|
67
53
|
end
|
68
54
|
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
defmodule Prime do
|
2
|
-
|
3
2
|
@doc """
|
4
3
|
Generates the nth prime.
|
5
4
|
"""
|
6
5
|
@spec nth(non_neg_integer) :: non_neg_integer
|
7
6
|
def nth(count) do
|
8
|
-
if count < 1, do: raise
|
7
|
+
if count < 1, do: raise(ArgumentError)
|
9
8
|
nth(count, 1000)
|
10
9
|
end
|
11
10
|
|
12
11
|
defp nth(count, max) do
|
13
12
|
primes = primes_to(max)
|
13
|
+
|
14
14
|
cond do
|
15
15
|
Enum.count(primes) < count -> nth(count, max * 4)
|
16
16
|
true -> Enum.at(primes, count - 1)
|
@@ -18,13 +18,13 @@ defmodule Prime do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
defp primes_to(limit) do
|
21
|
-
Enum.reduce(2..limit, [], fn
|
22
|
-
if is_prime?(number, primes), do: [number|primes], else: primes
|
23
|
-
|
21
|
+
Enum.reduce(2..limit, [], fn number, primes ->
|
22
|
+
if is_prime?(number, primes), do: [number | primes], else: primes
|
23
|
+
end)
|
24
|
+
|> Enum.reverse()
|
24
25
|
end
|
25
26
|
|
26
27
|
defp is_prime?(number, primes) do
|
27
28
|
Enum.all?(primes, &(rem(number, &1) != 0))
|
28
29
|
end
|
29
|
-
|
30
|
-
end
|
30
|
+
end
|
@@ -2,8 +2,8 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("nth_prime.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 NthPrimeTest do
|
9
9
|
use ExUnit.Case
|
@@ -30,6 +30,6 @@ defmodule NthPrimeTest do
|
|
30
30
|
|
31
31
|
@tag :pending
|
32
32
|
test "weird case" do
|
33
|
-
catch_error
|
33
|
+
catch_error(Prime.nth(0))
|
34
34
|
end
|
35
35
|
end
|
@@ -13,10 +13,11 @@ defmodule NucleotideCount do
|
|
13
13
|
1
|
14
14
|
"""
|
15
15
|
|
16
|
-
def count(strand, nucleotide) when nucleotide in
|
17
|
-
Enum.count
|
16
|
+
def count(strand, nucleotide) when nucleotide in @nucleotides do
|
17
|
+
Enum.count(strand, &(&1 == nucleotide))
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
|
+
def count(_strand, _nucleotide), do: raise(ArgumentError)
|
20
21
|
|
21
22
|
@doc """
|
22
23
|
Returns a summary of counts by nucleotide.
|
@@ -14,10 +14,8 @@ defmodule NucleotideCount do
|
|
14
14
|
"""
|
15
15
|
@spec count([char], char) :: non_neg_integer
|
16
16
|
def count(strand, nucleotide) do
|
17
|
-
|
18
17
|
end
|
19
18
|
|
20
|
-
|
21
19
|
@doc """
|
22
20
|
Returns a summary of counts by nucleotide.
|
23
21
|
|
@@ -28,6 +26,5 @@ defmodule NucleotideCount do
|
|
28
26
|
"""
|
29
27
|
@spec histogram([char]) :: map
|
30
28
|
def histogram(strand) do
|
31
|
-
|
32
29
|
end
|
33
30
|
end
|
@@ -2,8 +2,8 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("nucleotide_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 NucleotideCountTest do
|
9
9
|
use ExUnit.Case
|
@@ -1,10 +1,9 @@
|
|
1
1
|
defmodule OCRNumbers do
|
2
|
-
|
3
2
|
@doc """
|
4
3
|
Given a 3 x 4 grid of pipes, underscores, and spaces, determine which number is represented, or
|
5
4
|
whether it is garbled.
|
6
5
|
"""
|
7
|
-
@spec convert([String.t]) :: String.t
|
6
|
+
@spec convert([String.t()]) :: String.t()
|
8
7
|
def convert(input) do
|
9
8
|
Enum.chunk(input, 4)
|
10
9
|
|> Enum.map(fn row_set -> _convert(row_set, "") end)
|
@@ -21,9 +20,10 @@ defmodule OCRNumbers do
|
|
21
20
|
def _convert(_, {:error, _} = error), do: error
|
22
21
|
def _convert(input, _) when length(input) != 4, do: {:error, 'invalid line count'}
|
23
22
|
def _convert(["", "", "", ""], output), do: output
|
23
|
+
|
24
24
|
def _convert(input, output) do
|
25
25
|
split_strings = Enum.map(input, fn a -> String.split_at(a, 3) end)
|
26
|
-
this_character = Enum.map(split_strings, fn
|
26
|
+
this_character = Enum.map(split_strings, fn {a, _} -> a end)
|
27
27
|
other_characters = Enum.map(split_strings, fn {_, a} -> a end)
|
28
28
|
lengths = Enum.map(this_character, fn a -> String.length(a) end)
|
29
29
|
|
@@ -1,10 +1,9 @@
|
|
1
1
|
defmodule OCRNumbers do
|
2
|
-
|
3
2
|
@doc """
|
4
3
|
Given a 3 x 4 grid of pipes, underscores, and spaces, determine which number is represented, or
|
5
4
|
whether it is garbled.
|
6
5
|
"""
|
7
|
-
@spec convert([String.t]) :: String.t
|
6
|
+
@spec convert([String.t()]) :: String.t()
|
8
7
|
def convert(input) do
|
9
8
|
end
|
10
9
|
end
|
@@ -2,238 +2,223 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
|
2
2
|
Code.load_file("ocr_numbers.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 OCRNumbersTest do
|
9
9
|
use ExUnit.Case
|
10
10
|
|
11
11
|
# @tag :pending
|
12
12
|
test "Recognizes 0" do
|
13
|
-
number =
|
14
|
-
[
|
13
|
+
number =
|
14
|
+
OCRNumbers.convert([
|
15
15
|
" _ ",
|
16
16
|
"| |",
|
17
17
|
"|_|",
|
18
18
|
" "
|
19
|
-
]
|
20
|
-
|
19
|
+
])
|
20
|
+
|
21
21
|
assert number == {:ok, "0"}
|
22
22
|
end
|
23
23
|
|
24
24
|
@tag :pending
|
25
25
|
test "Recognizes 1" do
|
26
|
-
number =
|
27
|
-
[
|
26
|
+
number =
|
27
|
+
OCRNumbers.convert([
|
28
28
|
" ",
|
29
29
|
" |",
|
30
30
|
" |",
|
31
31
|
" "
|
32
|
-
]
|
33
|
-
)
|
32
|
+
])
|
34
33
|
|
35
34
|
assert number == {:ok, "1"}
|
36
35
|
end
|
37
36
|
|
38
37
|
@tag :pending
|
39
38
|
test "Unreadable but correctly sized inputs return ?" do
|
40
|
-
number =
|
41
|
-
[
|
39
|
+
number =
|
40
|
+
OCRNumbers.convert([
|
42
41
|
" ",
|
43
42
|
" _",
|
44
43
|
" |",
|
45
44
|
" "
|
46
|
-
]
|
47
|
-
)
|
45
|
+
])
|
48
46
|
|
49
47
|
assert number == {:ok, "?"}
|
50
48
|
end
|
51
49
|
|
52
50
|
@tag :pending
|
53
51
|
test "Input with a number of lines that is not a multiple of four raises an error" do
|
54
|
-
number =
|
55
|
-
[
|
52
|
+
number =
|
53
|
+
OCRNumbers.convert([
|
56
54
|
" _ ",
|
57
55
|
"| |",
|
58
56
|
" "
|
59
|
-
]
|
60
|
-
)
|
57
|
+
])
|
61
58
|
|
62
59
|
assert number == {:error, 'invalid line count'}
|
63
60
|
end
|
64
61
|
|
65
62
|
@tag :pending
|
66
63
|
test "Input with a number of columns that is not a multiple of three raises an error" do
|
67
|
-
number =
|
68
|
-
[
|
64
|
+
number =
|
65
|
+
OCRNumbers.convert([
|
69
66
|
" ",
|
70
67
|
" |",
|
71
68
|
" |",
|
72
69
|
" "
|
73
|
-
]
|
74
|
-
)
|
70
|
+
])
|
75
71
|
|
76
72
|
assert number == {:error, 'invalid column count'}
|
77
73
|
end
|
78
74
|
|
79
75
|
@tag :pending
|
80
76
|
test "Recognizes 110101100" do
|
81
|
-
number =
|
82
|
-
[
|
77
|
+
number =
|
78
|
+
OCRNumbers.convert([
|
83
79
|
" _ _ _ _ ",
|
84
80
|
" | || | || | | || || |",
|
85
81
|
" | ||_| ||_| | ||_||_|",
|
86
82
|
" "
|
87
|
-
]
|
88
|
-
)
|
83
|
+
])
|
89
84
|
|
90
85
|
assert number == {:ok, "110101100"}
|
91
86
|
end
|
92
87
|
|
93
88
|
@tag :pending
|
94
89
|
test "Garbled numbers in a string are replaced with ?" do
|
95
|
-
number =
|
96
|
-
[
|
90
|
+
number =
|
91
|
+
OCRNumbers.convert([
|
97
92
|
" _ _ _ ",
|
98
93
|
" | || | || | || || |",
|
99
94
|
" | | _| ||_| | ||_||_|",
|
100
95
|
" "
|
101
|
-
]
|
102
|
-
)
|
96
|
+
])
|
103
97
|
|
104
98
|
assert number == {:ok, "11?10?1?0"}
|
105
99
|
end
|
106
100
|
|
107
101
|
@tag :pending
|
108
102
|
test "Recognizes 2" do
|
109
|
-
number =
|
110
|
-
[
|
103
|
+
number =
|
104
|
+
OCRNumbers.convert([
|
111
105
|
" _ ",
|
112
106
|
" _|",
|
113
107
|
"|_ ",
|
114
108
|
" "
|
115
|
-
]
|
116
|
-
)
|
109
|
+
])
|
117
110
|
|
118
111
|
assert number == {:ok, "2"}
|
119
112
|
end
|
120
113
|
|
121
114
|
@tag :pending
|
122
115
|
test "Recognizes 3" do
|
123
|
-
number =
|
124
|
-
[
|
116
|
+
number =
|
117
|
+
OCRNumbers.convert([
|
125
118
|
" _ ",
|
126
119
|
" _|",
|
127
120
|
" _|",
|
128
121
|
" "
|
129
|
-
]
|
130
|
-
)
|
122
|
+
])
|
131
123
|
|
132
124
|
assert number == {:ok, "3"}
|
133
125
|
end
|
134
126
|
|
135
127
|
@tag :pending
|
136
128
|
test "Recognizes 4" do
|
137
|
-
number =
|
138
|
-
[
|
129
|
+
number =
|
130
|
+
OCRNumbers.convert([
|
139
131
|
" ",
|
140
132
|
"|_|",
|
141
133
|
" |",
|
142
134
|
" "
|
143
|
-
]
|
144
|
-
)
|
135
|
+
])
|
145
136
|
|
146
137
|
assert number == {:ok, "4"}
|
147
138
|
end
|
148
139
|
|
149
140
|
@tag :pending
|
150
141
|
test "Recognizes 5" do
|
151
|
-
number =
|
152
|
-
[
|
142
|
+
number =
|
143
|
+
OCRNumbers.convert([
|
153
144
|
" _ ",
|
154
145
|
"|_ ",
|
155
146
|
" _|",
|
156
147
|
" "
|
157
|
-
]
|
158
|
-
)
|
148
|
+
])
|
159
149
|
|
160
150
|
assert number == {:ok, "5"}
|
161
151
|
end
|
162
152
|
|
163
153
|
@tag :pending
|
164
154
|
test "Recognizes 6" do
|
165
|
-
number =
|
166
|
-
[
|
155
|
+
number =
|
156
|
+
OCRNumbers.convert([
|
167
157
|
" _ ",
|
168
158
|
"|_ ",
|
169
159
|
"|_|",
|
170
160
|
" "
|
171
|
-
]
|
172
|
-
)
|
161
|
+
])
|
173
162
|
|
174
163
|
assert number == {:ok, "6"}
|
175
164
|
end
|
176
165
|
|
177
166
|
@tag :pending
|
178
167
|
test "Regonizes 7" do
|
179
|
-
number =
|
180
|
-
[
|
168
|
+
number =
|
169
|
+
OCRNumbers.convert([
|
181
170
|
" _ ",
|
182
171
|
" |",
|
183
172
|
" |",
|
184
173
|
" "
|
185
|
-
]
|
186
|
-
)
|
174
|
+
])
|
187
175
|
|
188
176
|
assert number == {:ok, "7"}
|
189
177
|
end
|
190
178
|
|
191
179
|
@tag :pending
|
192
180
|
test "Recognizes 8" do
|
193
|
-
number =
|
194
|
-
[
|
181
|
+
number =
|
182
|
+
OCRNumbers.convert([
|
195
183
|
" _ ",
|
196
184
|
"|_|",
|
197
185
|
"|_|",
|
198
186
|
" "
|
199
|
-
]
|
200
|
-
)
|
187
|
+
])
|
201
188
|
|
202
189
|
assert number == {:ok, "8"}
|
203
190
|
end
|
204
191
|
|
205
192
|
@tag :pending
|
206
193
|
test "Recognizes 9" do
|
207
|
-
number =
|
208
|
-
[
|
194
|
+
number =
|
195
|
+
OCRNumbers.convert([
|
209
196
|
" _ ",
|
210
197
|
"|_|",
|
211
198
|
" _|",
|
212
199
|
" "
|
213
|
-
]
|
214
|
-
)
|
200
|
+
])
|
215
201
|
|
216
202
|
assert number == {:ok, "9"}
|
217
203
|
end
|
218
204
|
|
219
205
|
@tag :pending
|
220
206
|
test "Recognizes string of decimal numbers" do
|
221
|
-
number =
|
222
|
-
[
|
207
|
+
number =
|
208
|
+
OCRNumbers.convert([
|
223
209
|
" _ _ _ _ _ _ _ _ ",
|
224
210
|
" | _| _||_||_ |_ ||_||_|| |",
|
225
211
|
" ||_ _| | _||_| ||_| _||_|",
|
226
212
|
" "
|
227
|
-
]
|
228
|
-
)
|
213
|
+
])
|
229
214
|
|
230
215
|
assert number == {:ok, "1234567890"}
|
231
216
|
end
|
232
217
|
|
233
218
|
@tag :pending
|
234
219
|
test "Numbers separated by empty lines are recognized. Lines are joined by commas." do
|
235
|
-
number =
|
236
|
-
[
|
220
|
+
number =
|
221
|
+
OCRNumbers.convert([
|
237
222
|
" _ _ ",
|
238
223
|
" | _| _|",
|
239
224
|
" ||_ _|",
|
@@ -246,8 +231,7 @@ defmodule OCRNumbersTest do
|
|
246
231
|
" ||_||_|",
|
247
232
|
" ||_| _|",
|
248
233
|
" "
|
249
|
-
]
|
250
|
-
)
|
234
|
+
])
|
251
235
|
|
252
236
|
assert number == {:ok, "123,456,789"}
|
253
237
|
end
|