trackler 2.2.1.46 → 2.2.1.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/nucleotide-count/canonical-data.json +7 -7
- data/tracks/c/README.md +1 -1
- data/tracks/c/docs/SNIPPET.txt +2 -3
- data/tracks/c/exercises/acronym/test/test_acronym.c +8 -0
- data/tracks/c/exercises/all-your-base/test/test_all_your_base.c +8 -0
- data/tracks/c/exercises/allergies/test/test_allergies.c +8 -0
- data/tracks/c/exercises/anagram/test/test_anagram.c +8 -0
- data/tracks/c/exercises/atbash-cipher/test/test_atbash_cipher.c +8 -0
- data/tracks/c/exercises/beer-song/src/example.c +23 -22
- data/tracks/c/exercises/beer-song/src/example.h +3 -3
- data/tracks/c/exercises/beer-song/test/test_beer_song.c +8 -0
- data/tracks/c/exercises/binary-search/test/test_binary_search.c +8 -0
- data/tracks/c/exercises/binary/test/test_binary.c +8 -0
- data/tracks/c/exercises/bob/test/test_bob.c +8 -0
- data/tracks/c/exercises/clock/test/test_clock.c +8 -0
- data/tracks/c/exercises/difference-of-squares/test/test_difference_of_squares.c +8 -0
- data/tracks/c/exercises/gigasecond/test/test_gigasecond.c +8 -0
- data/tracks/c/exercises/grains/test/test_grains.c +8 -0
- data/tracks/c/exercises/hamming/test/test_hamming.c +8 -0
- data/tracks/c/exercises/hello-world/src/example.c +0 -2
- data/tracks/c/exercises/hello-world/test/test_hello_world.c +8 -0
- data/tracks/c/exercises/isogram/test/test_isogram.c +8 -0
- data/tracks/c/exercises/largest-series-product/test/test_largest_series_product.c +8 -0
- data/tracks/c/exercises/leap/test/test_leap.c +8 -0
- data/tracks/c/exercises/meetup/test/test_meetup.c +8 -0
- data/tracks/c/exercises/nth-prime/test/test_nth_prime.c +8 -0
- data/tracks/c/exercises/nucleotide-count/test/test_nucleotide_count.c +8 -0
- data/tracks/c/exercises/palindrome-products/test/test_palindrome_products.c +8 -0
- data/tracks/c/exercises/pangram/test/test_pangram.c +8 -0
- data/tracks/c/exercises/pascals-triangle/test/test_pascals_triangle.c +8 -0
- data/tracks/c/exercises/perfect-numbers/src/example.c +4 -4
- data/tracks/c/exercises/perfect-numbers/src/example.h +4 -4
- data/tracks/c/exercises/perfect-numbers/src/perfect_numbers.h +4 -4
- data/tracks/c/exercises/perfect-numbers/test/test_perfect_numbers.c +23 -13
- data/tracks/c/exercises/phone-number/test/test_phone_number.c +8 -0
- data/tracks/c/exercises/raindrops/test/test_raindrops.c +5 -1
- data/tracks/c/exercises/react/src/example.c +8 -8
- data/tracks/c/exercises/react/test/test_react.c +8 -0
- data/tracks/c/exercises/rna-transcription/test/test_rna_transcription.c +8 -0
- data/tracks/c/exercises/robot-simulator/src/example.c +12 -12
- data/tracks/c/exercises/robot-simulator/src/robot_simulator.h +11 -11
- data/tracks/c/exercises/robot-simulator/test/test_robot_simulator.c +33 -25
- data/tracks/c/exercises/roman-numerals/test/test_roman_numerals.c +8 -0
- data/tracks/c/exercises/scrabble-score/test/test_scrabble_score.c +8 -0
- data/tracks/c/exercises/series/test/test_series.c +8 -0
- data/tracks/c/exercises/sieve/test/test_sieve.c +8 -0
- data/tracks/c/exercises/space-age/src/example.h +8 -8
- data/tracks/c/exercises/space-age/test/test_space_age.c +16 -8
- data/tracks/c/exercises/sum-of-multiples/test/test_sum_of_multiples.c +8 -0
- data/tracks/c/exercises/triangle/test/test_triangle.c +8 -0
- data/tracks/c/exercises/word-count/test/test_word_count.c +8 -0
- data/tracks/cfml/config.json +8 -0
- data/tracks/cfml/exercises/anagram/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/anagram/Anagram.cfc +13 -0
- data/tracks/cfml/exercises/anagram/AnagramTest.cfc +79 -0
- data/tracks/cfml/exercises/anagram/README.md +29 -0
- data/tracks/cfml/exercises/anagram/Solution.cfc +42 -0
- data/tracks/cfml/exercises/anagram/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/anagram/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/anagram/box.json +8 -0
- data/tracks/cfml/exercises/anagram/index.cfm +37 -0
- data/tracks/common-lisp/config.json +5 -5
- data/tracks/csharp/exercises/two-bucket/Example.cs +53 -79
- data/tracks/csharp/exercises/two-bucket/TwoBucketTest.cs +2 -2
- data/tracks/csharp/generators/Exercises/QueenAttack.cs +3 -3
- data/tracks/dart/exercises/leap/test/leap_test.dart +1 -1
- data/tracks/delphi/exercises/hamming/uHammingTests.pas +2 -2
- data/tracks/delphi/exercises/leap/uLeapTests.pas +11 -38
- data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountExample.pas +1 -1
- data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +31 -55
- data/tracks/ecmascript/config.json +31 -0
- data/tracks/ecmascript/config/maintainers.json +5 -5
- data/tracks/ecmascript/exercises/accumulate/package.json +1 -1
- data/tracks/ecmascript/exercises/acronym/package.json +1 -1
- data/tracks/ecmascript/exercises/all-your-base/package.json +1 -1
- data/tracks/ecmascript/exercises/allergies/package.json +1 -1
- data/tracks/ecmascript/exercises/alphametics/package.json +1 -1
- data/tracks/ecmascript/exercises/anagram/package.json +1 -1
- data/tracks/ecmascript/exercises/atbash-cipher/package.json +1 -1
- data/tracks/ecmascript/exercises/beer-song/package.json +1 -1
- data/tracks/ecmascript/exercises/binary-search-tree/package.json +1 -1
- data/tracks/ecmascript/exercises/binary-search/package.json +1 -1
- data/tracks/ecmascript/exercises/binary/package.json +1 -1
- data/tracks/ecmascript/exercises/bob/package.json +1 -1
- data/tracks/ecmascript/exercises/bracket-push/package.json +1 -1
- data/tracks/ecmascript/exercises/circular-buffer/package.json +1 -1
- data/tracks/ecmascript/exercises/clock/package.json +1 -1
- data/tracks/ecmascript/exercises/collatz-conjecture/README.md +59 -0
- data/tracks/ecmascript/exercises/collatz-conjecture/collatz-conjecture.spec.js +31 -0
- data/tracks/ecmascript/exercises/collatz-conjecture/example.js +14 -0
- data/tracks/ecmascript/exercises/collatz-conjecture/package.json +69 -0
- data/tracks/ecmascript/exercises/connect/package.json +1 -1
- data/tracks/ecmascript/exercises/crypto-square/package.json +1 -1
- data/tracks/ecmascript/exercises/custom-set/package.json +1 -1
- data/tracks/ecmascript/exercises/diamond/package.json +1 -1
- data/tracks/ecmascript/exercises/difference-of-squares/package.json +1 -1
- data/tracks/ecmascript/exercises/diffie-hellman/package.json +1 -1
- data/tracks/ecmascript/exercises/etl/package.json +1 -1
- data/tracks/ecmascript/exercises/flatten-array/package.json +1 -1
- data/tracks/ecmascript/exercises/food-chain/package.json +1 -1
- data/tracks/ecmascript/exercises/gigasecond/package.json +1 -1
- data/tracks/ecmascript/exercises/grade-school/package.json +1 -1
- data/tracks/ecmascript/exercises/grains/package.json +1 -1
- data/tracks/ecmascript/exercises/hamming/package.json +1 -1
- data/tracks/ecmascript/exercises/hello-world/package.json +1 -1
- data/tracks/ecmascript/exercises/hexadecimal/package.json +1 -1
- data/tracks/ecmascript/exercises/isogram/package.json +1 -1
- data/tracks/ecmascript/exercises/kindergarten-garden/package.json +1 -1
- data/tracks/ecmascript/exercises/largest-series-product/package.json +1 -1
- data/tracks/ecmascript/exercises/leap/package.json +1 -1
- data/tracks/ecmascript/exercises/linked-list/package.json +1 -1
- data/tracks/ecmascript/exercises/list-ops/package.json +1 -1
- data/tracks/ecmascript/exercises/luhn/package.json +1 -1
- data/tracks/ecmascript/exercises/matrix/package.json +1 -1
- data/tracks/ecmascript/exercises/meetup/package.json +1 -1
- data/tracks/ecmascript/exercises/minesweeper/package.json +1 -1
- data/tracks/ecmascript/exercises/nth-prime/package.json +1 -1
- data/tracks/ecmascript/exercises/ocr-numbers/package.json +1 -1
- data/tracks/ecmascript/exercises/octal/package.json +1 -1
- data/tracks/ecmascript/exercises/palindrome-products/package.json +1 -1
- data/tracks/ecmascript/exercises/pangram/package.json +1 -1
- data/tracks/ecmascript/exercises/pascals-triangle/package.json +1 -1
- data/tracks/ecmascript/exercises/perfect-numbers/package.json +1 -1
- data/tracks/ecmascript/exercises/phone-number/package.json +1 -1
- data/tracks/ecmascript/exercises/pig-latin/package.json +1 -1
- data/tracks/ecmascript/exercises/prime-factors/package.json +1 -1
- data/tracks/ecmascript/exercises/proverb/package.json +1 -1
- data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +1 -1
- data/tracks/ecmascript/exercises/queen-attack/package.json +1 -1
- data/tracks/ecmascript/exercises/raindrops/package.json +1 -1
- data/tracks/ecmascript/exercises/rna-transcription/package.json +1 -1
- data/tracks/ecmascript/exercises/robot-name/package.json +1 -1
- data/tracks/ecmascript/exercises/robot-simulator/package.json +1 -1
- data/tracks/ecmascript/exercises/roman-numerals/package.json +1 -1
- data/tracks/ecmascript/exercises/run-length-encoding/package.json +1 -1
- data/tracks/ecmascript/exercises/saddle-points/package.json +1 -1
- data/tracks/ecmascript/exercises/say/package.json +1 -1
- data/tracks/ecmascript/exercises/scrabble-score/package.json +1 -1
- data/tracks/ecmascript/exercises/secret-handshake/package.json +1 -1
- data/tracks/ecmascript/exercises/series/package.json +1 -1
- data/tracks/ecmascript/exercises/sieve/package.json +1 -1
- data/tracks/ecmascript/exercises/simple-cipher/package.json +1 -1
- data/tracks/ecmascript/exercises/simple-linked-list/package.json +1 -1
- data/tracks/ecmascript/exercises/space-age/package.json +1 -1
- data/tracks/ecmascript/exercises/strain/package.json +1 -1
- data/tracks/ecmascript/exercises/sublist/package.json +1 -1
- data/tracks/ecmascript/exercises/sum-of-multiples/package.json +1 -1
- data/tracks/ecmascript/exercises/triangle/package.json +1 -1
- data/tracks/ecmascript/exercises/trinary/package.json +1 -1
- data/tracks/ecmascript/exercises/twelve-days/package.json +1 -1
- data/tracks/ecmascript/exercises/two-bucket/package.json +1 -1
- data/tracks/ecmascript/exercises/word-count/package.json +1 -1
- data/tracks/ecmascript/exercises/word-search/README.md +58 -0
- data/tracks/ecmascript/exercises/word-search/example.js +146 -0
- data/tracks/ecmascript/exercises/word-search/package.json +69 -0
- data/tracks/ecmascript/exercises/word-search/word-search.spec.js +626 -0
- data/tracks/ecmascript/exercises/wordy/package.json +1 -1
- data/tracks/ecmascript/package.json +1 -1
- data/tracks/elixir/config.json +11 -0
- data/tracks/elixir/exercises/luhn/example.exs +26 -46
- data/tracks/elixir/exercises/luhn/luhn.exs +0 -13
- data/tracks/elixir/exercises/luhn/luhn_test.exs +44 -14
- data/tracks/elixir/exercises/transpose/README.md +101 -0
- data/tracks/elixir/exercises/transpose/example.exs +46 -0
- data/tracks/elixir/exercises/transpose/transpose.exs +22 -0
- data/tracks/elixir/exercises/transpose/transpose_test.exs +248 -0
- data/tracks/fsharp/exercises/grains/Example.fs +10 -2
- data/tracks/fsharp/exercises/grains/Grains.fs +2 -4
- data/tracks/fsharp/exercises/grains/GrainsTest.fs +52 -25
- data/tracks/fsharp/exercises/phone-number/Example.fs +11 -3
- data/tracks/fsharp/exercises/phone-number/PhoneNumber.fs +1 -1
- data/tracks/fsharp/exercises/phone-number/PhoneNumberTest.fs +32 -21
- data/tracks/fsharp/exercises/prime-factors/Example.fs +6 -13
- data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fs +1 -1
- data/tracks/fsharp/exercises/prime-factors/PrimeFactorsTest.fs +23 -32
- data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipherTest.fs +22 -13
- data/tracks/fsharp/generators/Exercise.fs +3 -4
- data/tracks/fsharp/generators/Generators.fs +31 -0
- data/tracks/gnu-apl/bin/run-all-tests +5 -2
- data/tracks/java/CONTRIBUTING.md +8 -0
- data/tracks/java/POLICIES.md +2 -2
- data/tracks/java/config.json +26 -4
- data/tracks/java/exercises/triangle/.meta/.version +1 -0
- data/tracks/java/exercises/triangle/.meta/src/reference/java/Triangle.java +1 -1
- data/tracks/java/exercises/triangle/src/test/java/TriangleTest.java +59 -40
- data/tracks/javascript/config.json +30 -0
- data/tracks/javascript/config/maintainers.json +8 -8
- data/tracks/javascript/exercises/change/example.js +6 -22
- data/tracks/javascript/exercises/collatz-conjecture/README.md +57 -0
- data/tracks/javascript/exercises/collatz-conjecture/collatz-conjecture.spec.js +37 -0
- data/tracks/javascript/exercises/collatz-conjecture/example.js +20 -0
- data/tracks/javascript/exercises/protein-translation/example.js +30 -31
- data/tracks/javascript/exercises/protein-translation/protein-translation.spec.js +60 -60
- data/tracks/javascript/exercises/transpose/README.md +89 -0
- data/tracks/javascript/exercises/transpose/example.js +17 -0
- data/tracks/javascript/exercises/transpose/transpose.spec.js +67 -0
- data/tracks/objective-c/config.json +283 -263
- data/tracks/objective-c/exercises/grains/GrainsExample.h +6 -0
- data/tracks/objective-c/exercises/grains/GrainsExample.m +19 -0
- data/tracks/objective-c/exercises/grains/GrainsTest.m +85 -0
- data/tracks/objective-c/exercises/nth-prime/NthPrimeExample.h +6 -0
- data/tracks/objective-c/exercises/nth-prime/NthPrimeExample.m +39 -0
- data/tracks/objective-c/exercises/nth-prime/NthPrimeTest.m +53 -0
- data/tracks/python/config.json +42 -11
- data/tracks/python/exercises/change/README.md +34 -0
- data/tracks/python/exercises/two-bucket/README.md +47 -0
- data/tracks/ruby/README.md +4 -1
- data/tracks/ruby/lib/generator/command_line.rb +3 -3
- data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +3 -3
- data/tracks/ruby/test/generator/command_line/generator_optparser_test.rb +4 -4
- data/tracks/ruby/test/generator/command_line_test.rb +5 -5
- data/tracks/typescript/config.json +15 -0
- data/tracks/typescript/exercises/strain/README.md +60 -0
- data/tracks/typescript/exercises/strain/package.json +36 -0
- data/tracks/typescript/exercises/strain/strain.example.ts +23 -0
- data/tracks/typescript/exercises/strain/strain.test.ts +76 -0
- data/tracks/typescript/exercises/strain/strain.ts +0 -0
- data/tracks/typescript/exercises/strain/tsconfig.json +22 -0
- data/tracks/typescript/exercises/strain/tslint.json +127 -0
- data/tracks/typescript/exercises/strain/yarn.lock +2305 -0
- metadata +46 -3
- data/tracks/ecmascript/package-lock.json +0 -2835
data/tracks/elixir/config.json
CHANGED
@@ -889,6 +889,17 @@
|
|
889
889
|
"Algorithms",
|
890
890
|
"Sorting"
|
891
891
|
]
|
892
|
+
},
|
893
|
+
{
|
894
|
+
"uuid": "ce270a34-add1-422c-bb86-53b310f05e27",
|
895
|
+
"slug": "transpose",
|
896
|
+
"core": false,
|
897
|
+
"unlocked_by": null,
|
898
|
+
"difficulty": 5,
|
899
|
+
"topics": [
|
900
|
+
"Strings",
|
901
|
+
"Transforming"
|
902
|
+
]
|
892
903
|
}
|
893
904
|
],
|
894
905
|
"foregone": [
|
@@ -1,59 +1,39 @@
|
|
1
1
|
defmodule Luhn do
|
2
|
-
@doc """
|
3
|
-
Calculates the total checksum of a number
|
4
|
-
"""
|
5
|
-
@spec checksum(String.t()) :: integer
|
6
|
-
def checksum(number) do
|
7
|
-
number
|
8
|
-
|> String.reverse
|
9
|
-
|> String.graphemes
|
10
|
-
|> Enum.with_index
|
11
|
-
|> Enum.map(&do_checksum/1)
|
12
|
-
|> Enum.sum
|
13
|
-
end
|
14
|
-
|
15
|
-
defp do_checksum({digit, index}) do
|
16
|
-
digit
|
17
|
-
|> String.to_integer
|
18
|
-
|> double_if_even_index(index)
|
19
|
-
|> compact
|
20
|
-
end
|
21
|
-
|
22
|
-
defp compact(num) when num < 10, do: num
|
23
|
-
defp compact(num) do
|
24
|
-
num
|
25
|
-
|> Integer.digits
|
26
|
-
|> Enum.sum
|
27
|
-
|> compact
|
28
|
-
end
|
29
2
|
|
30
3
|
@doc """
|
31
4
|
Checks if the given number is valid via the luhn formula
|
32
5
|
"""
|
33
6
|
@spec valid?(String.t()) :: boolean
|
34
7
|
def valid?(number) do
|
35
|
-
number
|
8
|
+
number_without_spaces = String.replace(number, " ", "")
|
9
|
+
case Integer.parse(number_without_spaces) do
|
10
|
+
{_, ""} ->
|
11
|
+
String.length(number_without_spaces) > 1 && checksum(number_without_spaces)
|
12
|
+
_ ->
|
13
|
+
false
|
14
|
+
end
|
36
15
|
end
|
37
16
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
number <> do_create(number)
|
45
|
-
end
|
46
|
-
|
47
|
-
defp do_create(number) do
|
48
|
-
number <> "0"
|
49
|
-
|> checksum
|
17
|
+
defp checksum(number) do
|
18
|
+
0 == number
|
19
|
+
|> String.graphemes()
|
20
|
+
|> Enum.map(&String.to_integer/1)
|
21
|
+
|> double_even()
|
22
|
+
|> Enum.sum()
|
50
23
|
|> rem(10)
|
51
|
-
|> (&(10 - &1)).()
|
52
|
-
|> to_string
|
53
|
-
|> String.last
|
54
24
|
end
|
55
25
|
|
56
|
-
defp
|
57
|
-
|
26
|
+
defp double_even(numlist) do
|
27
|
+
numlist
|
28
|
+
|> Enum.reverse()
|
29
|
+
|> Enum.zip(Stream.cycle([1,2]))
|
30
|
+
|> Enum.map(fn {n,m} -> n * m end)
|
31
|
+
|> Enum.map(
|
32
|
+
fn
|
33
|
+
n when n > 9 -> n-9
|
34
|
+
n -> n
|
35
|
+
end)
|
36
|
+
|
58
37
|
end
|
59
|
-
|
38
|
+
|
39
|
+
end
|
@@ -1,10 +1,4 @@
|
|
1
1
|
defmodule Luhn do
|
2
|
-
@doc """
|
3
|
-
Calculates the total checksum of a number
|
4
|
-
"""
|
5
|
-
@spec checksum(String.t()) :: integer
|
6
|
-
def checksum(number) do
|
7
|
-
end
|
8
2
|
|
9
3
|
@doc """
|
10
4
|
Checks if the given number is valid via the luhn formula
|
@@ -13,11 +7,4 @@ defmodule Luhn do
|
|
13
7
|
def valid?(number) do
|
14
8
|
end
|
15
9
|
|
16
|
-
@doc """
|
17
|
-
Creates a valid number by adding the correct
|
18
|
-
checksum digit to the end of the number
|
19
|
-
"""
|
20
|
-
@spec create(String.t()) :: String.t()
|
21
|
-
def create(number) do
|
22
|
-
end
|
23
10
|
end
|
@@ -8,37 +8,67 @@ ExUnit.configure exclude: :pending, trace: true
|
|
8
8
|
defmodule LuhnTest do
|
9
9
|
use ExUnit.Case
|
10
10
|
|
11
|
-
test "
|
12
|
-
|
11
|
+
test "single digit strings can not be valid" do
|
12
|
+
refute Luhn.valid?("1")
|
13
13
|
end
|
14
14
|
|
15
15
|
@tag :pending
|
16
|
-
test "
|
17
|
-
|
16
|
+
test "A single zero is invalid" do
|
17
|
+
refute Luhn.valid?("0")
|
18
18
|
end
|
19
19
|
|
20
20
|
@tag :pending
|
21
|
-
test "
|
22
|
-
assert Luhn.valid?("
|
21
|
+
test "a simple valid SIN that remains valid if reversed" do
|
22
|
+
assert Luhn.valid?("059")
|
23
23
|
end
|
24
24
|
|
25
25
|
@tag :pending
|
26
|
-
test "valid
|
27
|
-
assert Luhn.valid?("
|
26
|
+
test "a simple valid SIN that becomes invalid if reversed" do
|
27
|
+
assert Luhn.valid?("59")
|
28
28
|
end
|
29
29
|
|
30
30
|
@tag :pending
|
31
|
-
test "
|
32
|
-
assert Luhn.
|
31
|
+
test "a valid Canadian SIN" do
|
32
|
+
assert Luhn.valid?("055 444 285")
|
33
33
|
end
|
34
34
|
|
35
35
|
@tag :pending
|
36
|
-
test "
|
37
|
-
|
36
|
+
test "invalid Canadian SIN" do
|
37
|
+
refute Luhn.valid?("055 444 286")
|
38
38
|
end
|
39
39
|
|
40
40
|
@tag :pending
|
41
|
-
test "
|
42
|
-
|
41
|
+
test "invalid credit card" do
|
42
|
+
refute Luhn.valid?("8273 1232 7352 0569")
|
43
|
+
end
|
44
|
+
|
45
|
+
@tag :pending
|
46
|
+
test "valid strings with a non-digit included become invalid" do
|
47
|
+
refute Luhn.valid?("055a 444 285")
|
48
|
+
end
|
49
|
+
|
50
|
+
@tag :pending
|
51
|
+
test "valid strings with punctuation included become invalid" do
|
52
|
+
refute Luhn.valid?("055-444-285")
|
53
|
+
end
|
54
|
+
|
55
|
+
@tag :pending
|
56
|
+
test "valid strings with symbols included become invalid" do
|
57
|
+
refute Luhn.valid?("055£ 444$ 285")
|
58
|
+
end
|
59
|
+
|
60
|
+
@tag :pending
|
61
|
+
test "single zero with space is invalid" do
|
62
|
+
refute Luhn.valid?(" 0")
|
63
|
+
end
|
64
|
+
|
65
|
+
@tag :pending
|
66
|
+
test "more than a single zero is valid" do
|
67
|
+
assert Luhn.valid?("0000 0")
|
68
|
+
end
|
69
|
+
|
70
|
+
@tag :pending
|
71
|
+
test "input digit 9 is correctly converted to output digit 9" do
|
72
|
+
assert Luhn.valid?("091")
|
43
73
|
end
|
44
74
|
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# Transpose
|
2
|
+
|
3
|
+
Given an input text output it transposed.
|
4
|
+
|
5
|
+
Roughly explained, the transpose of a matrix:
|
6
|
+
|
7
|
+
```text
|
8
|
+
ABC
|
9
|
+
DEF
|
10
|
+
```
|
11
|
+
|
12
|
+
is given by:
|
13
|
+
|
14
|
+
```text
|
15
|
+
AD
|
16
|
+
BE
|
17
|
+
CF
|
18
|
+
```
|
19
|
+
|
20
|
+
Rows become columns and columns become rows. See <https://en.wikipedia.org/wiki/Transpose>.
|
21
|
+
|
22
|
+
If the input has rows of different lengths, this is to be solved as follows:
|
23
|
+
|
24
|
+
- Pad to the left with spaces.
|
25
|
+
- Don't pad to the right.
|
26
|
+
|
27
|
+
Therefore, transposing this matrix:
|
28
|
+
|
29
|
+
```text
|
30
|
+
ABC
|
31
|
+
DE
|
32
|
+
```
|
33
|
+
|
34
|
+
results in:
|
35
|
+
|
36
|
+
```text
|
37
|
+
AD
|
38
|
+
BE
|
39
|
+
C
|
40
|
+
```
|
41
|
+
|
42
|
+
And transposing:
|
43
|
+
|
44
|
+
```text
|
45
|
+
AB
|
46
|
+
DEF
|
47
|
+
```
|
48
|
+
|
49
|
+
results in:
|
50
|
+
|
51
|
+
```text
|
52
|
+
AD
|
53
|
+
BE
|
54
|
+
F
|
55
|
+
```
|
56
|
+
|
57
|
+
In general, all characters from the input should also be present in the transposed output.
|
58
|
+
That means that if a column in the input text contains only spaces on its bottom-most row(s),
|
59
|
+
the corresponding output row should contain the spaces in its right-most column(s).
|
60
|
+
|
61
|
+
## Running tests
|
62
|
+
|
63
|
+
Execute the tests with:
|
64
|
+
|
65
|
+
```bash
|
66
|
+
$ elixir transpose_test.exs
|
67
|
+
```
|
68
|
+
|
69
|
+
### Pending tests
|
70
|
+
|
71
|
+
In the test suites, all but the first test have been skipped.
|
72
|
+
|
73
|
+
Once you get a test passing, you can unskip the next one by
|
74
|
+
commenting out the relevant `@tag :pending` with a `#` symbol.
|
75
|
+
|
76
|
+
For example:
|
77
|
+
|
78
|
+
```elixir
|
79
|
+
# @tag :pending
|
80
|
+
test "two characters in a row" do
|
81
|
+
input= "AB"
|
82
|
+
expected =
|
83
|
+
"A\n" <>
|
84
|
+
"B"
|
85
|
+
|
86
|
+
assert Transpose.transpose(input) == expected
|
87
|
+
end
|
88
|
+
```
|
89
|
+
|
90
|
+
Or, you can enable all the tests by commenting out the
|
91
|
+
`ExUnit.configure` line in the test suite.
|
92
|
+
|
93
|
+
```elixir
|
94
|
+
# ExUnit.configure exclude: :pending, trace: true
|
95
|
+
```
|
96
|
+
|
97
|
+
For more detailed information about the Elixir track, please
|
98
|
+
see the [help page](http://exercism.io/languages/elixir).
|
99
|
+
|
100
|
+
## Submitting Incomplete Solutions
|
101
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
@@ -0,0 +1,46 @@
|
|
1
|
+
defmodule Transpose do
|
2
|
+
@doc """
|
3
|
+
Given an input text, output it transposed.
|
4
|
+
|
5
|
+
Rows become columns and columns become rows. See https://en.wikipedia.org/wiki/Transpose.
|
6
|
+
|
7
|
+
If the input has rows of different lengths, this is to be solved as follows:
|
8
|
+
* Pad to the left with spaces.
|
9
|
+
* Don't pad to the right.
|
10
|
+
|
11
|
+
## Examples
|
12
|
+
iex> Transpose.transpose("ABC\nDE")
|
13
|
+
"AD\nBE\nC"
|
14
|
+
|
15
|
+
iex> Transpose.transpose("AB\nDEF")
|
16
|
+
"AD\nBE\n F"
|
17
|
+
"""
|
18
|
+
|
19
|
+
@spec transpose(String.t) :: String.t
|
20
|
+
def transpose(matrix) do
|
21
|
+
rows = String.split(matrix, "\n")
|
22
|
+
|
23
|
+
max_length = get_longest_row_length(rows)
|
24
|
+
|
25
|
+
rows
|
26
|
+
|> Enum.map(fn x -> get_padded_row(x, max_length) end)
|
27
|
+
|> Enum.map(fn x -> String.to_charlist(x) end)
|
28
|
+
|> List.zip
|
29
|
+
|> Enum.map(fn x -> Tuple.to_list(x) end)
|
30
|
+
|> Enum.map(fn x -> List.to_string(x) end)
|
31
|
+
|> Enum.map(fn x -> String.replace(x, "*", " ") end)
|
32
|
+
|> Enum.join("\n")
|
33
|
+
|> String.trim_trailing
|
34
|
+
end
|
35
|
+
|
36
|
+
defp get_longest_row_length(rows) do
|
37
|
+
rows
|
38
|
+
|> Enum.map(fn row -> String.length(row) end)
|
39
|
+
|> Enum.max
|
40
|
+
end
|
41
|
+
|
42
|
+
defp get_padded_row(row, max_length) do
|
43
|
+
padding = String.duplicate("*", max_length - String.length(row))
|
44
|
+
row <> padding
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
defmodule Transpose do
|
2
|
+
@doc """
|
3
|
+
Given an input text, output it transposed.
|
4
|
+
|
5
|
+
Rows become columns and columns become rows. See https://en.wikipedia.org/wiki/Transpose.
|
6
|
+
|
7
|
+
If the input has rows of different lengths, this is to be solved as follows:
|
8
|
+
* Pad to the left with spaces.
|
9
|
+
* Don't pad to the right.
|
10
|
+
|
11
|
+
## Examples
|
12
|
+
iex> Transpose.transpose("ABC\nDE")
|
13
|
+
"AD\nBE\nC"
|
14
|
+
|
15
|
+
iex> Transpose.transpose("AB\nDEF")
|
16
|
+
"AD\nBE\n F"
|
17
|
+
"""
|
18
|
+
|
19
|
+
@spec transpose(String.t) :: String.t
|
20
|
+
def transpose(input) do
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,248 @@
|
|
1
|
+
if !System.get_env("EXERCISM_TEST_EXAMPLES") do
|
2
|
+
Code.load_file("transpose.exs", __DIR__)
|
3
|
+
end
|
4
|
+
|
5
|
+
ExUnit.start
|
6
|
+
ExUnit.configure exclude: :pending, trace: true
|
7
|
+
|
8
|
+
defmodule TransposeTest do
|
9
|
+
use ExUnit.Case
|
10
|
+
|
11
|
+
test "empty string" do
|
12
|
+
input = ""
|
13
|
+
expected = ""
|
14
|
+
|
15
|
+
assert Transpose.transpose(input) == expected
|
16
|
+
end
|
17
|
+
|
18
|
+
@tag :pending
|
19
|
+
test "two characters in a row" do
|
20
|
+
input= "AB"
|
21
|
+
expected =
|
22
|
+
"A\n" <>
|
23
|
+
"B"
|
24
|
+
|
25
|
+
assert Transpose.transpose(input) == expected
|
26
|
+
end
|
27
|
+
|
28
|
+
@tag :pending
|
29
|
+
test "two characters in one column" do
|
30
|
+
input=
|
31
|
+
"A\n" <>
|
32
|
+
"B"
|
33
|
+
|
34
|
+
expected = "AB"
|
35
|
+
|
36
|
+
assert Transpose.transpose(input) == expected
|
37
|
+
end
|
38
|
+
|
39
|
+
@tag :pending
|
40
|
+
test "single line" do
|
41
|
+
input = "Single line."
|
42
|
+
|
43
|
+
expected =
|
44
|
+
"S\n" <>
|
45
|
+
"i\n" <>
|
46
|
+
"n\n" <>
|
47
|
+
"g\n" <>
|
48
|
+
"l\n" <>
|
49
|
+
"e\n" <>
|
50
|
+
" \n" <>
|
51
|
+
"l\n" <>
|
52
|
+
"i\n" <>
|
53
|
+
"n\n" <>
|
54
|
+
"e\n" <>
|
55
|
+
"."
|
56
|
+
|
57
|
+
assert Transpose.transpose(input) == expected
|
58
|
+
end
|
59
|
+
|
60
|
+
@tag :pending
|
61
|
+
test "first line longer than second line" do
|
62
|
+
input = "The fourth line.\n" <>
|
63
|
+
"The fifth line."
|
64
|
+
|
65
|
+
expected =
|
66
|
+
"TT\n" <>
|
67
|
+
"hh\n" <>
|
68
|
+
"ee\n" <>
|
69
|
+
" \n" <>
|
70
|
+
"ff\n" <>
|
71
|
+
"oi\n" <>
|
72
|
+
"uf\n" <>
|
73
|
+
"rt\n" <>
|
74
|
+
"th\n" <>
|
75
|
+
"h \n" <>
|
76
|
+
" l\n" <>
|
77
|
+
"li\n" <>
|
78
|
+
"in\n" <>
|
79
|
+
"ne\n" <>
|
80
|
+
"e.\n" <>
|
81
|
+
"."
|
82
|
+
|
83
|
+
assert Transpose.transpose(input) == expected
|
84
|
+
end
|
85
|
+
|
86
|
+
@tag :pending
|
87
|
+
test "second line longer than first line" do
|
88
|
+
input = "The first line.\n" <>
|
89
|
+
"The second line."
|
90
|
+
|
91
|
+
expected =
|
92
|
+
"TT\n" <>
|
93
|
+
"hh\n" <>
|
94
|
+
"ee\n" <>
|
95
|
+
" \n" <>
|
96
|
+
"fs\n" <>
|
97
|
+
"ie\n" <>
|
98
|
+
"rc\n" <>
|
99
|
+
"so\n" <>
|
100
|
+
"tn\n" <>
|
101
|
+
" d\n" <>
|
102
|
+
"l \n" <>
|
103
|
+
"il\n" <>
|
104
|
+
"ni\n" <>
|
105
|
+
"en\n" <>
|
106
|
+
".e\n" <>
|
107
|
+
" ."
|
108
|
+
|
109
|
+
assert Transpose.transpose(input) == expected
|
110
|
+
end
|
111
|
+
|
112
|
+
@tag :pending
|
113
|
+
test "square" do
|
114
|
+
matrix =
|
115
|
+
"HEART\n" <>
|
116
|
+
"EMBER\n" <>
|
117
|
+
"ABUSE\n" <>
|
118
|
+
"RESIN\n" <>
|
119
|
+
"TREND"
|
120
|
+
|
121
|
+
expected =
|
122
|
+
"HEART\n" <>
|
123
|
+
"EMBER\n" <>
|
124
|
+
"ABUSE\n" <>
|
125
|
+
"RESIN\n" <>
|
126
|
+
"TREND"
|
127
|
+
|
128
|
+
assert Transpose.transpose(matrix) == expected
|
129
|
+
end
|
130
|
+
|
131
|
+
@tag :pending
|
132
|
+
test "rectangle" do
|
133
|
+
matrix =
|
134
|
+
"FRACTURE\n" <>
|
135
|
+
"OUTLINED\n" <>
|
136
|
+
"BLOOMING\n" <>
|
137
|
+
"SEPTETTE"
|
138
|
+
|
139
|
+
expected =
|
140
|
+
"FOBS\n" <>
|
141
|
+
"RULE\n" <>
|
142
|
+
"ATOP\n" <>
|
143
|
+
"CLOT\n" <>
|
144
|
+
"TIME\n" <>
|
145
|
+
"UNIT\n" <>
|
146
|
+
"RENT\n" <>
|
147
|
+
"EDGE"
|
148
|
+
|
149
|
+
assert Transpose.transpose(matrix) == expected
|
150
|
+
end
|
151
|
+
|
152
|
+
@tag :pending
|
153
|
+
test "triangle" do
|
154
|
+
matrix =
|
155
|
+
"T\n" <>
|
156
|
+
"EE\n" <>
|
157
|
+
"AAA\n" <>
|
158
|
+
"SSSS\n" <>
|
159
|
+
"EEEEE\n" <>
|
160
|
+
"RRRRRR"
|
161
|
+
|
162
|
+
expected =
|
163
|
+
"TEASER\n" <>
|
164
|
+
" EASER\n" <>
|
165
|
+
" ASER\n" <>
|
166
|
+
" SER\n" <>
|
167
|
+
" ER\n" <>
|
168
|
+
" R"
|
169
|
+
|
170
|
+
assert Transpose.transpose(matrix) == expected
|
171
|
+
end
|
172
|
+
|
173
|
+
@tag :pending
|
174
|
+
test "many lines" do
|
175
|
+
matrix =
|
176
|
+
"Chor. Two households, both alike in dignity,\n" <>
|
177
|
+
"In fair Verona, where we lay our scene,\n" <>
|
178
|
+
"From ancient grudge break to new mutiny,\n" <>
|
179
|
+
"Where civil blood makes civil hands unclean.\n" <>
|
180
|
+
"From forth the fatal loins of these two foes\n" <>
|
181
|
+
"A pair of star-cross'd lovers take their life;\n" <>
|
182
|
+
"Whose misadventur'd piteous overthrows\n" <>
|
183
|
+
"Doth with their death bury their parents' strife.\n" <>
|
184
|
+
"The fearful passage of their death-mark'd love,\n" <>
|
185
|
+
"And the continuance of their parents' rage,\n" <>
|
186
|
+
"Which, but their children's end, naught could remove,\n" <>
|
187
|
+
"Is now the two hours' traffic of our stage;\n" <>
|
188
|
+
"The which if you with patient ears attend,\n" <>
|
189
|
+
"What here shall miss, our toil shall strive to mend."
|
190
|
+
|
191
|
+
expected =
|
192
|
+
"CIFWFAWDTAWITW\n" <>
|
193
|
+
"hnrhr hohnhshh\n" <>
|
194
|
+
"o oeopotedi ea\n" <>
|
195
|
+
"rfmrmash cn t\n" <>
|
196
|
+
".a e ie fthow \n" <>
|
197
|
+
" ia fr weh,whh\n" <>
|
198
|
+
"Trnco miae ie\n" <>
|
199
|
+
"w ciroitr btcr\n" <>
|
200
|
+
"oVivtfshfcuhhe\n" <>
|
201
|
+
" eeih a uote \n" <>
|
202
|
+
"hrnl sdtln is\n" <>
|
203
|
+
"oot ttvh tttfh\n" <>
|
204
|
+
"un bhaeepihw a\n" <>
|
205
|
+
"saglernianeoyl\n" <>
|
206
|
+
"e,ro -trsui ol\n" <>
|
207
|
+
"h uofcu sarhu \n" <>
|
208
|
+
"owddarrdan o m\n" <>
|
209
|
+
"lhg to'egccuwi\n" <>
|
210
|
+
"deemasdaeehris\n" <>
|
211
|
+
"sr als t ists\n" <>
|
212
|
+
",ebk 'phool'h,\n" <>
|
213
|
+
" reldi ffd \n" <>
|
214
|
+
"bweso tb rtpo\n" <>
|
215
|
+
"oea ileutterau\n" <>
|
216
|
+
"t kcnoorhhnatr\n" <>
|
217
|
+
"hl isvuyee'fi \n" <>
|
218
|
+
" atv es iisfet\n" <>
|
219
|
+
"ayoior trr ino\n" <>
|
220
|
+
"l lfsoh ecti\n" <>
|
221
|
+
"ion vedpn l\n" <>
|
222
|
+
"kuehtteieadoe \n" <>
|
223
|
+
"erwaharrar,fas\n" <>
|
224
|
+
" nekt te rh\n" <>
|
225
|
+
"ismdsehphnnosa\n" <>
|
226
|
+
"ncuse ra-tau l\n" <>
|
227
|
+
" et tormsural\n" <>
|
228
|
+
"dniuthwea'g t \n" <>
|
229
|
+
"iennwesnr hsts\n" <>
|
230
|
+
"g,ycoi tkrttet\n" <>
|
231
|
+
"n ,l r s'a anr\n" <>
|
232
|
+
"i ef 'dgcgdi\n" <>
|
233
|
+
"t aol eoe,v\n" <>
|
234
|
+
"y nei sl,u; e\n" <>
|
235
|
+
", .sf to l \n" <>
|
236
|
+
" e rv d t\n" <>
|
237
|
+
" ; ie o\n" <>
|
238
|
+
" f, r \n" <>
|
239
|
+
" e e m\n" <>
|
240
|
+
" . m e\n" <>
|
241
|
+
" o n\n" <>
|
242
|
+
" v d\n" <>
|
243
|
+
" e .\n" <>
|
244
|
+
" ,"
|
245
|
+
|
246
|
+
assert Transpose.transpose(matrix) == expected
|
247
|
+
end
|
248
|
+
end
|