trackler 2.0.8.19 → 2.0.8.20

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/phone-number/canonical-data.json +2 -2
  3. data/lib/trackler/version.rb +1 -1
  4. data/tracks/c/config.json +7 -0
  5. data/tracks/c/exercises/react/makefile +16 -0
  6. data/tracks/c/exercises/react/src/example.c +185 -0
  7. data/tracks/c/exercises/react/src/react.h +29 -0
  8. data/tracks/c/exercises/react/test/test_react.c +324 -0
  9. data/tracks/c/exercises/react/test/vendor/unity.c +1300 -0
  10. data/tracks/c/exercises/react/test/vendor/unity.h +274 -0
  11. data/tracks/c/exercises/react/test/vendor/unity_internals.h +701 -0
  12. data/tracks/csharp/.travis.yml +2 -9
  13. data/tracks/csharp/appveyor.yml +3 -3
  14. data/tracks/csharp/build.cake +13 -4
  15. data/tracks/csharp/build.ps1 +56 -164
  16. data/tracks/csharp/build.sh +33 -78
  17. data/tracks/csharp/circle.yml +2 -4
  18. data/tracks/csharp/config.json +2 -1
  19. data/tracks/csharp/exercises/leap/LeapTest.cs +8 -8
  20. data/tracks/csharp/generators/CanonicalData.cs +19 -0
  21. data/tracks/csharp/generators/CanonicalDataCase.cs +24 -0
  22. data/tracks/csharp/generators/CanonicalDataCaseJsonConverter.cs +32 -0
  23. data/tracks/csharp/generators/CanonicalDataCasesJsonConverter.cs +30 -0
  24. data/tracks/csharp/generators/CanonicalDataParser.cs +28 -0
  25. data/tracks/csharp/generators/ExerciseCollection.cs +23 -0
  26. data/tracks/csharp/generators/Exercises/Exercise.cs +14 -0
  27. data/tracks/csharp/generators/Exercises/LeapExercise.cs +35 -0
  28. data/tracks/csharp/generators/Generators.csproj +12 -0
  29. data/tracks/csharp/generators/Generators.csproj.user +6 -0
  30. data/tracks/csharp/generators/Generators.sln +22 -0
  31. data/tracks/csharp/generators/Program.cs +59 -0
  32. data/tracks/csharp/generators/TestClass.cs +13 -0
  33. data/tracks/csharp/generators/TestClassRenderer.cs +36 -0
  34. data/tracks/csharp/generators/TestMethod.cs +9 -0
  35. data/tracks/csharp/generators/TestMethodNameTransformer.cs +11 -0
  36. data/tracks/csharp/generators/TestMethodRenderer.cs +18 -0
  37. data/tracks/csharp/generators/To.cs +7 -0
  38. data/tracks/csharp/generators/generate.ps1 +2 -0
  39. data/tracks/csharp/generators/generate.sh +4 -0
  40. data/tracks/delphi/config.json +8 -0
  41. data/tracks/delphi/exercises/phone-number/uPhoneNumberExample.pas +6 -6
  42. data/tracks/delphi/exercises/phone-number/uPhoneNumberTests.pas +28 -17
  43. data/tracks/delphi/exercises/roman-numerals/RomanNumerals.dpr +60 -0
  44. data/tracks/delphi/exercises/roman-numerals/uRomanNumeralsExample.pas +49 -0
  45. data/tracks/delphi/exercises/roman-numerals/uRomanNumeralsTest.pas +216 -0
  46. data/tracks/elixir/config.json +22 -0
  47. data/tracks/elixir/exercises/poker/example.exs +136 -0
  48. data/tracks/elixir/exercises/poker/poker.exs +34 -0
  49. data/tracks/elixir/exercises/poker/poker_test.exs +217 -0
  50. data/tracks/elixir/exercises/protein-translation/example.exs +62 -0
  51. data/tracks/elixir/exercises/protein-translation/protein_translation.exs +34 -0
  52. data/tracks/elixir/exercises/protein-translation/protein_translation_test.exs +87 -0
  53. data/tracks/elixir/exercises/say/example.exs +139 -0
  54. data/tracks/elixir/exercises/say/say.exs +8 -0
  55. data/tracks/elixir/exercises/say/say_test.exs +85 -0
  56. data/tracks/go/exercises/robot-name/example.go +2 -0
  57. data/tracks/go/exercises/robot-name/robot_name_test.go +9 -1
  58. data/tracks/go/exercises/roman-numerals/roman_numerals_test.go +4 -1
  59. data/tracks/go/exercises/saddle-points/saddle_points_test.go +6 -6
  60. data/tracks/php/config.json +7 -0
  61. data/tracks/php/exercises/grade-school/example.php +35 -0
  62. data/tracks/php/exercises/grade-school/grade-school_test.php +84 -0
  63. metadata +43 -2
@@ -0,0 +1,34 @@
1
+ defmodule ProteinTranslation do
2
+ @doc """
3
+ Given an RNA string, return a list of proteins specified by codons, in order.
4
+ """
5
+ @spec of_rna(String.t()) :: { atom, list(String.t()) }
6
+ def of_rna(rna) do
7
+ end
8
+
9
+ @doc """
10
+ Given a codon, return the corresponding protein
11
+
12
+ UGU -> Cysteine
13
+ UGC -> Cysteine
14
+ UUA -> Leucine
15
+ UUG -> Leucine
16
+ AUG -> Methionine
17
+ UUU -> Phenylalanine
18
+ UUC -> Phenylalanine
19
+ UCU -> Serine
20
+ UCC -> Serine
21
+ UCA -> Serine
22
+ UCG -> Serine
23
+ UGG -> Tryptophan
24
+ UAU -> Tyrosine
25
+ UAC -> Tyrosine
26
+ UAA -> STOP
27
+ UAG -> STOP
28
+ UGA -> STOP
29
+ """
30
+ @spec of_codon(String.t()) :: { atom, String.t() }
31
+ def of_codon(codon) do
32
+ end
33
+ end
34
+
@@ -0,0 +1,87 @@
1
+ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
2
+ Code.load_file("protein_translation.exs", __DIR__)
3
+ end
4
+
5
+ ExUnit.start
6
+ ExUnit.configure exclude: :pending, trace: true
7
+
8
+ defmodule ProteinTranslationTest do
9
+ use ExUnit.Case
10
+
11
+ #@tag :pending
12
+ test "AUG translates to methionine" do
13
+ assert ProteinTranslation.of_codon("AUG") == { :ok, "Methionine" }
14
+ end
15
+
16
+ @tag :pending
17
+ test "identifies Phenylalanine codons" do
18
+ assert ProteinTranslation.of_codon("UUU") == { :ok, "Phenylalanine" }
19
+ assert ProteinTranslation.of_codon("UUC") == { :ok, "Phenylalanine" }
20
+ end
21
+
22
+ @tag :pending
23
+ test "identifies Leucine codons" do
24
+ assert ProteinTranslation.of_codon("UUA") == { :ok, "Leucine" }
25
+ assert ProteinTranslation.of_codon("UUG") == { :ok, "Leucine" }
26
+ end
27
+
28
+ @tag :pending
29
+ test "identifies Serine codons" do
30
+ assert ProteinTranslation.of_codon("UCU") == { :ok, "Serine" }
31
+ assert ProteinTranslation.of_codon("UCC") == { :ok, "Serine" }
32
+ assert ProteinTranslation.of_codon("UCA") == { :ok, "Serine" }
33
+ assert ProteinTranslation.of_codon("UCG") == { :ok, "Serine" }
34
+ end
35
+
36
+ @tag :pending
37
+ test "identifies Tyrosine codons" do
38
+ assert ProteinTranslation.of_codon("UAU") == { :ok, "Tyrosine" }
39
+ assert ProteinTranslation.of_codon("UAC") == { :ok, "Tyrosine" }
40
+ end
41
+
42
+ @tag :pending
43
+ test "identifies Cysteine codons" do
44
+ assert ProteinTranslation.of_codon("UGU") == { :ok, "Cysteine" }
45
+ assert ProteinTranslation.of_codon("UGC") == { :ok, "Cysteine" }
46
+ end
47
+
48
+ @tag :pending
49
+ test "identifies Tryptophan codons" do
50
+ assert ProteinTranslation.of_codon("UGG") == { :ok, "Tryptophan" }
51
+ end
52
+
53
+ @tag :pending
54
+ test "identifies stop codons" do
55
+ assert ProteinTranslation.of_codon("UAA") == { :ok, "STOP" }
56
+ assert ProteinTranslation.of_codon("UAG") == { :ok, "STOP" }
57
+ assert ProteinTranslation.of_codon("UGA") == { :ok, "STOP" }
58
+ end
59
+
60
+ @tag :pending
61
+ test "translates rna strand into correct protein" do
62
+ strand = "AUGUUUUGG"
63
+ assert ProteinTranslation.of_rna(strand) == { :ok, ~w(Methionine Phenylalanine Tryptophan) }
64
+ end
65
+
66
+ @tag :pending
67
+ test "stops translation if stop codon present" do
68
+ strand = "AUGUUUUAA"
69
+ assert ProteinTranslation.of_rna(strand) == { :ok, ~w(Methionine Phenylalanine) }
70
+ end
71
+
72
+ @tag :pending
73
+ test "stops translation of longer strand" do
74
+ strand = "UGGUGUUAUUAAUGGUUU"
75
+ assert ProteinTranslation.of_rna(strand) == { :ok, ~w(Tryptophan Cysteine Tyrosine) }
76
+ end
77
+
78
+ @tag :pending
79
+ test "invalid RNA" do
80
+ assert ProteinTranslation.of_rna("CARROT") == { :error, "invalid RNA" }
81
+ end
82
+
83
+ @tag :pending
84
+ test "invalid codon" do
85
+ assert ProteinTranslation.of_codon("INVALID") == { :error, "invalid codon" }
86
+ end
87
+ end
@@ -0,0 +1,139 @@
1
+ defmodule Say do
2
+ @moduledoc """
3
+ This example solution takes an integer and breaks it into chunks of 3 and
4
+ translates those chunks the same. The larger denominations (e.g. 'thousand')
5
+ are added if there are multiple chunks to translate. Here are a few examples:
6
+
7
+ - `Say.in_english(23)` creates the chunk of `[0, 2, 3]` and invokes
8
+ `translate_chunk` on that to produce "twenty-three".
9
+ - `Say.in_english(1_234)` creates the chunks of `[0, 0, 1]` and `[2, 3, 4]`,
10
+ which `translate_chunk` will translate to "one" and
11
+ "two hundred thirty-four" and `translate_chunks` will combine them for
12
+ `one thousand two hundred thirty-four`.
13
+
14
+ Padding the chunks with leading zeroes gives us nice and even chunks of 3
15
+ digits to translate.
16
+ """
17
+
18
+ @small_numbers ~w(
19
+ one two three four five six seven eight nine ten
20
+ eleven twelve thirteen fourteen fifteen sixteen
21
+ seventeen eighteen nineteen
22
+ )
23
+
24
+ @decades ~w(
25
+ twenty thirty forty fifty sixty seventy eighty ninety
26
+ )
27
+
28
+ @separators ~w(thousand million billion)
29
+
30
+ @doc """
31
+ Translate a positive integer into English.
32
+ """
33
+
34
+ @spec in_english(Integer.t) :: {atom, String.t}
35
+ def in_english(number) when number < 0 or number >= 1_000_000_000_000 do
36
+ {:error, "number is out of range"}
37
+ end
38
+ def in_english(0), do: {:ok, "zero"}
39
+ def in_english(number) do
40
+ result = Integer.digits(number)
41
+ |> padded_chunk(3, 0)
42
+ |> translate_chunks
43
+ |> clean_join(" ")
44
+
45
+ {:ok, result}
46
+ end
47
+
48
+
49
+ @spec translate_chunks(List.t) :: [String.t]
50
+ defp translate_chunks(chunks) do
51
+ translate_chunks(chunks, Enum.count(chunks))
52
+ end
53
+
54
+
55
+ @spec translate_chunks(List.t, Integer.t) :: [String.t]
56
+ defp translate_chunks([chunk], 1), do: [translate_chunk(chunk)]
57
+ defp translate_chunks([[0, 0, 0] | remaining], n) do
58
+ translate_chunks(remaining, n - 1)
59
+ end
60
+ defp translate_chunks([chunk | remaining], n) do
61
+ chunk_in_english = [
62
+ translate_chunk(chunk),
63
+ Enum.at(@separators, n - 2)
64
+ ]
65
+ |> clean_join(" ")
66
+
67
+ [ chunk_in_english | translate_chunks(remaining, n - 1) ]
68
+ end
69
+
70
+
71
+ @spec translate_chunk([Integer.t]) :: String.t
72
+ defp translate_chunk([0, 0, 0]), do: ""
73
+ defp translate_chunk([0, 0, ones]), do: ones_in_english(ones)
74
+ defp translate_chunk([0, 1, ones]) do
75
+ ones_in_english(ones + 10)
76
+ end
77
+ defp translate_chunk([0, tens, 0]), do: tens_in_english(tens)
78
+ defp translate_chunk([0, tens, ones]) do
79
+ [
80
+ tens_in_english(tens),
81
+ ones_in_english(ones)
82
+ ]
83
+ |> clean_join("-")
84
+ end
85
+ defp translate_chunk([hundreds, 0, 0]) do
86
+ "#{ones_in_english(hundreds)} hundred"
87
+ end
88
+ defp translate_chunk([hundreds, tens, ones]) do
89
+ [
90
+ translate_chunk([hundreds, 0, 0]),
91
+ translate_chunk([0, tens, ones])
92
+ ]
93
+ |> clean_join(" ")
94
+ end
95
+
96
+
97
+ @spec ones_in_english(Integer.t) :: String.t
98
+ defp ones_in_english(index), do: Enum.at(@small_numbers, index - 1)
99
+
100
+
101
+ @spec tens_in_english(Integer.t) :: String.t
102
+ defp tens_in_english(index), do: Enum.at(@decades, index - 2)
103
+
104
+
105
+ @spec clean_join([any], String.t) :: String.t
106
+ defp clean_join(collection, separator) do
107
+ collection
108
+ |> reject_blank
109
+ |> Enum.join(separator)
110
+ end
111
+
112
+
113
+ @spec reject_blank([any]) :: [any]
114
+ defp reject_blank(col) do
115
+ col
116
+ |> Enum.reject(&(&1 == nil || &1 == ""))
117
+ end
118
+
119
+
120
+ @spec padded_chunk([any], Integer.t, any) :: [any]
121
+ defp padded_chunk(list, chunk_size, pad) do
122
+ pad_size = pad_size(chunk_size, rem(Enum.count(list), chunk_size))
123
+
124
+ pad(list, pad, pad_size)
125
+ |> Enum.chunk(chunk_size)
126
+ end
127
+
128
+
129
+ @spec pad_size(Integer.t, Integer.t) :: Integer.t
130
+ defp pad_size(_, 0), do: 0
131
+ defp pad_size(total, rem), do: total - rem
132
+
133
+
134
+ @spec pad([any], any, Integer.t) :: [any]
135
+ defp pad(list, _, 0), do: list
136
+ defp pad(list, pad, count) do
137
+ [pad] ++ pad(list, pad, count - 1)
138
+ end
139
+ end
@@ -0,0 +1,8 @@
1
+ defmodule Say do
2
+ @doc """
3
+ Translate a positive integer into English.
4
+ """
5
+ @spec in_english(integer) :: {atom, String.t}
6
+ def in_english(number) do
7
+ end
8
+ end
@@ -0,0 +1,85 @@
1
+ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
2
+ Code.load_file("say.exs", __DIR__)
3
+ end
4
+
5
+ ExUnit.start
6
+ ExUnit.configure exclude: :pending, trace: true
7
+
8
+ defmodule SayTest do
9
+ use ExUnit.Case
10
+
11
+ # @tag :pending
12
+ test "zero" do
13
+ assert Say.in_english(0) == {:ok, "zero"}
14
+ end
15
+
16
+ @tag :pending
17
+ test "one" do
18
+ assert Say.in_english(1) == {:ok, "one"}
19
+ end
20
+
21
+ @tag :pending
22
+ test "fourteen" do
23
+ assert Say.in_english(14) == {:ok, "fourteen"}
24
+ end
25
+
26
+ @tag :pending
27
+ test "twenty" do
28
+ assert Say.in_english(20) == {:ok, "twenty"}
29
+ end
30
+
31
+ @tag :pending
32
+ test "twenty-two" do
33
+ assert Say.in_english(22) == {:ok, "twenty-two"}
34
+ end
35
+
36
+ @tag :pending
37
+ test "one hundred" do
38
+ assert Say.in_english(100) == {:ok, "one hundred"}
39
+ end
40
+
41
+ @tag :pending
42
+ test "one hundred twenty-three" do
43
+ assert Say.in_english(123) == {:ok, "one hundred twenty-three"}
44
+ end
45
+
46
+ @tag :pending
47
+ test "one thousand" do
48
+ assert Say.in_english(1_000) == {:ok, "one thousand"}
49
+ end
50
+
51
+ @tag :pending
52
+ test "one thousand two hundred thirty-four" do
53
+ assert Say.in_english(1_234) == {:ok, "one thousand two hundred thirty-four"}
54
+ end
55
+
56
+ @tag :pending
57
+ test "one million" do
58
+ assert Say.in_english(1_000_000) == {:ok, "one million"}
59
+ end
60
+
61
+ @tag :pending
62
+ test "one million two thousand three hundred forty-five" do
63
+ assert Say.in_english(1_002_345) == {:ok, "one million two thousand three hundred forty-five"}
64
+ end
65
+
66
+ @tag :pending
67
+ test "one billion" do
68
+ assert Say.in_english(1_000_000_000) == {:ok, "one billion"}
69
+ end
70
+
71
+ @tag :pending
72
+ test "a big number" do
73
+ assert Say.in_english(987_654_321_123) == {:ok, "nine hundred eighty-seven billion six hundred fifty-four million three hundred twenty-one thousand one hundred twenty-three"}
74
+ end
75
+
76
+ @tag :pending
77
+ test "numbers below zero are out of range" do
78
+ assert Say.in_english(-1) == {:error, "number is out of range"}
79
+ end
80
+
81
+ @tag :pending
82
+ test "numbers above 999,999,999,999 are out of range" do
83
+ assert Say.in_english(1_000_000_000_000) == {:error, "number is out of range"}
84
+ end
85
+ end
@@ -7,6 +7,8 @@ import (
7
7
  "math/rand"
8
8
  )
9
9
 
10
+ const testVersion = 1
11
+
10
12
  type Robot struct {
11
13
  name string
12
14
  }
@@ -5,10 +5,18 @@ import (
5
5
  "testing"
6
6
  )
7
7
 
8
- func New() *Robot { return new(Robot) }
8
+ const targetTestVersion = 1
9
9
 
10
10
  var namePat = regexp.MustCompile(`^[A-Z]{2}\d{3}$`)
11
11
 
12
+ func New() *Robot { return new(Robot) }
13
+
14
+ func TestTestVersion(t *testing.T) {
15
+ if testVersion != targetTestVersion {
16
+ t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
17
+ }
18
+ }
19
+
12
20
  func TestNameValid(t *testing.T) {
13
21
  n := New().Name()
14
22
  if !namePat.MatchString(n) {
@@ -4,10 +4,13 @@ import "testing"
4
4
 
5
5
  const targetTestVersion = 3
6
6
 
7
- func TestRomanNumerals(t *testing.T) {
7
+ func TestTestVersion(t *testing.T) {
8
8
  if testVersion != targetTestVersion {
9
9
  t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
10
10
  }
11
+ }
12
+
13
+ func TestRomanNumerals(t *testing.T) {
11
14
  tc := append(romanNumeralTests, []romanNumeralTest{
12
15
  {0, "", true},
13
16
  {-1, "", true},
@@ -20,6 +20,12 @@ var tests = []struct {
20
20
  {"4 5 4\n3 5 5\n1 5 4", []Pair{{0, 1}, {1, 1}, {2, 1}}},
21
21
  }
22
22
 
23
+ func TestTestVersion(t *testing.T) {
24
+ if testVersion != targetTestVersion {
25
+ t.Fatalf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
26
+ }
27
+ }
28
+
23
29
  func TestSaddle(t *testing.T) {
24
30
  for _, test := range tests {
25
31
  m, err := New(test.m)
@@ -51,12 +57,6 @@ exp:
51
57
  return true
52
58
  }
53
59
 
54
- func TestTestVersion(t *testing.T) {
55
- if testVersion != targetTestVersion {
56
- t.Errorf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
57
- }
58
- }
59
-
60
60
  func BenchmarkSaddle(b *testing.B) {
61
61
  ms := make([]*Matrix, len(tests))
62
62
  var err error
@@ -355,6 +355,13 @@
355
355
  "Control-flow (loops)",
356
356
  "Integers"
357
357
  ]
358
+ },
359
+ {
360
+ "slug": "grade-school",
361
+ "difficulty": 6,
362
+ "topics": [
363
+ "Arrays"
364
+ ]
358
365
  }
359
366
  ]
360
367
  }