trackler 2.1.0.12 → 2.1.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/difference-of-squares/canonical-data.json +15 -21
  3. data/lib/trackler/version.rb +1 -1
  4. data/tracks/c/config.json +9 -0
  5. data/tracks/c/exercises/scrabble-score/makefile +16 -0
  6. data/tracks/c/exercises/scrabble-score/src/example.c +43 -0
  7. data/tracks/c/exercises/scrabble-score/src/example.h +6 -0
  8. data/tracks/c/exercises/scrabble-score/test/test_scrabble_score.c +77 -0
  9. data/tracks/c/exercises/scrabble-score/test/vendor/unity.c +1300 -0
  10. data/tracks/c/exercises/scrabble-score/test/vendor/unity.h +274 -0
  11. data/tracks/c/exercises/scrabble-score/test/vendor/unity_internals.h +701 -0
  12. data/tracks/csharp/exercises/grade-school/Example.cs +1 -1
  13. data/tracks/csharp/exercises/grade-school/GradeSchoolTest.cs +8 -8
  14. data/tracks/elixir/README.md +29 -12
  15. data/tracks/elixir/SETUP.md +0 -1
  16. data/tracks/elixir/docs/ABOUT.md +21 -7
  17. data/tracks/elixir/docs/LEARNING.md +4 -2
  18. data/tracks/elixir/docs/RESOURCES.md +2 -2
  19. data/tracks/elixir/docs/TESTS.md +0 -2
  20. data/tracks/go/exercises/atbash-cipher/.meta/gen.go +61 -0
  21. data/tracks/go/exercises/atbash-cipher/atbash_cipher_test.go +1 -16
  22. data/tracks/go/exercises/atbash-cipher/cases_test.go +61 -0
  23. data/tracks/go/exercises/atbash-cipher/example.go +1 -1
  24. data/tracks/java/exercises/hamming/src/main/java/Hamming.java +9 -0
  25. data/tracks/java/exercises/simple-linked-list/src/test/java/SimpleLinkedListTest.java +4 -4
  26. data/tracks/javascript/docs/TESTS.md +1 -1
  27. data/tracks/ocaml/config.json +5 -0
  28. data/tracks/ocaml/exercises/acronym/test.ml +2 -0
  29. data/tracks/ocaml/exercises/all-your-base/test.ml +2 -0
  30. data/tracks/ocaml/exercises/anagram/test.ml +2 -0
  31. data/tracks/ocaml/exercises/atbash-cipher/test.ml +3 -0
  32. data/tracks/ocaml/exercises/beer-song/test.ml +2 -0
  33. data/tracks/ocaml/exercises/binary-search/.merlin +5 -0
  34. data/tracks/ocaml/exercises/binary-search/Makefile +11 -0
  35. data/tracks/ocaml/exercises/binary-search/binary_search.mli +2 -0
  36. data/tracks/ocaml/exercises/binary-search/example.ml +19 -0
  37. data/tracks/ocaml/exercises/binary-search/test.ml +38 -0
  38. data/tracks/ocaml/exercises/bob/test.ml +2 -0
  39. data/tracks/ocaml/exercises/bowling/test.ml +2 -0
  40. data/tracks/ocaml/exercises/bracket-push/test.ml +2 -0
  41. data/tracks/ocaml/exercises/change/test.ml +2 -0
  42. data/tracks/ocaml/exercises/connect/test.ml +2 -0
  43. data/tracks/ocaml/exercises/difference-of-squares/test.ml +10 -8
  44. data/tracks/ocaml/exercises/dominoes/test.ml +2 -0
  45. data/tracks/ocaml/exercises/etl/test.ml +2 -0
  46. data/tracks/ocaml/exercises/hamming/test.ml +2 -0
  47. data/tracks/ocaml/exercises/hello-world/test.ml +2 -0
  48. data/tracks/ocaml/exercises/leap/test.ml +2 -0
  49. data/tracks/ocaml/exercises/luhn/test.ml +2 -0
  50. data/tracks/ocaml/exercises/minesweeper/test.ml +2 -0
  51. data/tracks/ocaml/exercises/pangram/test.ml +2 -0
  52. data/tracks/ocaml/exercises/phone-number/test.ml +2 -0
  53. data/tracks/ocaml/exercises/prime-factors/test.ml +2 -0
  54. data/tracks/ocaml/exercises/raindrops/test.ml +2 -0
  55. data/tracks/ocaml/exercises/roman-numerals/test.ml +2 -0
  56. data/tracks/ocaml/exercises/run-length-encoding/test.ml +2 -0
  57. data/tracks/ocaml/exercises/say/test.ml +2 -0
  58. data/tracks/ocaml/exercises/space-age/test.ml +2 -0
  59. data/tracks/ocaml/exercises/triangle/test.ml +2 -0
  60. data/tracks/ocaml/exercises/word-count/test.ml +2 -0
  61. data/tracks/ocaml/tools/test-generator/src/controller.ml +15 -5
  62. data/tracks/ocaml/tools/test-generator/src/model.ml +5 -0
  63. data/tracks/ocaml/tools/test-generator/src/parser.ml +5 -4
  64. data/tracks/ocaml/tools/test-generator/src/special_cases.ml +12 -0
  65. data/tracks/ocaml/tools/test-generator/templates/binary-search/template.ml +20 -0
  66. data/tracks/ocaml/tools/test-generator/templates/change/template.ml +2 -2
  67. data/tracks/ocaml/tools/test-generator/templates/say/template.ml +1 -1
  68. data/tracks/ocaml/tools/test-generator/test/parser_test.ml +1 -1
  69. data/tracks/r/docs/TESTS.md +24 -4
  70. data/tracks/ruby/exercises/trinary/trinary_test.rb +1 -0
  71. data/tracks/scala/config.json +9 -0
  72. data/tracks/scala/exercises/accumulate/src/main/scala/Accumulate.scala +3 -0
  73. data/tracks/scala/exercises/bob/src/main/scala/Bob.scala +3 -0
  74. data/tracks/scala/exercises/difference-of-squares/src/main/scala/Squares.scala +8 -0
  75. data/tracks/scala/exercises/gigasecond/src/main/scala/Gigasecond.scala +8 -0
  76. data/tracks/scala/exercises/grade-school/src/main/scala/School.scala +11 -0
  77. data/tracks/scala/exercises/pangram/src/main/scala/Pangrams.scala +4 -0
  78. data/tracks/scala/exercises/protein-translation/build.sbt +3 -0
  79. data/tracks/scala/exercises/protein-translation/example.scala +41 -0
  80. data/tracks/scala/exercises/protein-translation/src/main/scala/.keep +0 -0
  81. data/tracks/scala/exercises/protein-translation/src/test/scala/ProteinTranslationTest.scala +59 -0
  82. data/tracks/scala/exercises/space-age/src/main/scala/SpaceAge.scala +10 -0
  83. metadata +28 -2
@@ -0,0 +1,20 @@
1
+ open Core.Std
2
+ open OUnit2
3
+ open Binary_search
4
+
5
+ let option_to_string f = function
6
+ | None -> "None"
7
+ | Some x -> "Some " ^ f x
8
+
9
+ let ae exp got _test_ctxt =
10
+ assert_equal ~printer:(option_to_string Int.to_string) exp got
11
+
12
+ let tests = [
13
+ (* TEST
14
+ "$description" >::
15
+ ae $expected (find $array $value);
16
+ END TEST *)
17
+ ]
18
+
19
+ let () =
20
+ run_test_tt_main ("binary-search tests" >::: tests)
@@ -8,8 +8,8 @@ let ae exp got _test_ctxt = assert_equal ~printer exp got
8
8
  let tests = [
9
9
  (* TEST
10
10
  "$description" >::
11
- ae $expected
12
- (make_change ~target:$target ~coins:$coins);
11
+ ae $expected
12
+ (make_change ~target:$target ~coins:$coins);
13
13
  END TEST *)
14
14
  ]
15
15
 
@@ -8,7 +8,7 @@ let tests = [
8
8
  (* TEST
9
9
  "$description" >:: (
10
10
  ae $expected
11
- (in_english $input));
11
+ (in_english $input));
12
12
  END TEST *)
13
13
  "all numbers from 1 to 10_000 can be spelt">::(fun _ ->
14
14
  assert_bool "range test" (Sequence.range 0 10_000
@@ -7,7 +7,7 @@ let ae exp got _test_ctxt = assert_equal exp got
7
7
 
8
8
  let single x = Ok (Single x)
9
9
 
10
- let call_parser json = parse_json_text json "expected" "cases"
10
+ let call_parser json = parse_json_text json "expected" "cases" |> Result.map ~f:(fun c -> c.tests)
11
11
 
12
12
  let parser_tests = [
13
13
  "gives an error with a json map that does not have the key cases in" >::
@@ -1,7 +1,27 @@
1
- # How to test/verify your solution
1
+ # Install `testthat`
2
2
 
3
- Each problem will have a script named something like `test_problem.R` (e.g. `test_hello-world.R`). In RStudio, you can simply run this script to test your solution. What this will do is load your solution code through the `source` command on the first line, and then the suite of `testthat` tests below.
3
+ Tests for this track make use of the `testthat` package.
4
4
 
5
- That can be conveniently done with [testthat's `auto_test` function](https://www.rdocumentation.org/packages/testthat/topics/auto_test). Because exercism code and tests are in the same folder, use this same path for both `code_path` and `test_path` parameters.
5
+ To install the package, simply open up R and run:
6
6
 
7
- If you prefer, you can also run the tests on the command line with `Rscript test_problem.R` (e.g. `Rscript test_hello-world.R`).
7
+ `install.packages("testthat")`
8
+
9
+ You can check that the package is installed successfully by running:
10
+
11
+ `library(testthat)`
12
+
13
+ # Running Tests
14
+
15
+ Each problem will have a script named `test_<exercise-name>.R` (e.g. `test_hello-world.R`).
16
+
17
+ To run the tests for an exercise, simply execute this R script.
18
+
19
+ In RStudio, this is as simple as opening the test script, and clicking "Source" at the top right of the source pane. This will load your solution code through the `source` command on the first line of the test script, and then execute the suite of `testthat` tests that follow.
20
+
21
+ Note however, that the `source()` command on the first line of the test script will only work if your solution script (`<exercise-name>.R`) is located in your working directory. If this is not the case, you'll need to either:
22
+ - change your working directory eg. `setwd('exercism/R/hello-world/')`, or
23
+ - update the first line of the test script e.g. `source('exercism/R/hello-world/test_hello-world.R')`
24
+
25
+ If you prefer, you can also run the tests from the command line with `Rscript path_to_exercise_directory/test_<exercise-name>.R` (e.g. `Rscript hello-world/test_hello-world.R`)
26
+
27
+ Another convenient way to run these tests is to make use of [testthat's `auto_test` function](https://www.rdocumentation.org/packages/testthat/topics/auto_test). Since exercism code and tests are located in the same folder, use this same path for both the `code_path` and `test_path` parameters. After running `auto_test()`, the tests for the exercise will be executed automatically each time you update/save your R code for the exercise. This can help facilitate rapid iteration while working on your solution.
@@ -78,6 +78,7 @@ class TrinaryTest < Minitest::Test
78
78
  # If you are curious, read more about constants on RubyDoc:
79
79
  # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.htm
80
80
  def test_bookkeeping
81
+ skip
81
82
  assert_equal 1, BookKeeping::VERSION
82
83
  end
83
84
  end
@@ -236,6 +236,15 @@
236
236
  "Structural equality"
237
237
  ]
238
238
  },
239
+ {
240
+ "slug":"protein-translation",
241
+ "difficulty":3,
242
+ "topics":[
243
+ "Strings",
244
+ "Transforming",
245
+ "Sequences"
246
+ ]
247
+ },
239
248
  {
240
249
  "slug":"matrix",
241
250
  "difficulty":4,
@@ -0,0 +1,3 @@
1
+ class Accumulate {
2
+ def accumulate[A, B](f: (A) => B, list : List[A]): List[B] = ???
3
+ }
@@ -0,0 +1,3 @@
1
+ class Bob {
2
+ def hey(statement: String): String = ???
3
+ }
@@ -0,0 +1,8 @@
1
+ object Squares {
2
+
3
+ def sumOfSquares(n: Int): Int = ???
4
+
5
+ def squareOfSums(n: Int): Int = ???
6
+
7
+ def difference(n: Int): Int = ???
8
+ }
@@ -0,0 +1,8 @@
1
+ import java.time.LocalDate
2
+ import java.time.LocalDateTime
3
+
4
+ object Gigasecond {
5
+ def addGigaseconds(startDate: LocalDate): LocalDateTime = ???
6
+
7
+ def addGigaseconds(startDateTime: LocalDateTime): LocalDateTime = ???
8
+ }
@@ -0,0 +1,11 @@
1
+ class School {
2
+ type DB = Map[Int, Seq[String]]
3
+
4
+ def add(name: String, g: Int) = ???
5
+
6
+ def db: DB = ???
7
+
8
+ def grade(g: Int): Seq[String] = ???
9
+
10
+ def sorted: DB = ???
11
+ }
@@ -0,0 +1,4 @@
1
+ object Pangrams {
2
+ def isPangram(input: String): Boolean = ???
3
+ }
4
+
@@ -0,0 +1,3 @@
1
+ scalaVersion := "2.12.1"
2
+
3
+ libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"
@@ -0,0 +1,41 @@
1
+ import scala.annotation.tailrec
2
+
3
+ object ProteinTranslation {
4
+
5
+ private val translations = Map(
6
+ "AUG" -> "Methionine",
7
+ "UUU" -> "Phenylalanine",
8
+ "UUC" -> "Phenylalanine",
9
+ "UUA" -> "Leucine",
10
+ "UUG" -> "Leucine",
11
+ "UCU" -> "Serine",
12
+ "UCC" -> "Serine",
13
+ "UCA" -> "Serine",
14
+ "UCG" -> "Serine",
15
+ "UAU" -> "Tyrosine",
16
+ "UAC" -> "Tyrosine",
17
+ "UGU" -> "Cysteine",
18
+ "UGC" -> "Cysteine",
19
+ "UGG" -> "Tryptophan",
20
+ "UAA" -> "STOP",
21
+ "UAG" -> "STOP",
22
+ "UGA" -> "STOP")
23
+
24
+ /**
25
+ * Note that this solution ignores invalid Codons.
26
+ */
27
+ def translate(input: String): Seq[String] = {
28
+ @tailrec
29
+ def translate_internal(acc: Seq[String], strs: Seq[String]): Seq[String] = {
30
+ strs match {
31
+ case x::xs => translations get x match {
32
+ case Some(codon) => if ("STOP".equals(codon)) acc.reverse else translate_internal(codon +: acc, xs)
33
+ case _ => translate_internal(acc, xs)
34
+ }
35
+ case _ => acc.reverse
36
+ }
37
+ }
38
+
39
+ translate_internal(Seq(), input.grouped(3).toList)
40
+ }
41
+ }
@@ -0,0 +1,59 @@
1
+ import org.scalatest.{FunSuite, Matchers}
2
+
3
+ class ProteinTranslationTest extends FunSuite with Matchers {
4
+ test("Identifies methionine codon") {
5
+ ProteinTranslation.translate("AUG") should be(Seq("Methionine"))
6
+ }
7
+
8
+ test("Identifies phenylalanine codons") {
9
+ pending
10
+ ProteinTranslation.translate("UUU") should be(Seq("Phenylalanine"))
11
+ ProteinTranslation.translate("UUC") should be(Seq("Phenylalanine"))
12
+ }
13
+
14
+ test("Identifies leucine codons") {
15
+ pending
16
+ ProteinTranslation.translate("UUA") should be(Seq("Leucine"))
17
+ ProteinTranslation.translate("UUG") should be(Seq("Leucine"))
18
+ }
19
+
20
+ test("Identifies serine codons") {
21
+ pending
22
+ ProteinTranslation.translate("UCU") should be(Seq("Serine"))
23
+ ProteinTranslation.translate("UCC") should be(Seq("Serine"))
24
+ ProteinTranslation.translate("UCA") should be(Seq("Serine"))
25
+ ProteinTranslation.translate("UCG") should be(Seq("Serine"))
26
+ }
27
+
28
+ test("Identifies tyrosine codons") {
29
+ pending
30
+ ProteinTranslation.translate("UAU") should be(Seq("Tyrosine"))
31
+ ProteinTranslation.translate("UAC") should be(Seq("Tyrosine"))
32
+ }
33
+
34
+ test("Identifies cysteine codons") {
35
+ pending
36
+ ProteinTranslation.translate("UGU") should be(Seq("Cysteine"))
37
+ ProteinTranslation.translate("UGC") should be(Seq("Cysteine"))
38
+ }
39
+
40
+ test("Identifies tryptophan codons") {
41
+ pending
42
+ ProteinTranslation.translate("UGG") should be(Seq("Tryptophan"))
43
+ }
44
+
45
+ test("Translate RNA strand into correct protein") {
46
+ pending
47
+ ProteinTranslation.translate("AUGUUUUGG") should be(Seq("Methionine", "Phenylalanine", "Tryptophan"))
48
+ }
49
+
50
+ test("Stops translation if stop codon is present") {
51
+ pending
52
+ ProteinTranslation.translate("AUGUUUUAA") should be(Seq("Methionine", "Phenylalanine"))
53
+ }
54
+
55
+ test("Stops translation of longest strand") {
56
+ pending
57
+ ProteinTranslation.translate("UGGUGUUAUUAAUGGUUU") should be(Seq("Tryptophan", "Cysteine", "Tyrosine"))
58
+ }
59
+ }
@@ -0,0 +1,10 @@
1
+ case class SpaceAge(val seconds: Long) {
2
+ val onEarth: Double = ???
3
+ val onMercury: Double = ???
4
+ val onVenus: Double = ???
5
+ val onMars: Double = ???
6
+ val onJupiter: Double = ???
7
+ val onSaturn: Double = ???
8
+ val onUranus: Double = ???
9
+ val onNeptune: Double = ???
10
+ }
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.1.0.12
4
+ version: 2.1.0.13
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-05-15 00:00:00.000000000 Z
11
+ date: 2017-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -774,6 +774,13 @@ files:
774
774
  - tracks/c/exercises/roman-numerals/test/vendor/unity.c
775
775
  - tracks/c/exercises/roman-numerals/test/vendor/unity.h
776
776
  - tracks/c/exercises/roman-numerals/test/vendor/unity_internals.h
777
+ - tracks/c/exercises/scrabble-score/makefile
778
+ - tracks/c/exercises/scrabble-score/src/example.c
779
+ - tracks/c/exercises/scrabble-score/src/example.h
780
+ - tracks/c/exercises/scrabble-score/test/test_scrabble_score.c
781
+ - tracks/c/exercises/scrabble-score/test/vendor/unity.c
782
+ - tracks/c/exercises/scrabble-score/test/vendor/unity.h
783
+ - tracks/c/exercises/scrabble-score/test/vendor/unity_internals.h
777
784
  - tracks/c/exercises/series/makefile
778
785
  - tracks/c/exercises/series/src/example.c
779
786
  - tracks/c/exercises/series/src/series.h
@@ -3354,7 +3361,9 @@ files:
3354
3361
  - tracks/go/exercises/allergies/example.go
3355
3362
  - tracks/go/exercises/anagram/anagram_test.go
3356
3363
  - tracks/go/exercises/anagram/example.go
3364
+ - tracks/go/exercises/atbash-cipher/.meta/gen.go
3357
3365
  - tracks/go/exercises/atbash-cipher/atbash_cipher_test.go
3366
+ - tracks/go/exercises/atbash-cipher/cases_test.go
3358
3367
  - tracks/go/exercises/atbash-cipher/example.go
3359
3368
  - tracks/go/exercises/bank-account/bank_account_test.go
3360
3369
  - tracks/go/exercises/bank-account/example.go
@@ -5854,6 +5863,11 @@ files:
5854
5863
  - tracks/ocaml/exercises/beer-song/beer_song.mli
5855
5864
  - tracks/ocaml/exercises/beer-song/example.ml
5856
5865
  - tracks/ocaml/exercises/beer-song/test.ml
5866
+ - tracks/ocaml/exercises/binary-search/.merlin
5867
+ - tracks/ocaml/exercises/binary-search/Makefile
5868
+ - tracks/ocaml/exercises/binary-search/binary_search.mli
5869
+ - tracks/ocaml/exercises/binary-search/example.ml
5870
+ - tracks/ocaml/exercises/binary-search/test.ml
5857
5871
  - tracks/ocaml/exercises/bob/.merlin
5858
5872
  - tracks/ocaml/exercises/bob/HINTS.md
5859
5873
  - tracks/ocaml/exercises/bob/Makefile
@@ -6048,6 +6062,7 @@ files:
6048
6062
  - tracks/ocaml/tools/test-generator/templates/anagram/template.ml
6049
6063
  - tracks/ocaml/tools/test-generator/templates/atbash-cipher/template.ml
6050
6064
  - tracks/ocaml/tools/test-generator/templates/beer-song/template.ml
6065
+ - tracks/ocaml/tools/test-generator/templates/binary-search/template.ml
6051
6066
  - tracks/ocaml/tools/test-generator/templates/bob/template.ml
6052
6067
  - tracks/ocaml/tools/test-generator/templates/bowling/template.ml
6053
6068
  - tracks/ocaml/tools/test-generator/templates/bracket-push/template.ml
@@ -7869,6 +7884,7 @@ files:
7869
7884
  - tracks/scala/exercises/accumulate/build.sbt
7870
7885
  - tracks/scala/exercises/accumulate/example.scala
7871
7886
  - tracks/scala/exercises/accumulate/src/main/scala/.keep
7887
+ - tracks/scala/exercises/accumulate/src/main/scala/Accumulate.scala
7872
7888
  - tracks/scala/exercises/accumulate/src/test/scala/AccumulateTest.scala
7873
7889
  - tracks/scala/exercises/acronym/build.sbt
7874
7890
  - tracks/scala/exercises/acronym/example.scala
@@ -7917,6 +7933,7 @@ files:
7917
7933
  - tracks/scala/exercises/bob/build.sbt
7918
7934
  - tracks/scala/exercises/bob/example.scala
7919
7935
  - tracks/scala/exercises/bob/src/main/scala/.keep
7936
+ - tracks/scala/exercises/bob/src/main/scala/Bob.scala
7920
7937
  - tracks/scala/exercises/bob/src/test/scala/BobTest.scala
7921
7938
  - tracks/scala/exercises/bowling/Example.scala
7922
7939
  - tracks/scala/exercises/bowling/build.sbt
@@ -7951,6 +7968,7 @@ files:
7951
7968
  - tracks/scala/exercises/difference-of-squares/build.sbt
7952
7969
  - tracks/scala/exercises/difference-of-squares/example.scala
7953
7970
  - tracks/scala/exercises/difference-of-squares/src/main/scala/.keep
7971
+ - tracks/scala/exercises/difference-of-squares/src/main/scala/Squares.scala
7954
7972
  - tracks/scala/exercises/difference-of-squares/src/test/scala/SquaresTest.scala
7955
7973
  - tracks/scala/exercises/dominoes/Example.scala
7956
7974
  - tracks/scala/exercises/dominoes/build.sbt
@@ -7974,10 +7992,12 @@ files:
7974
7992
  - tracks/scala/exercises/gigasecond/build.sbt
7975
7993
  - tracks/scala/exercises/gigasecond/example.scala
7976
7994
  - tracks/scala/exercises/gigasecond/src/main/scala/.keep
7995
+ - tracks/scala/exercises/gigasecond/src/main/scala/Gigasecond.scala
7977
7996
  - tracks/scala/exercises/gigasecond/src/test/scala/GigasecondTest.scala
7978
7997
  - tracks/scala/exercises/grade-school/build.sbt
7979
7998
  - tracks/scala/exercises/grade-school/example.scala
7980
7999
  - tracks/scala/exercises/grade-school/src/main/scala/.keep
8000
+ - tracks/scala/exercises/grade-school/src/main/scala/School.scala
7981
8001
  - tracks/scala/exercises/grade-school/src/test/scala/GradeSchoolTest.scala
7982
8002
  - tracks/scala/exercises/grains/build.sbt
7983
8003
  - tracks/scala/exercises/grains/example.scala
@@ -8068,6 +8088,7 @@ files:
8068
8088
  - tracks/scala/exercises/pangram/build.sbt
8069
8089
  - tracks/scala/exercises/pangram/example.scala
8070
8090
  - tracks/scala/exercises/pangram/src/main/scala/.keep
8091
+ - tracks/scala/exercises/pangram/src/main/scala/Pangrams.scala
8071
8092
  - tracks/scala/exercises/pangram/src/test/scala/PangramTest.scala
8072
8093
  - tracks/scala/exercises/parallel-letter-frequency/HINTS.md
8073
8094
  - tracks/scala/exercises/parallel-letter-frequency/build.sbt
@@ -8095,6 +8116,10 @@ files:
8095
8116
  - tracks/scala/exercises/prime-factors/example.scala
8096
8117
  - tracks/scala/exercises/prime-factors/src/main/scala/.keep
8097
8118
  - tracks/scala/exercises/prime-factors/src/test/scala/PrimefactorsTest.scala
8119
+ - tracks/scala/exercises/protein-translation/build.sbt
8120
+ - tracks/scala/exercises/protein-translation/example.scala
8121
+ - tracks/scala/exercises/protein-translation/src/main/scala/.keep
8122
+ - tracks/scala/exercises/protein-translation/src/test/scala/ProteinTranslationTest.scala
8098
8123
  - tracks/scala/exercises/pythagorean-triplet/build.sbt
8099
8124
  - tracks/scala/exercises/pythagorean-triplet/example.scala
8100
8125
  - tracks/scala/exercises/pythagorean-triplet/src/main/scala/.keep
@@ -8175,6 +8200,7 @@ files:
8175
8200
  - tracks/scala/exercises/space-age/build.sbt
8176
8201
  - tracks/scala/exercises/space-age/example.scala
8177
8202
  - tracks/scala/exercises/space-age/src/main/scala/.keep
8203
+ - tracks/scala/exercises/space-age/src/main/scala/SpaceAge.scala
8178
8204
  - tracks/scala/exercises/space-age/src/test/scala/SpaceAgeTest.scala
8179
8205
  - tracks/scala/exercises/strain/build.sbt
8180
8206
  - tracks/scala/exercises/strain/example.scala