trackler 2.0.8.39 → 2.0.8.40

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/elixir/config.json +14 -0
  4. data/tracks/elixir/exercises/bank-account/bank_account_test.exs +8 -0
  5. data/tracks/elixir/exercises/bank-account/example.exs +10 -2
  6. data/tracks/elixir/exercises/secret-handshake/HINTS.md +20 -0
  7. data/tracks/elixir/exercises/secret-handshake/example.exs +43 -0
  8. data/tracks/elixir/exercises/secret-handshake/secret_handshake.exs +20 -0
  9. data/tracks/elixir/exercises/secret-handshake/secret_handshake_test.exs +72 -0
  10. data/tracks/elixir/exercises/strain/HINTS.md +1 -0
  11. data/tracks/elixir/exercises/strain/example.exs +40 -0
  12. data/tracks/elixir/exercises/strain/strain.exs +22 -0
  13. data/tracks/elixir/exercises/strain/strain_test.exs +96 -0
  14. data/tracks/erlang/SETUP.md +2 -2
  15. data/tracks/java/bin/journey-test.sh +2 -0
  16. data/tracks/java/exercises/book-store/src/test/java/BookstoreTest.java +1 -0
  17. data/tracks/java/exercises/twelve-days/src/example/java/TwelveDays.java +16 -20
  18. data/tracks/java/exercises/twelve-days/src/test/java/TwelveDaysTest.java +21 -14
  19. data/tracks/perl6/.travis.yml +1 -1
  20. data/tracks/python/exercises/diamond/diamond_test.py +73 -13
  21. data/tracks/python/exercises/grep/grep_test.py +3 -0
  22. data/tracks/python/exercises/sublist/sublist_test.py +10 -0
  23. data/tracks/rust/exercises/acronym/.gitignore +7 -0
  24. data/tracks/rust/exercises/all-your-base/.gitignore +7 -0
  25. data/tracks/rust/exercises/alphametics/.gitignore +7 -0
  26. data/tracks/rust/exercises/atbash-cipher/.gitignore +7 -0
  27. data/tracks/rust/exercises/protein-translation/.gitignore +7 -0
  28. data/tracks/rust/exercises/react/.gitignore +7 -0
  29. data/tracks/rust/exercises/rotational-cipher/.gitignore +7 -0
  30. metadata +17 -3
  31. data/tracks/perl6/.gitmodules +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f16f5a4fa0fdde0642c976d3e020bdf84d359613
4
- data.tar.gz: 940657bebb2d0ea237f01459d6beeab37766ee9b
3
+ metadata.gz: 9d30d6eef2ec6bb48c145139282b4dfd7ae00001
4
+ data.tar.gz: 9f8b29d64bf05c03625ee0f2dfc057c6fde1ea04
5
5
  SHA512:
6
- metadata.gz: f67845a691fb409f1c1453bca11cd939f37647ba716bac4a6ccd8d15cb7d0d50f43098c3448491adfc7724d5ef1c1922e96c6c98b1eefc60368e9786dd26fe87
7
- data.tar.gz: 59000762c30e40be13816d4d7413ceff5ca4529b98fb912874a12a7a7a9ea272c003019bf7047769f16e73d19dde9e2912c91f15790735f2aa45099bf53630e3
6
+ metadata.gz: c2f55c537bf59e203edc2d98bfe922b699643a0f5838fd52d216f0a194a82bd665f3ed687e8c53220c7994beaaef35daca336aab2ac48fe19d192a1b93d139c4
7
+ data.tar.gz: 2f6b57f6ed237a96d07a34c73f4d436968c7b69191c961d9fc1e50b14147af4e4ec3d8a58d215dfae735854aec1cd51f9acb3190f0e5569eecf357b39885ecd2
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.8.39"
2
+ VERSION = "2.0.8.40"
3
3
  end
@@ -20,6 +20,13 @@
20
20
  "enumerables"
21
21
  ]
22
22
  },
23
+ {
24
+ "slug": "secret-handshake",
25
+ "difficulty": 2,
26
+ "topics": [
27
+ "binary representation"
28
+ ]
29
+ },
23
30
  {
24
31
  "slug": "rotational-cipher",
25
32
  "difficulty": 2,
@@ -27,6 +34,13 @@
27
34
  "string processing"
28
35
  ]
29
36
  },
37
+ {
38
+ "slug": "strain",
39
+ "difficulty": 2,
40
+ "topics": [
41
+ "collections"
42
+ ]
43
+ },
30
44
  {
31
45
  "slug": "protein-translation",
32
46
  "difficulty": 2,
@@ -50,6 +50,14 @@ defmodule BankAccountTest do
50
50
  assert BankAccount.balance(account) == 20
51
51
  end
52
52
 
53
+ @tag :pending
54
+ test "closing account rejects further inquiries", %{account: account} do
55
+ assert BankAccount.balance(account) == 0
56
+ BankAccount.close_bank(account)
57
+ assert BankAccount.balance(account) == {:error, :account_closed}
58
+ assert BankAccount.update(account, 10) == {:error, :account_closed}
59
+ end
60
+
53
61
  @tag :pending
54
62
  test "incrementing balance from another process then checking it from test process", %{account: account} do
55
63
  assert BankAccount.balance(account) == 0
@@ -53,13 +53,21 @@ defmodule BankAccount do
53
53
  """
54
54
  @spec balance(account) :: integer
55
55
  def balance(account) do
56
- :gen_server.call(account, :balance)
56
+ if Process.alive?(account) do
57
+ :gen_server.call(account, :balance)
58
+ else
59
+ { :error, :account_closed }
60
+ end
57
61
  end
58
62
 
59
63
  @doc """
60
64
  Update the account's balance by adding the given amount which may be negative.
61
65
  """
62
66
  def update(account, amount) do
63
- :gen_server.call(account, { :update, amount })
67
+ if Process.alive?(account) do
68
+ :gen_server.call(account, { :update, amount })
69
+ else
70
+ { :error, :account_closed }
71
+ end
64
72
  end
65
73
  end
@@ -0,0 +1,20 @@
1
+ use Bitwise (or div/rem)
2
+
3
+ If you use Bitwise, an easy way to see if a particular bit is set is to compare
4
+ the binary AND (`&&&`) of a set of bits with the particular bit pattern you
5
+ want to check, and determine if the result is the same as the pattern you're
6
+ checking.
7
+
8
+ Example:
9
+
10
+ Flags: 0b11011
11
+ Check: 0b11010
12
+
13
+ Flags &&& Check: 0b11010 (All checked bits are set)
14
+
15
+ Another:
16
+
17
+ Flags: 0b11011
18
+ Check: 0b10110
19
+
20
+ Flags &&& Check: 0b10010 (Third bit not set)
@@ -0,0 +1,43 @@
1
+ defmodule SecretHandshake do
2
+ use Bitwise
3
+
4
+ @codes ["wink", "double blink", "close your eyes", "jump"]
5
+
6
+ @doc """
7
+ Determine the actions of a secret handshake based on the binary
8
+ representation of the given `code`.
9
+
10
+ If the following bits are set, include the corresponding action in your list
11
+ of commands, in order from lowest to highest.
12
+
13
+ 1 = wink
14
+ 10 = double blink
15
+ 100 = close your eyes
16
+ 1000 = jump
17
+
18
+ 10000 = Reverse the order of the operations in the secret handshake
19
+ """
20
+ @spec commands(code :: integer) :: list(String.t())
21
+ def commands(code) do
22
+ @codes
23
+ |> Enum.with_index
24
+ |> Enum.map(fn {command, i} -> { command, 2 <<< (i-1) } end)
25
+ |> decode_commands(code, [])
26
+ end
27
+
28
+ defp decode_commands([], code, results) do
29
+ case flag_set(code, 16) do
30
+ true -> results
31
+ _ -> Enum.reverse(results)
32
+ end
33
+ end
34
+ defp decode_commands([{ command, flag } | flags], code, results) do
35
+ case flag_set(code, flag) do
36
+ true -> decode_commands(flags, code, [command | results])
37
+ _ -> decode_commands(flags, code, results)
38
+ end
39
+ end
40
+
41
+ defp flag_set(flags, flag_to_check), do: (flags &&& flag_to_check) == flag_to_check
42
+ end
43
+
@@ -0,0 +1,20 @@
1
+ defmodule SecretHandshake do
2
+ @doc """
3
+ Determine the actions of a secret handshake based on the binary
4
+ representation of the given `code`.
5
+
6
+ If the following bits are set, include the corresponding action in your list
7
+ of commands, in order from lowest to highest.
8
+
9
+ 1 = wink
10
+ 10 = double blink
11
+ 100 = close your eyes
12
+ 1000 = jump
13
+
14
+ 10000 = Reverse the order of the operations in the secret handshake
15
+ """
16
+ @spec commands(code :: integer) :: list(String.t())
17
+ def commands(code) do
18
+ end
19
+ end
20
+
@@ -0,0 +1,72 @@
1
+ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
2
+ Code.load_file("secret_handshake.exs", __DIR__)
3
+ end
4
+
5
+ ExUnit.start
6
+ ExUnit.configure trace: true, exclude: :pending
7
+
8
+ defmodule SecretHandshakeTest do
9
+ use ExUnit.Case
10
+
11
+ describe "Create a handshake for a number" do
12
+ #@tag :pending
13
+ test "wink for 1" do
14
+ assert SecretHandshake.commands(1) == ["wink"]
15
+ end
16
+
17
+ @tag :pending
18
+ test "double blink for 10" do
19
+ assert SecretHandshake.commands(2) == ["double blink"]
20
+ end
21
+
22
+ @tag :pending
23
+ test "close your eyes for 100" do
24
+ assert SecretHandshake.commands(4) == ["close your eyes"]
25
+ end
26
+
27
+ @tag :pending
28
+ test "jump for 1000" do
29
+ assert SecretHandshake.commands(8) == ["jump"]
30
+ end
31
+
32
+ @tag :pending
33
+ test "combine two actions" do
34
+ assert SecretHandshake.commands(3) == ["wink", "double blink"]
35
+ end
36
+
37
+ @tag :pending
38
+ test "reverse two actions" do
39
+ assert SecretHandshake.commands(19) == ["double blink", "wink"]
40
+ end
41
+
42
+ @tag :pending
43
+ test "reversing one action gives the same action" do
44
+ assert SecretHandshake.commands(24) == ["jump"]
45
+ end
46
+
47
+ @tag :pending
48
+ test "reversing no actions still gives no actions" do
49
+ assert SecretHandshake.commands(16) == []
50
+ end
51
+
52
+ @tag :pending
53
+ test "all possible actions" do
54
+ assert SecretHandshake.commands(15) == ["wink", "double blink", "close your eyes", "jump"]
55
+ end
56
+
57
+ @tag :pending
58
+ test "reverse all possible actions" do
59
+ assert SecretHandshake.commands(31) == ["jump", "close your eyes", "double blink", "wink"]
60
+ end
61
+
62
+ @tag :pending
63
+ test "do nothing for zero" do
64
+ assert SecretHandshake.commands(0) == []
65
+ end
66
+
67
+ @tag :pending
68
+ test "do nothing if lower 5 bits not set" do
69
+ assert SecretHandshake.commands(32) == []
70
+ end
71
+ end
72
+ end
@@ -0,0 +1 @@
1
+ `apply` will let you pass arguments to a function, as will `fun.(args)`
@@ -0,0 +1,40 @@
1
+ defmodule Strain do
2
+ @doc """
3
+ Given a `list` of items and a function `fun`, return the list of items where
4
+ `fun` returns true.
5
+
6
+ Do not use `Enum.filter`.
7
+ """
8
+ @spec keep(list :: list(any), fun :: ((any) -> boolean)) :: list(any)
9
+ def keep(list, fun) do
10
+ do_keep(list, fun, [])
11
+ end
12
+
13
+ defp do_keep([], _, results), do: Enum.reverse(results)
14
+ defp do_keep([head | tail], fun, results) do
15
+ case apply(fun, [head]) do
16
+ true -> do_keep(tail, fun, [head | results])
17
+ _ -> do_keep(tail, fun, results)
18
+ end
19
+ end
20
+
21
+ @doc """
22
+ Given a `list` of items and a function `fun`, return the list of items where
23
+ `fun` returns true.
24
+
25
+ Do not use `Enum.reject`.
26
+ """
27
+ @spec discard(list :: list(any), fun :: ((any) -> boolean)) :: list(any)
28
+ def discard(list, fun) do
29
+ do_discard(list, fun, [])
30
+ end
31
+
32
+ defp do_discard([], _, results), do: Enum.reverse(results)
33
+ defp do_discard([head | tail], fun, results) do
34
+ case apply(fun, [head]) do
35
+ true -> do_discard(tail, fun, results)
36
+ _ -> do_discard(tail, fun, [ head | results ])
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,22 @@
1
+ defmodule Strain do
2
+ @doc """
3
+ Given a `list` of items and a function `fun`, return the list of items where
4
+ `fun` returns true.
5
+
6
+ Do not use `Enum.filter`.
7
+ """
8
+ @spec keep(list :: list(any), fun :: ((any) -> boolean)) :: list(any)
9
+ def keep(list, fun) do
10
+ end
11
+
12
+ @doc """
13
+ Given a `list` of items and a function `fun`, return the list of items where
14
+ `fun` returns true.
15
+
16
+ Do not use `Enum.reject`.
17
+ """
18
+ @spec discard(list :: list(any), fun :: ((any) -> boolean)) :: list(any)
19
+ def discard(list, fun) do
20
+ end
21
+ end
22
+
@@ -0,0 +1,96 @@
1
+ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
2
+ Code.load_file("strain.exs", __DIR__)
3
+ end
4
+
5
+ ExUnit.start
6
+ ExUnit.configure trace: true, exclude: :pending
7
+
8
+ defmodule StrainTest do
9
+ use ExUnit.Case
10
+
11
+ defp is_odd?(n), do: rem(n, 2) == 1
12
+ defp is_even?(n), do: rem(n, 2) == 0
13
+ defp noop(_), do: true
14
+
15
+ #@tag :pending
16
+ test "empty keep" do
17
+ assert Strain.keep([], &noop/1) == []
18
+ end
19
+
20
+ @tag :pending
21
+ test "keep everything" do
22
+ assert Strain.keep([1, 2, 3], fn e -> e < 10 end) == [1, 2, 3]
23
+ end
24
+
25
+ @tag :pending
26
+ test "keep first and last" do
27
+ assert Strain.keep([1, 2, 3], &is_odd?/1) == [1, 3]
28
+ end
29
+
30
+ @tag :pending
31
+ test "keep neither first nor last" do
32
+ assert Strain.keep([1, 2, 3, 4, 5], &is_even?/1) == [2, 4]
33
+ end
34
+
35
+ @tag :pending
36
+ test "keep strings" do
37
+ words = ~w(apple zebra banana zombies cherimoya zelot)
38
+ assert Strain.keep(words, &(String.starts_with?(&1, "z"))) == ~w(zebra zombies zelot)
39
+ end
40
+
41
+ @tag :pending
42
+ test "keep arrays" do
43
+ rows = [
44
+ [1, 2, 3],
45
+ [5, 5, 5],
46
+ [5, 1, 2],
47
+ [2, 1, 2],
48
+ [1, 5, 2],
49
+ [2, 2, 1],
50
+ [1, 2, 5]
51
+ ]
52
+
53
+ assert Strain.keep(rows, fn row -> 5 in row end) == [[5, 5, 5], [5, 1, 2], [1, 5, 2], [1, 2, 5]]
54
+ end
55
+
56
+ @tag :pending
57
+ test "empty discard" do
58
+ assert Strain.discard([], &noop/1) == []
59
+ end
60
+
61
+ @tag :pending
62
+ test "discard nothing" do
63
+ assert Strain.discard([1, 2, 3], fn e -> e > 10 end) == [1, 2, 3]
64
+ end
65
+
66
+ @tag :pending
67
+ test "discard first and last" do
68
+ assert Strain.discard([1, 2, 3], &is_odd?/1) == [2]
69
+ end
70
+
71
+ @tag :pending
72
+ test "discard neither first nor last" do
73
+ assert Strain.discard([1, 2, 3, 4, 5], &is_even?/1) == [1, 3, 5]
74
+ end
75
+
76
+ @tag :pending
77
+ test "discard strings" do
78
+ words = ~w(apple zebra banana zombies cherimoya zelot)
79
+ assert Strain.discard(words, &(String.starts_with?(&1, "z"))) == ~w(apple banana cherimoya)
80
+ end
81
+
82
+ @tag :pending
83
+ test "discard arrays" do
84
+ rows = [
85
+ [1, 2, 3],
86
+ [5, 5, 5],
87
+ [5, 1, 2],
88
+ [2, 1, 2],
89
+ [1, 5, 2],
90
+ [2, 2, 1],
91
+ [1, 2, 5]
92
+ ]
93
+ assert Strain.discard(rows, fn row -> 5 in row end) == [[1, 2, 3], [2, 1, 2], [2, 2, 1]]
94
+ end
95
+ end
96
+
@@ -13,7 +13,7 @@ Each problem defines a macro `TEST_VERSION` in the test file and
13
13
  verifies that the solution defines and exports a function `test_version`
14
14
  returning that same value.
15
15
 
16
- To make this test pass, add the following to your solution:
16
+ To make tests pass, add the following to your solution:
17
17
 
18
18
  ```erlang
19
19
  -export([test_version/0]).
@@ -24,7 +24,7 @@ test_version() ->
24
24
 
25
25
  The benefit of this is that reviewers can see against which test version
26
26
  an iteration was written if, for example, a previously posted solution
27
- does not pass current tests.
27
+ does not solve the current problem or passes current tests.
28
28
 
29
29
  ## Questions?
30
30
 
@@ -225,6 +225,8 @@ solve_all_exercises() {
225
225
  cp -R -H ${xjava}/exercises/${exercise}/src/example/java/* ${exercism_exercises_dir}/java/${exercise}/src/main/java/
226
226
 
227
227
  pushd ${exercism_exercises_dir}/java/${exercise}
228
+ # Check that tests compile before we strip @Ignore annotations
229
+ gradle compileTestJava
228
230
  # Ensure we run all the tests (as delivered, all but the first is @Ignore'd)
229
231
  for testfile in `find . -name "*Test.java"`; do
230
232
  sed 's/@Ignore//' ${testfile} > "${tempfile}" && mv "${tempfile}" "${testfile}"
@@ -4,6 +4,7 @@ import java.util.List;
4
4
  import java.util.ArrayList;
5
5
  import java.util.Arrays;
6
6
 
7
+ import org.junit.Ignore;
7
8
  import org.junit.Test;
8
9
 
9
10
  public class BookstoreTest{
@@ -1,7 +1,7 @@
1
1
  public class TwelveDays {
2
- private static String[] days = new String[] {"first", "second", "third", "fourth", "fifth", "sixth", "seventh",
3
- "eighth", "ninth", "tenth", "eleventh", "twelfth"};
4
- private static String[] gifts = new String[] {
2
+ private static String[] days = new String[]{"first", "second", "third", "fourth", "fifth", "sixth", "seventh",
3
+ "eighth", "ninth", "tenth", "eleventh", "twelfth"};
4
+ private static String[] gifts = new String[]{
5
5
  "a Partridge in a Pear Tree.",
6
6
  "two Turtle Doves, ",
7
7
  "three French Hens, ",
@@ -16,31 +16,27 @@ public class TwelveDays {
16
16
  "twelve Drummers Drumming, "
17
17
  };
18
18
 
19
- public static String verse(int verseNumber) {
20
- return constructVerse(verseNumber);
19
+ public String verse(int verseNumber) {
20
+ StringBuilder stringBuilder = new StringBuilder("On the " + days[verseNumber - 1]
21
+ + " day of Christmas my true love gave to me, ");
22
+ for (int i = verseNumber; i > 0; i--) {
23
+ if (verseNumber != 1 && i == 1) stringBuilder.append("and ");
24
+ stringBuilder.append(gifts[i - 1]);
25
+ }
26
+ stringBuilder.append("\n");
27
+ return stringBuilder.toString();
21
28
  }
22
29
 
23
- public static String verses(int verseNumberStart, int verseNumberEnd) {
24
- StringBuilder stringBuilder = new StringBuilder(constructVerse(verseNumberStart));
30
+ public String verses(int verseNumberStart, int verseNumberEnd) {
31
+ StringBuilder stringBuilder = new StringBuilder(verse(verseNumberStart));
25
32
  for (int i = verseNumberStart + 1; i <= verseNumberEnd; i++) {
26
33
  stringBuilder.append("\n");
27
- stringBuilder.append(constructVerse(i));
34
+ stringBuilder.append(verse(i));
28
35
  }
29
36
  return stringBuilder.toString();
30
37
  }
31
38
 
32
- public static String sing() {
39
+ public String sing() {
33
40
  return verses(1, 12);
34
41
  }
35
-
36
- private static String constructVerse(int verseNumber) {
37
- StringBuilder stringBuilder = new StringBuilder("On the " + days[verseNumber - 1]
38
- + " day of Christmas my true love gave to me, ");
39
- for (int i = verseNumber; i > 0; i--) {
40
- if (verseNumber != 1 && i == 1) stringBuilder.append("and ");
41
- stringBuilder.append(gifts[i - 1]);
42
- }
43
- stringBuilder.append("\n");
44
- return stringBuilder.toString();
45
- }
46
42
  }
@@ -1,15 +1,22 @@
1
+ import org.junit.Before;
1
2
  import org.junit.Ignore;
2
3
  import org.junit.Test;
3
4
 
4
5
  import static org.junit.Assert.assertEquals;
5
6
 
6
7
  public class TwelveDaysTest {
8
+ private TwelveDays twelveDays;
9
+
10
+ @Before
11
+ public void setup() {
12
+ twelveDays = new TwelveDays();
13
+ }
7
14
 
8
15
  @Test
9
16
  public void testVerseOne() {
10
17
  String expectedVerseOne = "On the first day of Christmas my true love gave to me, " +
11
18
  "a Partridge in a Pear Tree.\n";
12
- assertEquals(expectedVerseOne, TwelveDays.verse(1));
19
+ assertEquals(expectedVerseOne, twelveDays.verse(1));
13
20
  }
14
21
 
15
22
  @Ignore
@@ -17,7 +24,7 @@ public class TwelveDaysTest {
17
24
  public void testVerseTwo() {
18
25
  String expectedVerseTwo = "On the second day of Christmas my true love gave to me, two Turtle Doves, " +
19
26
  "and a Partridge in a Pear Tree.\n";
20
- assertEquals(expectedVerseTwo, TwelveDays.verse(2));
27
+ assertEquals(expectedVerseTwo, twelveDays.verse(2));
21
28
  }
22
29
 
23
30
  @Ignore
@@ -25,7 +32,7 @@ public class TwelveDaysTest {
25
32
  public void testVerseThree() {
26
33
  String expectedVerseThree = "On the third day of Christmas my true love gave to me, three French Hens, " +
27
34
  "two Turtle Doves, and a Partridge in a Pear Tree.\n";
28
- assertEquals(expectedVerseThree, TwelveDays.verse(3));
35
+ assertEquals(expectedVerseThree, twelveDays.verse(3));
29
36
  }
30
37
 
31
38
  @Ignore
@@ -33,7 +40,7 @@ public class TwelveDaysTest {
33
40
  public void testVerseFour() {
34
41
  String expectedVerseFour = "On the fourth day of Christmas my true love gave to me, four Calling Birds, " +
35
42
  "three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
36
- assertEquals(expectedVerseFour, TwelveDays.verse(4));
43
+ assertEquals(expectedVerseFour, twelveDays.verse(4));
37
44
  }
38
45
 
39
46
  @Ignore
@@ -41,7 +48,7 @@ public class TwelveDaysTest {
41
48
  public void testVerseFive() {
42
49
  String expectedVerseFive = "On the fifth day of Christmas my true love gave to me, five Gold Rings, " +
43
50
  "four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
44
- assertEquals(expectedVerseFive, TwelveDays.verse(5));
51
+ assertEquals(expectedVerseFive, twelveDays.verse(5));
45
52
  }
46
53
 
47
54
  @Ignore
@@ -50,7 +57,7 @@ public class TwelveDaysTest {
50
57
  String expectedVerseSix = "On the sixth day of Christmas my true love gave to me, six Geese-a-Laying, " +
51
58
  "five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, " +
52
59
  "and a Partridge in a Pear Tree.\n";
53
- assertEquals(expectedVerseSix, TwelveDays.verse(6));
60
+ assertEquals(expectedVerseSix, twelveDays.verse(6));
54
61
  }
55
62
 
56
63
  @Ignore
@@ -59,7 +66,7 @@ public class TwelveDaysTest {
59
66
  String expectedVerseSeven = "On the seventh day of Christmas my true love gave to me, " +
60
67
  "seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, " +
61
68
  "two Turtle Doves, and a Partridge in a Pear Tree.\n";
62
- assertEquals(expectedVerseSeven, TwelveDays.verse(7));
69
+ assertEquals(expectedVerseSeven, twelveDays.verse(7));
63
70
  }
64
71
 
65
72
  @Ignore
@@ -68,7 +75,7 @@ public class TwelveDaysTest {
68
75
  String expectedVerseEight = "On the eighth day of Christmas my true love gave to me, eight Maids-a-Milking," +
69
76
  " seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, " +
70
77
  "three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
71
- assertEquals(expectedVerseEight, TwelveDays.verse(8));
78
+ assertEquals(expectedVerseEight, twelveDays.verse(8));
72
79
  }
73
80
 
74
81
  @Ignore
@@ -77,7 +84,7 @@ public class TwelveDaysTest {
77
84
  String expectedVerseNine = "On the ninth day of Christmas my true love gave to me, nine Ladies Dancing, " +
78
85
  "eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, " +
79
86
  "four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
80
- assertEquals(expectedVerseNine, TwelveDays.verse(9));
87
+ assertEquals(expectedVerseNine, twelveDays.verse(9));
81
88
  }
82
89
 
83
90
  @Ignore
@@ -87,7 +94,7 @@ public class TwelveDaysTest {
87
94
  "nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, " +
88
95
  "five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, " +
89
96
  "and a Partridge in a Pear Tree.\n";
90
- assertEquals(expectedVerseTen, TwelveDays.verse(10));
97
+ assertEquals(expectedVerseTen, twelveDays.verse(10));
91
98
  }
92
99
 
93
100
  @Ignore
@@ -97,7 +104,7 @@ public class TwelveDaysTest {
97
104
  "eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, " +
98
105
  "seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, " +
99
106
  "three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
100
- assertEquals(expectedVerseEleven, TwelveDays.verse(11));
107
+ assertEquals(expectedVerseEleven, twelveDays.verse(11));
101
108
  }
102
109
 
103
110
  @Ignore
@@ -107,7 +114,7 @@ public class TwelveDaysTest {
107
114
  "twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, " +
108
115
  "eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, " +
109
116
  "four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
110
- assertEquals(expectedVerseTwelve, TwelveDays.verse(12));
117
+ assertEquals(expectedVerseTwelve, twelveDays.verse(12));
111
118
  }
112
119
 
113
120
  @Ignore
@@ -119,7 +126,7 @@ public class TwelveDaysTest {
119
126
  "and a Partridge in a Pear Tree.\n\n" +
120
127
  "On the third day of Christmas my true love gave to me, three French Hens, two Turtle Doves, " +
121
128
  "and a Partridge in a Pear Tree.\n";
122
- assertEquals(expectedVerseOneToThree, TwelveDays.verses(1, 3));
129
+ assertEquals(expectedVerseOneToThree, twelveDays.verses(1, 3));
123
130
  }
124
131
 
125
132
  @Ignore
@@ -167,6 +174,6 @@ public class TwelveDaysTest {
167
174
  "eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, " +
168
175
  "seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, " +
169
176
  "three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
170
- assertEquals(expectedSong, TwelveDays.sing());
177
+ assertEquals(expectedSong, twelveDays.sing());
171
178
  }
172
179
  }
@@ -8,7 +8,7 @@ install:
8
8
  - rakudobrew build zef
9
9
  - zef install JSON::Tiny
10
10
  before_script:
11
- - git submodule update --recursive --remote
11
+ - git clone https://github.com/exercism/x-common.git
12
12
  - bin/fetch-configlet
13
13
  script:
14
14
  - bin/configlet .
@@ -3,11 +3,19 @@ import unittest
3
3
  from diamond import make_diamond
4
4
 
5
5
 
6
+ # test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
7
+
6
8
  class DiamondTests(unittest.TestCase):
7
- def test_letter_A(self):
9
+ def test_degenerate_case_with_a_single_row(self):
8
10
  self.assertMultiLineEqual(make_diamond('A'), 'A\n')
9
11
 
10
- def test_letter_C(self):
12
+ def test_degenerate_case_with_two_rows(self):
13
+ result = [' A ',
14
+ 'B B',
15
+ ' A ']
16
+ self.assertMultiLineEqual(make_diamond('B'), '\n'.join(result) + '\n')
17
+
18
+ def test_smallest_non_degenerate_case_with_odd_diamond_side_length(self):
11
19
  result = [' A ',
12
20
  ' B B ',
13
21
  'C C',
@@ -15,17 +23,69 @@ class DiamondTests(unittest.TestCase):
15
23
  ' A ']
16
24
  self.assertMultiLineEqual(make_diamond('C'), '\n'.join(result) + '\n')
17
25
 
18
- def test_letter_E(self):
19
- result = [' A ',
20
- ' B B ',
21
- ' C C ',
22
- ' D D ',
23
- 'E E',
24
- ' D D ',
25
- ' C C ',
26
- ' B B ',
27
- ' A ']
28
- self.assertMultiLineEqual(make_diamond('E'), '\n'.join(result) + '\n')
26
+ def test_smallest_non_degenerate_case_with_even_diamond_side_length(self):
27
+ result = [' A ',
28
+ ' B B ',
29
+ ' C C ',
30
+ 'D D',
31
+ ' C C ',
32
+ ' B B ',
33
+ ' A ']
34
+ self.assertMultiLineEqual(make_diamond('D'), '\n'.join(result) + '\n')
35
+
36
+ def test_largest_possible_diamond(self):
37
+ result = [' A ',
38
+ ' B B ',
39
+ ' C C ',
40
+ ' D D ',
41
+ ' E E ',
42
+ ' F F ',
43
+ ' G G ',
44
+ ' H H ',
45
+ ' I I ',
46
+ ' J J ',
47
+ ' K K ',
48
+ ' L L ',
49
+ ' M M ',
50
+ ' N N ',
51
+ ' O O ',
52
+ ' P P ',
53
+ ' Q Q ',
54
+ ' R R ',
55
+ ' S S ',
56
+ ' T T ',
57
+ ' U U ',
58
+ ' V V ',
59
+ ' W W ',
60
+ ' X X ',
61
+ ' Y Y ',
62
+ 'Z Z',
63
+ ' Y Y ',
64
+ ' X X ',
65
+ ' W W ',
66
+ ' V V ',
67
+ ' U U ',
68
+ ' T T ',
69
+ ' S S ',
70
+ ' R R ',
71
+ ' Q Q ',
72
+ ' P P ',
73
+ ' O O ',
74
+ ' N N ',
75
+ ' M M ',
76
+ ' L L ',
77
+ ' K K ',
78
+ ' J J ',
79
+ ' I I ',
80
+ ' H H ',
81
+ ' G G ',
82
+ ' F F ',
83
+ ' E E ',
84
+ ' D D ',
85
+ ' C C ',
86
+ ' B B ',
87
+ ' A ']
88
+ self.assertMultiLineEqual(make_diamond('Z'), '\n'.join(result) + '\n')
29
89
 
30
90
 
31
91
  if __name__ == '__main__':
@@ -3,6 +3,9 @@ import unittest
3
3
 
4
4
  from grep import grep
5
5
 
6
+
7
+ # test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
8
+
6
9
  ILIADFILENAME = 'iliad.txt'
7
10
  ILIADCONTENTS = '''Achilles sing, O Goddess! Peleus' son;
8
11
  His wrath pernicious, who ten thousand woes
@@ -76,6 +76,16 @@ class SublistTest(unittest.TestCase):
76
76
  multiples_of_15 = list(range(15, 200, 15))
77
77
  self.assertEqual(check_lists(multiples_of_15, multiples_of_3), UNEQUAL)
78
78
 
79
+ def test_double_digits(self):
80
+ l1 = [1, 0, 1]
81
+ l2 = [10, 1]
82
+ self.assertEqual(check_lists(l1, l2), UNEQUAL)
83
+
84
+ def test_inner_spaces(self):
85
+ l1 = ['a c']
86
+ l2 = ['a', 'c']
87
+ self.assertEqual(check_lists(l1, l2), UNEQUAL)
88
+
79
89
  def test_avoid_sets(self):
80
90
  self.assertEqual(check_lists([1, 3], [1, 2, 3]), UNEQUAL)
81
91
  self.assertEqual(check_lists([1, 2, 3], [1, 3]), UNEQUAL)
@@ -0,0 +1,7 @@
1
+ # Generated by Cargo
2
+ # will have compiled files and executables
3
+ /target/
4
+
5
+ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
6
+ # More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
7
+ Cargo.lock
@@ -0,0 +1,7 @@
1
+ # Generated by Cargo
2
+ # will have compiled files and executables
3
+ /target/
4
+
5
+ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
6
+ # More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
7
+ Cargo.lock
@@ -0,0 +1,7 @@
1
+ # Generated by Cargo
2
+ # will have compiled files and executables
3
+ /target/
4
+
5
+ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
6
+ # More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
7
+ Cargo.lock
@@ -0,0 +1,7 @@
1
+ # Generated by Cargo
2
+ # will have compiled files and executables
3
+ /target/
4
+
5
+ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
6
+ # More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
7
+ Cargo.lock
@@ -0,0 +1,7 @@
1
+ # Generated by Cargo
2
+ # will have compiled files and executables
3
+ /target/
4
+
5
+ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
6
+ # More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
7
+ Cargo.lock
@@ -0,0 +1,7 @@
1
+ # Generated by Cargo
2
+ # will have compiled files and executables
3
+ /target/
4
+
5
+ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
6
+ # More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
7
+ Cargo.lock
@@ -0,0 +1,7 @@
1
+ # Generated by Cargo
2
+ # will have compiled files and executables
3
+ /target/
4
+
5
+ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
6
+ # More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
7
+ Cargo.lock
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trackler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.8.39
4
+ version: 2.0.8.40
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Owen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-03 00:00:00.000000000 Z
11
+ date: 2017-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -2625,6 +2625,10 @@ files:
2625
2625
  - tracks/elixir/exercises/scrabble-score/example.exs
2626
2626
  - tracks/elixir/exercises/scrabble-score/scrabble.exs
2627
2627
  - tracks/elixir/exercises/scrabble-score/scrabble_score_test.exs
2628
+ - tracks/elixir/exercises/secret-handshake/HINTS.md
2629
+ - tracks/elixir/exercises/secret-handshake/example.exs
2630
+ - tracks/elixir/exercises/secret-handshake/secret_handshake.exs
2631
+ - tracks/elixir/exercises/secret-handshake/secret_handshake_test.exs
2628
2632
  - tracks/elixir/exercises/series/example.exs
2629
2633
  - tracks/elixir/exercises/series/series.exs
2630
2634
  - tracks/elixir/exercises/series/series_test.exs
@@ -2637,6 +2641,10 @@ files:
2637
2641
  - tracks/elixir/exercises/space-age/example.exs
2638
2642
  - tracks/elixir/exercises/space-age/space_age.exs
2639
2643
  - tracks/elixir/exercises/space-age/space_age_test.exs
2644
+ - tracks/elixir/exercises/strain/HINTS.md
2645
+ - tracks/elixir/exercises/strain/example.exs
2646
+ - tracks/elixir/exercises/strain/strain.exs
2647
+ - tracks/elixir/exercises/strain/strain_test.exs
2640
2648
  - tracks/elixir/exercises/sublist/example.exs
2641
2649
  - tracks/elixir/exercises/sublist/sublist.exs
2642
2650
  - tracks/elixir/exercises/sublist/sublist_test.exs
@@ -6185,7 +6193,6 @@ files:
6185
6193
  - tracks/perl5/img/icon.png
6186
6194
  - tracks/perl6/.git
6187
6195
  - tracks/perl6/.gitignore
6188
- - tracks/perl6/.gitmodules
6189
6196
  - tracks/perl6/.travis.yml
6190
6197
  - tracks/perl6/LICENSE
6191
6198
  - tracks/perl6/README.md
@@ -7363,11 +7370,13 @@ files:
7363
7370
  - tracks/rust/docs/RESOURCES.md
7364
7371
  - tracks/rust/docs/TESTS.md
7365
7372
  - tracks/rust/exercises/TRACK_HINTS.md
7373
+ - tracks/rust/exercises/acronym/.gitignore
7366
7374
  - tracks/rust/exercises/acronym/Cargo.lock
7367
7375
  - tracks/rust/exercises/acronym/Cargo.toml
7368
7376
  - tracks/rust/exercises/acronym/example.rs
7369
7377
  - tracks/rust/exercises/acronym/src/lib.rs
7370
7378
  - tracks/rust/exercises/acronym/tests/acronym.rs
7379
+ - tracks/rust/exercises/all-your-base/.gitignore
7371
7380
  - tracks/rust/exercises/all-your-base/Cargo.lock
7372
7381
  - tracks/rust/exercises/all-your-base/Cargo.toml
7373
7382
  - tracks/rust/exercises/all-your-base/example.rs
@@ -7379,6 +7388,7 @@ files:
7379
7388
  - tracks/rust/exercises/allergies/example.rs
7380
7389
  - tracks/rust/exercises/allergies/src/lib.rs
7381
7390
  - tracks/rust/exercises/allergies/tests/allergies.rs
7391
+ - tracks/rust/exercises/alphametics/.gitignore
7382
7392
  - tracks/rust/exercises/alphametics/Cargo-example.toml
7383
7393
  - tracks/rust/exercises/alphametics/Cargo.lock
7384
7394
  - tracks/rust/exercises/alphametics/Cargo.toml
@@ -7391,6 +7401,7 @@ files:
7391
7401
  - tracks/rust/exercises/anagram/example.rs
7392
7402
  - tracks/rust/exercises/anagram/src/lib.rs
7393
7403
  - tracks/rust/exercises/anagram/tests/anagram.rs
7404
+ - tracks/rust/exercises/atbash-cipher/.gitignore
7394
7405
  - tracks/rust/exercises/atbash-cipher/Cargo.lock
7395
7406
  - tracks/rust/exercises/atbash-cipher/Cargo.toml
7396
7407
  - tracks/rust/exercises/atbash-cipher/example.rs
@@ -7572,6 +7583,7 @@ files:
7572
7583
  - tracks/rust/exercises/phone-number/example.rs
7573
7584
  - tracks/rust/exercises/phone-number/src/lib.rs
7574
7585
  - tracks/rust/exercises/phone-number/tests/phone-number.rs
7586
+ - tracks/rust/exercises/protein-translation/.gitignore
7575
7587
  - tracks/rust/exercises/protein-translation/Cargo.lock
7576
7588
  - tracks/rust/exercises/protein-translation/Cargo.toml
7577
7589
  - tracks/rust/exercises/protein-translation/example.rs
@@ -7589,6 +7601,7 @@ files:
7589
7601
  - tracks/rust/exercises/raindrops/example.rs
7590
7602
  - tracks/rust/exercises/raindrops/src/lib.rs
7591
7603
  - tracks/rust/exercises/raindrops/tests/raindrops.rs
7604
+ - tracks/rust/exercises/react/.gitignore
7592
7605
  - tracks/rust/exercises/react/Cargo.lock
7593
7606
  - tracks/rust/exercises/react/Cargo.toml
7594
7607
  - tracks/rust/exercises/react/example.rs
@@ -7624,6 +7637,7 @@ files:
7624
7637
  - tracks/rust/exercises/roman-numerals/example.rs
7625
7638
  - tracks/rust/exercises/roman-numerals/src/lib.rs
7626
7639
  - tracks/rust/exercises/roman-numerals/tests/roman-numerals.rs
7640
+ - tracks/rust/exercises/rotational-cipher/.gitignore
7627
7641
  - tracks/rust/exercises/rotational-cipher/Cargo.lock
7628
7642
  - tracks/rust/exercises/rotational-cipher/Cargo.toml
7629
7643
  - tracks/rust/exercises/rotational-cipher/example.rs
@@ -1,3 +0,0 @@
1
- [submodule "x-common"]
2
- path = x-common
3
- url = https://github.com/exercism/x-common.git