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.
Files changed (224) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/nucleotide-count/canonical-data.json +7 -7
  4. data/tracks/c/README.md +1 -1
  5. data/tracks/c/docs/SNIPPET.txt +2 -3
  6. data/tracks/c/exercises/acronym/test/test_acronym.c +8 -0
  7. data/tracks/c/exercises/all-your-base/test/test_all_your_base.c +8 -0
  8. data/tracks/c/exercises/allergies/test/test_allergies.c +8 -0
  9. data/tracks/c/exercises/anagram/test/test_anagram.c +8 -0
  10. data/tracks/c/exercises/atbash-cipher/test/test_atbash_cipher.c +8 -0
  11. data/tracks/c/exercises/beer-song/src/example.c +23 -22
  12. data/tracks/c/exercises/beer-song/src/example.h +3 -3
  13. data/tracks/c/exercises/beer-song/test/test_beer_song.c +8 -0
  14. data/tracks/c/exercises/binary-search/test/test_binary_search.c +8 -0
  15. data/tracks/c/exercises/binary/test/test_binary.c +8 -0
  16. data/tracks/c/exercises/bob/test/test_bob.c +8 -0
  17. data/tracks/c/exercises/clock/test/test_clock.c +8 -0
  18. data/tracks/c/exercises/difference-of-squares/test/test_difference_of_squares.c +8 -0
  19. data/tracks/c/exercises/gigasecond/test/test_gigasecond.c +8 -0
  20. data/tracks/c/exercises/grains/test/test_grains.c +8 -0
  21. data/tracks/c/exercises/hamming/test/test_hamming.c +8 -0
  22. data/tracks/c/exercises/hello-world/src/example.c +0 -2
  23. data/tracks/c/exercises/hello-world/test/test_hello_world.c +8 -0
  24. data/tracks/c/exercises/isogram/test/test_isogram.c +8 -0
  25. data/tracks/c/exercises/largest-series-product/test/test_largest_series_product.c +8 -0
  26. data/tracks/c/exercises/leap/test/test_leap.c +8 -0
  27. data/tracks/c/exercises/meetup/test/test_meetup.c +8 -0
  28. data/tracks/c/exercises/nth-prime/test/test_nth_prime.c +8 -0
  29. data/tracks/c/exercises/nucleotide-count/test/test_nucleotide_count.c +8 -0
  30. data/tracks/c/exercises/palindrome-products/test/test_palindrome_products.c +8 -0
  31. data/tracks/c/exercises/pangram/test/test_pangram.c +8 -0
  32. data/tracks/c/exercises/pascals-triangle/test/test_pascals_triangle.c +8 -0
  33. data/tracks/c/exercises/perfect-numbers/src/example.c +4 -4
  34. data/tracks/c/exercises/perfect-numbers/src/example.h +4 -4
  35. data/tracks/c/exercises/perfect-numbers/src/perfect_numbers.h +4 -4
  36. data/tracks/c/exercises/perfect-numbers/test/test_perfect_numbers.c +23 -13
  37. data/tracks/c/exercises/phone-number/test/test_phone_number.c +8 -0
  38. data/tracks/c/exercises/raindrops/test/test_raindrops.c +5 -1
  39. data/tracks/c/exercises/react/src/example.c +8 -8
  40. data/tracks/c/exercises/react/test/test_react.c +8 -0
  41. data/tracks/c/exercises/rna-transcription/test/test_rna_transcription.c +8 -0
  42. data/tracks/c/exercises/robot-simulator/src/example.c +12 -12
  43. data/tracks/c/exercises/robot-simulator/src/robot_simulator.h +11 -11
  44. data/tracks/c/exercises/robot-simulator/test/test_robot_simulator.c +33 -25
  45. data/tracks/c/exercises/roman-numerals/test/test_roman_numerals.c +8 -0
  46. data/tracks/c/exercises/scrabble-score/test/test_scrabble_score.c +8 -0
  47. data/tracks/c/exercises/series/test/test_series.c +8 -0
  48. data/tracks/c/exercises/sieve/test/test_sieve.c +8 -0
  49. data/tracks/c/exercises/space-age/src/example.h +8 -8
  50. data/tracks/c/exercises/space-age/test/test_space_age.c +16 -8
  51. data/tracks/c/exercises/sum-of-multiples/test/test_sum_of_multiples.c +8 -0
  52. data/tracks/c/exercises/triangle/test/test_triangle.c +8 -0
  53. data/tracks/c/exercises/word-count/test/test_word_count.c +8 -0
  54. data/tracks/cfml/config.json +8 -0
  55. data/tracks/cfml/exercises/anagram/.meta/HINTS.md +0 -0
  56. data/tracks/cfml/exercises/anagram/Anagram.cfc +13 -0
  57. data/tracks/cfml/exercises/anagram/AnagramTest.cfc +79 -0
  58. data/tracks/cfml/exercises/anagram/README.md +29 -0
  59. data/tracks/cfml/exercises/anagram/Solution.cfc +42 -0
  60. data/tracks/cfml/exercises/anagram/SolutionTest.cfc +7 -0
  61. data/tracks/cfml/exercises/anagram/TestRunner.cfc +103 -0
  62. data/tracks/cfml/exercises/anagram/box.json +8 -0
  63. data/tracks/cfml/exercises/anagram/index.cfm +37 -0
  64. data/tracks/common-lisp/config.json +5 -5
  65. data/tracks/csharp/exercises/two-bucket/Example.cs +53 -79
  66. data/tracks/csharp/exercises/two-bucket/TwoBucketTest.cs +2 -2
  67. data/tracks/csharp/generators/Exercises/QueenAttack.cs +3 -3
  68. data/tracks/dart/exercises/leap/test/leap_test.dart +1 -1
  69. data/tracks/delphi/exercises/hamming/uHammingTests.pas +2 -2
  70. data/tracks/delphi/exercises/leap/uLeapTests.pas +11 -38
  71. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountExample.pas +1 -1
  72. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +31 -55
  73. data/tracks/ecmascript/config.json +31 -0
  74. data/tracks/ecmascript/config/maintainers.json +5 -5
  75. data/tracks/ecmascript/exercises/accumulate/package.json +1 -1
  76. data/tracks/ecmascript/exercises/acronym/package.json +1 -1
  77. data/tracks/ecmascript/exercises/all-your-base/package.json +1 -1
  78. data/tracks/ecmascript/exercises/allergies/package.json +1 -1
  79. data/tracks/ecmascript/exercises/alphametics/package.json +1 -1
  80. data/tracks/ecmascript/exercises/anagram/package.json +1 -1
  81. data/tracks/ecmascript/exercises/atbash-cipher/package.json +1 -1
  82. data/tracks/ecmascript/exercises/beer-song/package.json +1 -1
  83. data/tracks/ecmascript/exercises/binary-search-tree/package.json +1 -1
  84. data/tracks/ecmascript/exercises/binary-search/package.json +1 -1
  85. data/tracks/ecmascript/exercises/binary/package.json +1 -1
  86. data/tracks/ecmascript/exercises/bob/package.json +1 -1
  87. data/tracks/ecmascript/exercises/bracket-push/package.json +1 -1
  88. data/tracks/ecmascript/exercises/circular-buffer/package.json +1 -1
  89. data/tracks/ecmascript/exercises/clock/package.json +1 -1
  90. data/tracks/ecmascript/exercises/collatz-conjecture/README.md +59 -0
  91. data/tracks/ecmascript/exercises/collatz-conjecture/collatz-conjecture.spec.js +31 -0
  92. data/tracks/ecmascript/exercises/collatz-conjecture/example.js +14 -0
  93. data/tracks/ecmascript/exercises/collatz-conjecture/package.json +69 -0
  94. data/tracks/ecmascript/exercises/connect/package.json +1 -1
  95. data/tracks/ecmascript/exercises/crypto-square/package.json +1 -1
  96. data/tracks/ecmascript/exercises/custom-set/package.json +1 -1
  97. data/tracks/ecmascript/exercises/diamond/package.json +1 -1
  98. data/tracks/ecmascript/exercises/difference-of-squares/package.json +1 -1
  99. data/tracks/ecmascript/exercises/diffie-hellman/package.json +1 -1
  100. data/tracks/ecmascript/exercises/etl/package.json +1 -1
  101. data/tracks/ecmascript/exercises/flatten-array/package.json +1 -1
  102. data/tracks/ecmascript/exercises/food-chain/package.json +1 -1
  103. data/tracks/ecmascript/exercises/gigasecond/package.json +1 -1
  104. data/tracks/ecmascript/exercises/grade-school/package.json +1 -1
  105. data/tracks/ecmascript/exercises/grains/package.json +1 -1
  106. data/tracks/ecmascript/exercises/hamming/package.json +1 -1
  107. data/tracks/ecmascript/exercises/hello-world/package.json +1 -1
  108. data/tracks/ecmascript/exercises/hexadecimal/package.json +1 -1
  109. data/tracks/ecmascript/exercises/isogram/package.json +1 -1
  110. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +1 -1
  111. data/tracks/ecmascript/exercises/largest-series-product/package.json +1 -1
  112. data/tracks/ecmascript/exercises/leap/package.json +1 -1
  113. data/tracks/ecmascript/exercises/linked-list/package.json +1 -1
  114. data/tracks/ecmascript/exercises/list-ops/package.json +1 -1
  115. data/tracks/ecmascript/exercises/luhn/package.json +1 -1
  116. data/tracks/ecmascript/exercises/matrix/package.json +1 -1
  117. data/tracks/ecmascript/exercises/meetup/package.json +1 -1
  118. data/tracks/ecmascript/exercises/minesweeper/package.json +1 -1
  119. data/tracks/ecmascript/exercises/nth-prime/package.json +1 -1
  120. data/tracks/ecmascript/exercises/ocr-numbers/package.json +1 -1
  121. data/tracks/ecmascript/exercises/octal/package.json +1 -1
  122. data/tracks/ecmascript/exercises/palindrome-products/package.json +1 -1
  123. data/tracks/ecmascript/exercises/pangram/package.json +1 -1
  124. data/tracks/ecmascript/exercises/pascals-triangle/package.json +1 -1
  125. data/tracks/ecmascript/exercises/perfect-numbers/package.json +1 -1
  126. data/tracks/ecmascript/exercises/phone-number/package.json +1 -1
  127. data/tracks/ecmascript/exercises/pig-latin/package.json +1 -1
  128. data/tracks/ecmascript/exercises/prime-factors/package.json +1 -1
  129. data/tracks/ecmascript/exercises/proverb/package.json +1 -1
  130. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +1 -1
  131. data/tracks/ecmascript/exercises/queen-attack/package.json +1 -1
  132. data/tracks/ecmascript/exercises/raindrops/package.json +1 -1
  133. data/tracks/ecmascript/exercises/rna-transcription/package.json +1 -1
  134. data/tracks/ecmascript/exercises/robot-name/package.json +1 -1
  135. data/tracks/ecmascript/exercises/robot-simulator/package.json +1 -1
  136. data/tracks/ecmascript/exercises/roman-numerals/package.json +1 -1
  137. data/tracks/ecmascript/exercises/run-length-encoding/package.json +1 -1
  138. data/tracks/ecmascript/exercises/saddle-points/package.json +1 -1
  139. data/tracks/ecmascript/exercises/say/package.json +1 -1
  140. data/tracks/ecmascript/exercises/scrabble-score/package.json +1 -1
  141. data/tracks/ecmascript/exercises/secret-handshake/package.json +1 -1
  142. data/tracks/ecmascript/exercises/series/package.json +1 -1
  143. data/tracks/ecmascript/exercises/sieve/package.json +1 -1
  144. data/tracks/ecmascript/exercises/simple-cipher/package.json +1 -1
  145. data/tracks/ecmascript/exercises/simple-linked-list/package.json +1 -1
  146. data/tracks/ecmascript/exercises/space-age/package.json +1 -1
  147. data/tracks/ecmascript/exercises/strain/package.json +1 -1
  148. data/tracks/ecmascript/exercises/sublist/package.json +1 -1
  149. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +1 -1
  150. data/tracks/ecmascript/exercises/triangle/package.json +1 -1
  151. data/tracks/ecmascript/exercises/trinary/package.json +1 -1
  152. data/tracks/ecmascript/exercises/twelve-days/package.json +1 -1
  153. data/tracks/ecmascript/exercises/two-bucket/package.json +1 -1
  154. data/tracks/ecmascript/exercises/word-count/package.json +1 -1
  155. data/tracks/ecmascript/exercises/word-search/README.md +58 -0
  156. data/tracks/ecmascript/exercises/word-search/example.js +146 -0
  157. data/tracks/ecmascript/exercises/word-search/package.json +69 -0
  158. data/tracks/ecmascript/exercises/word-search/word-search.spec.js +626 -0
  159. data/tracks/ecmascript/exercises/wordy/package.json +1 -1
  160. data/tracks/ecmascript/package.json +1 -1
  161. data/tracks/elixir/config.json +11 -0
  162. data/tracks/elixir/exercises/luhn/example.exs +26 -46
  163. data/tracks/elixir/exercises/luhn/luhn.exs +0 -13
  164. data/tracks/elixir/exercises/luhn/luhn_test.exs +44 -14
  165. data/tracks/elixir/exercises/transpose/README.md +101 -0
  166. data/tracks/elixir/exercises/transpose/example.exs +46 -0
  167. data/tracks/elixir/exercises/transpose/transpose.exs +22 -0
  168. data/tracks/elixir/exercises/transpose/transpose_test.exs +248 -0
  169. data/tracks/fsharp/exercises/grains/Example.fs +10 -2
  170. data/tracks/fsharp/exercises/grains/Grains.fs +2 -4
  171. data/tracks/fsharp/exercises/grains/GrainsTest.fs +52 -25
  172. data/tracks/fsharp/exercises/phone-number/Example.fs +11 -3
  173. data/tracks/fsharp/exercises/phone-number/PhoneNumber.fs +1 -1
  174. data/tracks/fsharp/exercises/phone-number/PhoneNumberTest.fs +32 -21
  175. data/tracks/fsharp/exercises/prime-factors/Example.fs +6 -13
  176. data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fs +1 -1
  177. data/tracks/fsharp/exercises/prime-factors/PrimeFactorsTest.fs +23 -32
  178. data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipherTest.fs +22 -13
  179. data/tracks/fsharp/generators/Exercise.fs +3 -4
  180. data/tracks/fsharp/generators/Generators.fs +31 -0
  181. data/tracks/gnu-apl/bin/run-all-tests +5 -2
  182. data/tracks/java/CONTRIBUTING.md +8 -0
  183. data/tracks/java/POLICIES.md +2 -2
  184. data/tracks/java/config.json +26 -4
  185. data/tracks/java/exercises/triangle/.meta/.version +1 -0
  186. data/tracks/java/exercises/triangle/.meta/src/reference/java/Triangle.java +1 -1
  187. data/tracks/java/exercises/triangle/src/test/java/TriangleTest.java +59 -40
  188. data/tracks/javascript/config.json +30 -0
  189. data/tracks/javascript/config/maintainers.json +8 -8
  190. data/tracks/javascript/exercises/change/example.js +6 -22
  191. data/tracks/javascript/exercises/collatz-conjecture/README.md +57 -0
  192. data/tracks/javascript/exercises/collatz-conjecture/collatz-conjecture.spec.js +37 -0
  193. data/tracks/javascript/exercises/collatz-conjecture/example.js +20 -0
  194. data/tracks/javascript/exercises/protein-translation/example.js +30 -31
  195. data/tracks/javascript/exercises/protein-translation/protein-translation.spec.js +60 -60
  196. data/tracks/javascript/exercises/transpose/README.md +89 -0
  197. data/tracks/javascript/exercises/transpose/example.js +17 -0
  198. data/tracks/javascript/exercises/transpose/transpose.spec.js +67 -0
  199. data/tracks/objective-c/config.json +283 -263
  200. data/tracks/objective-c/exercises/grains/GrainsExample.h +6 -0
  201. data/tracks/objective-c/exercises/grains/GrainsExample.m +19 -0
  202. data/tracks/objective-c/exercises/grains/GrainsTest.m +85 -0
  203. data/tracks/objective-c/exercises/nth-prime/NthPrimeExample.h +6 -0
  204. data/tracks/objective-c/exercises/nth-prime/NthPrimeExample.m +39 -0
  205. data/tracks/objective-c/exercises/nth-prime/NthPrimeTest.m +53 -0
  206. data/tracks/python/config.json +42 -11
  207. data/tracks/python/exercises/change/README.md +34 -0
  208. data/tracks/python/exercises/two-bucket/README.md +47 -0
  209. data/tracks/ruby/README.md +4 -1
  210. data/tracks/ruby/lib/generator/command_line.rb +3 -3
  211. data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +3 -3
  212. data/tracks/ruby/test/generator/command_line/generator_optparser_test.rb +4 -4
  213. data/tracks/ruby/test/generator/command_line_test.rb +5 -5
  214. data/tracks/typescript/config.json +15 -0
  215. data/tracks/typescript/exercises/strain/README.md +60 -0
  216. data/tracks/typescript/exercises/strain/package.json +36 -0
  217. data/tracks/typescript/exercises/strain/strain.example.ts +23 -0
  218. data/tracks/typescript/exercises/strain/strain.test.ts +76 -0
  219. data/tracks/typescript/exercises/strain/strain.ts +0 -0
  220. data/tracks/typescript/exercises/strain/tsconfig.json +22 -0
  221. data/tracks/typescript/exercises/strain/tslint.json +127 -0
  222. data/tracks/typescript/exercises/strain/yarn.lock +2305 -0
  223. metadata +46 -3
  224. data/tracks/ecmascript/package-lock.json +0 -2835
@@ -39,7 +39,7 @@
39
39
  ],
40
40
  ["transform-regenerator"]
41
41
  ]
42
- },
42
+ },
43
43
  "scripts": {
44
44
  "test": "jest --no-cache ./*",
45
45
  "watch": "jest --no-cache --watch ./*",
@@ -39,7 +39,7 @@
39
39
  ],
40
40
  ["transform-regenerator"]
41
41
  ]
42
- },
42
+ },
43
43
  "scripts": {
44
44
  "test": "jest --no-cache ./*",
45
45
  "watch": "jest --no-cache --watch ./*",
@@ -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 |> checksum |> rem(10) == 0
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
- @doc """
39
- Creates a valid number by adding the correct
40
- checksum digit to the end of the number
41
- """
42
- @spec create(String.t()) :: String.t()
43
- def create(number) do
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 double_if_even_index(n, index) do
57
- if rem(index, 2) == 0, do: n, else: n * 2
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
- end
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 "checksum" do
12
- assert Luhn.checksum("4913") == 22
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 "checksum again" do
17
- assert Luhn.checksum("201773") == 21
16
+ test "A single zero is invalid" do
17
+ refute Luhn.valid?("0")
18
18
  end
19
19
 
20
20
  @tag :pending
21
- test "invalid number" do
22
- assert Luhn.valid?("738") == false
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 number" do
27
- assert Luhn.valid?("8739567") == true
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 "create valid number" do
32
- assert Luhn.create("123") == "1230"
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 "create other valid number" do
37
- assert Luhn.create("873956") == "8739567"
36
+ test "invalid Canadian SIN" do
37
+ refute Luhn.valid?("055 444 286")
38
38
  end
39
39
 
40
40
  @tag :pending
41
- test "create yet another valid number" do
42
- assert Luhn.create("837263756") == "8372637564"
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