trackler 2.1.0.12 → 2.1.0.13

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 (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