trackler 2.0.6.3 → 2.0.6.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb456c079419313a6ce0e9bd9442ced587c8f3a9
4
- data.tar.gz: b5cab80a086b12263490be5017b91406891ae13a
3
+ metadata.gz: b6aba1544337c241fe655409dc6f50da3ec7b21a
4
+ data.tar.gz: 9e50e4e647c05032ada9d09a96130d2543b7a20e
5
5
  SHA512:
6
- metadata.gz: c6b863818cbcc41b49d6f5c828c71d97d592a7eb41d7f12f0a19914ddb39a0b36b1cec01a859c03717ff512ea57d69f2141e329e05eca95cb023851f725a924f
7
- data.tar.gz: aff5310dd0bf1b56b3a68d415b26d95215fe26cd63d4b7f5f0e0abf24140a9e6d241fbed08d6d1d87b1bb3fd41aec865c6412da7614cad0e83a456acd8f3845d
6
+ metadata.gz: 607f0c63e16fa33ba4d4dce2389451ed73afc0770e7bdb5dde7181a01047ed1474dfac5bcbdc50b3842eec47242f58dcee14d05abfc968b6c022a06c956ae506
7
+ data.tar.gz: 5c2b8db8780598b58ad8a09c4637dccdb264841f5746e0c82f66d864b10c5483a6703edc04a9a307cf35dd14b2ad7833a7d49762d14e1c534a69a1c46580ebdb
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.6.3"
2
+ VERSION = "2.0.6.4"
3
3
  end
@@ -24,7 +24,12 @@
24
24
  {
25
25
  "difficulty": 1,
26
26
  "slug": "hello-world",
27
- "topics": []
27
+ "topics": [
28
+ "Control-flow (if-else statements)",
29
+ "Optional values",
30
+ "Strings",
31
+ "Text formatting"
32
+ ]
28
33
  },
29
34
  {
30
35
  "difficulty": 1,
@@ -45,10 +45,10 @@ public class AtbashTest {
45
45
 
46
46
  @RunWith(Parameterized.class)
47
47
  public static class DecodeTest {
48
- private String input;
49
- private String expectedOutput;
48
+ private String ciphertext;
49
+ private String plaintext;
50
50
 
51
- @Parameters
51
+ @Parameters(name = "{index}: expected ciphertext \"{0}\" to decode to plaintext \"{1}\".")
52
52
  public static Collection<Object[]> data() {
53
53
  return Arrays.asList(new Object[][] {
54
54
  { "vcvix rhn", "exercism" },
@@ -57,15 +57,15 @@ public class AtbashTest {
57
57
  });
58
58
  }
59
59
 
60
- public DecodeTest(String input, String expectedOutput) {
61
- this.input = input;
62
- this.expectedOutput = expectedOutput;
60
+ public DecodeTest(String ciphertext, String plaintext) {
61
+ this.ciphertext = ciphertext;
62
+ this.plaintext = plaintext;
63
63
  }
64
64
 
65
65
  @Ignore
66
66
  @Test
67
67
  public void test() {
68
- assertEquals(expectedOutput, Atbash.decode(input));
68
+ assertEquals(plaintext, Atbash.decode(ciphertext));
69
69
  }
70
70
  }
71
71
  }
@@ -21,6 +21,11 @@
21
21
  "slug": "bob",
22
22
  "topics": []
23
23
  },
24
+ {
25
+ "difficulty" : 1,
26
+ "slug" : "atbash-cipher",
27
+ "topics" : []
28
+ },
24
29
  {
25
30
  "difficulty": 1,
26
31
  "slug": "leap",
@@ -0,0 +1,12 @@
1
+ sub encode($input) is export {
2
+ decode($input.lc.trans( ['a'..'z', 0..9] => '', :complement ) )
3
+ .comb(5)
4
+ .join: ' ';
5
+ }
6
+
7
+ sub decode (Str $input) is export {
8
+ return $input
9
+ .lc
10
+ .subst( /\W/, '', :g )
11
+ .trans( [ 'a'..'z' ] => ['a'..'z'].reverse );
12
+ }
@@ -0,0 +1,82 @@
1
+ {
2
+ "#": [
3
+ "The tests are divided into two groups: ",
4
+ "* Encoding from English to atbash cipher",
5
+ "* Decoding from atbash cipher to all-lowercase-mashed-together English"
6
+ ],
7
+ "encode": {
8
+ "description": ["Test encoding from English to atbash"],
9
+ "cases": [
10
+ {
11
+ "description": "encode yes",
12
+ "phrase": "yes",
13
+ "expected": "bvh"
14
+ },
15
+ {
16
+ "description": "encode no",
17
+ "phrase": "no",
18
+ "expected": "ml"
19
+ },
20
+ {
21
+ "description": "encode OMG",
22
+ "phrase": "OMG",
23
+ "expected": "lnt"
24
+ },
25
+ {
26
+ "description": "encode spaces",
27
+ "phrase": "O M G",
28
+ "expected": "lnt"
29
+ },
30
+ {
31
+ "description": "encode mindblowingly",
32
+ "phrase": "mindblowingly",
33
+ "expected": "nrmwy oldrm tob"
34
+ },
35
+ {
36
+ "description": "encode numbers",
37
+ "phrase": "Testing,1 2 3, testing.",
38
+ "expected": "gvhgr mt123 gvhgr mt"
39
+ },
40
+ {
41
+ "description": "encode deep thought",
42
+ "phrase": "Truth is fiction.",
43
+ "expected": "gifgs rhurx grlm"
44
+ },
45
+ {
46
+ "description": "encode all the letters",
47
+ "phrase": "The quick brown fox jumps over the lazy dog.",
48
+ "expected": "gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt"
49
+ },
50
+ {
51
+ "description": "encode ignores non ascii",
52
+ "phrase": "non ascii éignored",
53
+ "expected": "mlmzh xrrrt mlivw"
54
+ }
55
+ ]
56
+ },
57
+ "decode": {
58
+ "description": ["Test decoding from atbash to English"],
59
+ "cases": [
60
+ {
61
+ "description": "decode exercism",
62
+ "phrase": "vcvix rhn",
63
+ "expected": "exercism"
64
+ },
65
+ {
66
+ "description": "decode a sentence",
67
+ "phrase": "zmlyh gzxov rhlug vmzhg vkkrm thglm v",
68
+ "expected": "anobstacleisoftenasteppingstone"
69
+ },
70
+ {
71
+ "description": "decode numbers",
72
+ "phrase": "gvhgr mt123 gvhgr mt",
73
+ "expected": "testing123testing"
74
+ },
75
+ {
76
+ "description": "decode all the letters",
77
+ "phrase": "gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt",
78
+ "expected": "thequickbrownfoxjumpsoverthelazydog"
79
+ }
80
+ ]
81
+ }
82
+ }
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env perl6
2
+
3
+ use Test;
4
+ use JSON::Tiny;
5
+
6
+ use lib ( my $dir = IO::Path.new($?FILE).parent ).path;
7
+
8
+ my $module_name = %*ENV<EXERCISM>.so ?? 'Example' !! 'Allergies';
9
+ my @potential_module = <p6 pm6 pm>.map: $module_name ~ '.' ~ *;
10
+
11
+ my $module = first { $dir.child($_).e }, |@potential_module
12
+ or die "No file '$module_name.p6' found\n";
13
+
14
+ require $module <&encode &decode>;
15
+
16
+ plan 2;
17
+
18
+ my %cases = from-json $dir.child('cases.json').slurp;
19
+
20
+ subtest 'encode' => {
21
+ my @cases = |%cases.<encode>.<cases>;
22
+
23
+ plan +@cases;
24
+
25
+ is encode( .<phrase> ), .<expected>, .<description>
26
+ for @cases;
27
+ };
28
+
29
+ subtest 'decode' => {
30
+ my @cases = |%cases.<decode>.<cases>;
31
+
32
+ plan +@cases;
33
+
34
+ is decode( .<phrase> ), .<expected>, .<description>
35
+ for @cases;
36
+ };
@@ -115,6 +115,7 @@
115
115
  "slug": "nucleotide-count",
116
116
  "difficulty": 1,
117
117
  "topics": [
118
+ "Result",
118
119
  "filter",
119
120
  "entry api",
120
121
  "mutablity",
@@ -1,13 +1,24 @@
1
1
  use std::collections::HashMap;
2
2
 
3
- pub fn count(nucleotide: char, input: &str) -> usize {
4
- input.chars().filter(|&c| c == nucleotide).count()
3
+ static VALID_NUCLEOTIDES: &'static str = "ACGT";
4
+
5
+ pub fn count(nucleotide: char, input: &str) -> Result<usize, char> {
6
+ let valid = |x: char| { VALID_NUCLEOTIDES.contains(x) };
7
+ if valid(nucleotide) && input.chars().all(valid) {
8
+ Ok(input.chars().filter(|&c| c == nucleotide).count())
9
+ } else {
10
+ Err(nucleotide)
11
+ }
5
12
  }
6
13
 
7
- pub fn nucleotide_counts(input: &str) -> HashMap<char, usize> {
8
- let mut map: HashMap<char, usize> = "ACGT".chars().map(|c| (c, 0)).collect();
14
+ pub fn nucleotide_counts(input: &str) -> Result<HashMap<char, usize>, char> {
15
+ let mut map: HashMap<char, usize> = VALID_NUCLEOTIDES.chars().map(|c| (c, 0)).collect();
9
16
  for nucleotide in input.chars() {
10
- *map.entry(nucleotide).or_insert(0) += 1;
17
+ if let Some(n) = map.get_mut(&nucleotide) {
18
+ *n += 1;
19
+ } else {
20
+ return Err(nucleotide);
21
+ }
11
22
  }
12
- map
23
+ Ok(map)
13
24
  }
@@ -7,7 +7,7 @@ fn check_dna(s: &str, pairs: &[(char, usize)]) {
7
7
  // message for assert_eq! is as informative as possible. A simpler
8
8
  // solution would simply check the length of the map, and then
9
9
  // check for the presence and value of each key in the given pairs vector.
10
- let mut m: HashMap<char, usize> = dna::nucleotide_counts(s);
10
+ let mut m: HashMap<char, usize> = dna::nucleotide_counts(s).unwrap();
11
11
  for &(k, v) in pairs.iter() {
12
12
  assert_eq!((k, m.remove(&k).unwrap()), (k, v));
13
13
  }
@@ -16,20 +16,44 @@ fn check_dna(s: &str, pairs: &[(char, usize)]) {
16
16
  }
17
17
 
18
18
  #[test]
19
+ fn count_returns_result() {
20
+ assert!(dna::count('A', "").is_ok());
21
+ }
22
+
23
+ #[test]
24
+ #[ignore]
19
25
  fn test_count_empty() {
20
- assert_eq!(dna::count('A', ""), 0);
26
+ assert_eq!(dna::count('A', "").unwrap(), 0);
27
+ }
28
+
29
+ #[test]
30
+ #[ignore]
31
+ fn count_invalid_nucleotide() {
32
+ assert!(dna::count('X', "A").is_err());
33
+ }
34
+
35
+ #[test]
36
+ #[ignore]
37
+ fn count_invalid_dna() {
38
+ assert!(dna::count('A', "AX").is_err());
21
39
  }
22
40
 
23
41
  #[test]
24
42
  #[ignore]
25
43
  fn test_count_repetitive_cytosine() {
26
- assert_eq!(dna::count('C', "CCCCC"), 5);
44
+ assert_eq!(dna::count('C', "CCCCC").unwrap(), 5);
27
45
  }
28
46
 
29
47
  #[test]
30
48
  #[ignore]
31
49
  fn test_count_only_thymine() {
32
- assert_eq!(dna::count('T', "GGGGGTAACCCGG"), 1);
50
+ assert_eq!(dna::count('T', "GGGGGTAACCCGG").unwrap(), 1);
51
+ }
52
+
53
+ #[test]
54
+ #[ignore]
55
+ fn counts_returns_result() {
56
+ assert!(dna::nucleotide_counts("ACGT").is_ok());
33
57
  }
34
58
 
35
59
  #[test]
@@ -56,3 +80,9 @@ fn test_nucleotide_count_counts_all() {
56
80
  GAGTGTCTGATAGCAGC",
57
81
  &[('A', 20), ('T', 21), ('C', 12), ('G', 17)]);
58
82
  }
83
+
84
+ #[test]
85
+ #[ignore]
86
+ fn counts_invalid_nucleotide_results_in_err() {
87
+ assert!(dna::nucleotide_counts("GGXXX").is_err());
88
+ }
@@ -36,7 +36,7 @@ hamming | Result
36
36
  pascals-triangle | Math, Vec, Index (optional)
37
37
  scrabble-score | chaining higher-order functions, HashMap (optional)
38
38
  pangram | filter, ascii (optional)
39
- nucleotide-count | filter, entry api, mutablity, match
39
+ nucleotide-count | Result, filter, entry api, mutablity, match
40
40
  largest-series-product | Result, windows, higher-order functions, char
41
41
  word-count | hashmap, str vs string, chars, entry api
42
42
  atbash-cipher | str vs string, primitive types, iterators, chars, ascii
@@ -28,6 +28,15 @@
28
28
  "Sets"
29
29
  ]
30
30
  },
31
+ {
32
+ "slug": "run-length-encoding",
33
+ "difficulty": 1,
34
+ "topics": [
35
+ "Algorithms",
36
+ "Transforming",
37
+ "Strings"
38
+ ]
39
+ },
31
40
  {
32
41
  "slug": "hamming",
33
42
  "difficulty": 2,
@@ -158,6 +167,9 @@
158
167
  "slug": "roman-numerals",
159
168
  "difficulty": 1,
160
169
  "topics": [
170
+ "Sequences",
171
+ "Algorithms",
172
+ "Transforming"
161
173
  ]
162
174
  },
163
175
  {
@@ -1,5 +1,5 @@
1
- case class Acronym(phrase: String) {
2
- def abbreviate: String = {
1
+ object Acronym {
2
+ def abbreviate(phrase: String): String = {
3
3
  "[A-Z]+[a-z]*|[a-z]+".r.findAllIn(phrase).map(s => s.head.toUpper).mkString
4
4
  }
5
5
  }
@@ -1,3 +1,3 @@
1
- case class Acronym(phrase: String) {
2
- def abbreviate: String = ???
1
+ object Acronym {
2
+ def abbreviate(phrase: String): String = ???
3
3
  }
@@ -10,6 +10,6 @@ class AcronymTest extends FlatSpec with Matchers {
10
10
  ("Complementary metal-oxide semiconductor", "CMOS"))
11
11
 
12
12
  it should "create acronyms" in {
13
- acronyms.foreach{case (phrase, acronym) => Acronym(phrase).abbreviate should equal(acronym)}
13
+ acronyms.foreach{case (phrase, acronym) => Acronym.abbreviate(phrase) should equal(acronym)}
14
14
  }
15
15
  }
@@ -1,3 +1,3 @@
1
- scalaVersion := "2.11.7"
1
+ scalaVersion := "2.12.1"
2
2
 
3
- libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.5" % "test"
3
+ libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"
@@ -1,6 +1,7 @@
1
+ import scala.annotation.tailrec
1
2
  import scala.collection.immutable.ListMap
2
3
 
3
- class RomanNumeral(n: Int) {
4
+ object RomanNumeral {
4
5
  private def numeralValues = ListMap(
5
6
  1000 -> "M",
6
7
  900 -> "CM",
@@ -17,16 +18,13 @@ class RomanNumeral(n: Int) {
17
18
  1 -> "I"
18
19
  )
19
20
 
21
+ def toNumerals(n: Int) = fromNumber(n, "")
22
+
23
+ @tailrec
20
24
  private def fromNumber(n: Int, numerals: String): String = {
21
25
  numeralValues.find(_._1 <= n) match {
22
26
  case Some((threshold, numeral)) => fromNumber(n - threshold, numerals + numeral)
23
27
  case None => numerals
24
28
  }
25
29
  }
26
-
27
- val value = fromNumber(n, "")
28
30
  }
29
-
30
- object RomanNumeral {
31
- def apply(n: Int) = new RomanNumeral(n)
32
- }
@@ -3,91 +3,91 @@ import org.scalatest._
3
3
  class RomanNumeralsSpecs extends FunSpec with Matchers {
4
4
 
5
5
  it ("0 equals empty string") {
6
- RomanNumeral(0).value should be ("")
6
+ RomanNumeral.toNumerals(0) should be ("")
7
7
  }
8
8
 
9
9
  it ("1 equals I") {
10
10
  pending
11
- RomanNumeral(1).value should be ("I")
11
+ RomanNumeral.toNumerals(1) should be ("I")
12
12
  }
13
13
 
14
14
  it ("2 equals II") {
15
15
  pending
16
- RomanNumeral(2).value should be ("II")
16
+ RomanNumeral.toNumerals(2) should be ("II")
17
17
  }
18
18
 
19
19
  it ("3 equals III") {
20
20
  pending
21
- RomanNumeral(3).value should be ("III")
21
+ RomanNumeral.toNumerals(3) should be ("III")
22
22
  }
23
23
 
24
24
  it ("4 equals IV") {
25
25
  pending
26
- RomanNumeral(4).value should be ("IV")
26
+ RomanNumeral.toNumerals(4) should be ("IV")
27
27
  }
28
28
 
29
29
  it ("5 equals V") {
30
30
  pending
31
- RomanNumeral(5).value should be ("V")
31
+ RomanNumeral.toNumerals(5) should be ("V")
32
32
  }
33
33
 
34
34
  it ("6 equals VI") {
35
35
  pending
36
- RomanNumeral(6).value should be ("VI")
36
+ RomanNumeral.toNumerals(6) should be ("VI")
37
37
  }
38
38
 
39
39
  it ("9 equals IX") {
40
40
  pending
41
- RomanNumeral(9).value should be ("IX")
41
+ RomanNumeral.toNumerals(9) should be ("IX")
42
42
  }
43
43
 
44
44
  it ("27 equals XXVII") {
45
45
  pending
46
- RomanNumeral(27).value should be ("XXVII")
46
+ RomanNumeral.toNumerals(27) should be ("XXVII")
47
47
  }
48
48
 
49
49
  it ("48 equals XLVIII") {
50
50
  pending
51
- RomanNumeral(48).value should be ("XLVIII")
51
+ RomanNumeral.toNumerals(48) should be ("XLVIII")
52
52
  }
53
53
 
54
54
  it ("59 equals LIX") {
55
55
  pending
56
- RomanNumeral(59).value should be ("LIX")
56
+ RomanNumeral.toNumerals(59) should be ("LIX")
57
57
  }
58
58
 
59
59
  it ("93 equals XCIII") {
60
60
  pending
61
- RomanNumeral(93).value should be ("XCIII")
61
+ RomanNumeral.toNumerals(93) should be ("XCIII")
62
62
  }
63
63
 
64
64
  it ("141 equals CXLI") {
65
65
  pending
66
- RomanNumeral(141).value should be ("CXLI")
66
+ RomanNumeral.toNumerals(141) should be ("CXLI")
67
67
  }
68
68
 
69
69
  it ("402 equals CDII") {
70
70
  pending
71
- RomanNumeral(402).value should be ("CDII")
71
+ RomanNumeral.toNumerals(402) should be ("CDII")
72
72
  }
73
73
 
74
74
  it ("575 equals DLXXV") {
75
75
  pending
76
- RomanNumeral(575).value should be ("DLXXV")
76
+ RomanNumeral.toNumerals(575) should be ("DLXXV")
77
77
  }
78
78
 
79
79
  it ("911 equals CMXI") {
80
80
  pending
81
- RomanNumeral(911).value should be ("CMXI")
81
+ RomanNumeral.toNumerals(911) should be ("CMXI")
82
82
  }
83
83
 
84
84
  it ("1024 equals MXXIV") {
85
85
  pending
86
- RomanNumeral(1024).value should be ("MXXIV")
86
+ RomanNumeral.toNumerals(1024) should be ("MXXIV")
87
87
  }
88
88
 
89
89
  it ("3000 equals MMM") {
90
90
  pending
91
- RomanNumeral(3000).value should be ("MMM")
91
+ RomanNumeral.toNumerals(3000) should be ("MMM")
92
92
  }
93
93
  }
@@ -0,0 +1,3 @@
1
+ scalaVersion := "2.12.1"
2
+
3
+ libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"
@@ -0,0 +1,32 @@
1
+ object RunLengthEncoding {
2
+ type Plain = String
3
+ type Encoded = String
4
+
5
+ def encode(str: Plain): Encoded = {
6
+ def encodeGroup(xs: Seq[Char]): Seq[Char] =
7
+ if (xs.length > 1) s"${xs.length}${xs.head}"
8
+ else xs mkString
9
+
10
+ splitByEquals(str) flatMap encodeGroup mkString
11
+ }
12
+
13
+ def decode(str: Encoded): Plain = {
14
+ val nextChar: ((Int, Seq[Char]), Char) => (Int, Seq[Char]) = {
15
+ case ((n, xs), x) =>
16
+ if (x.isDigit) (n * 10 + x.asDigit, xs)
17
+ else if (n == 0) (0, x +: xs)
18
+ else (0, Seq.fill(n)(x) ++ xs)
19
+ }
20
+
21
+ val result = str.foldLeft((0, Seq.empty[Char]))(nextChar)
22
+ result._2.reverse mkString
23
+ }
24
+
25
+ private def splitByEquals[T](xs: Seq[T]): Seq[Seq[T]] =
26
+ xs match {
27
+ case Seq() => Seq()
28
+ case x +: xss =>
29
+ val fs = xs takeWhile (_ == x)
30
+ fs +: splitByEquals(xs drop fs.length)
31
+ }
32
+ }
@@ -0,0 +1,6 @@
1
+ object RunLengthEncoding {
2
+
3
+ def encode(str: String): String = ???
4
+
5
+ def decode(str: String): String = ???
6
+ }
@@ -0,0 +1,52 @@
1
+ import org.scalatest.FunSuite
2
+ import org.scalatest.Matchers
3
+
4
+ class RunLengthEncodingTests extends FunSuite with Matchers {
5
+
6
+ test("encode empty string") {
7
+ RunLengthEncoding.encode("") should be ("")
8
+ }
9
+
10
+ test("encode single characters only") {
11
+ pending
12
+ RunLengthEncoding.encode("XYZ") should be ("XYZ")
13
+ }
14
+
15
+ test("decode empty string") {
16
+ pending
17
+ RunLengthEncoding.decode("") should be ("")
18
+ }
19
+
20
+ test("decode single characters only") {
21
+ pending
22
+ RunLengthEncoding.decode("XYZ") should be ("XYZ")
23
+ }
24
+
25
+ test("encode simple") {
26
+ pending
27
+ RunLengthEncoding.encode("AABBBCCCC") should be ("2A3B4C")
28
+ }
29
+
30
+ test("decode simple") {
31
+ pending
32
+ RunLengthEncoding.decode("2A3B4C") should be ("AABBBCCCC")
33
+ }
34
+
35
+ test("encode with single values") {
36
+ pending
37
+ RunLengthEncoding.encode("WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB") should
38
+ be ("12WB12W3B24WB")
39
+ }
40
+
41
+ test("decode with single values") {
42
+ pending
43
+ RunLengthEncoding.decode("12WB12W3B24WB") should be ("WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB")
44
+ }
45
+
46
+ test("decode(encode(...)) combination") {
47
+ pending
48
+ RunLengthEncoding.decode(
49
+ RunLengthEncoding.encode("zzz ZZ zZ")) should be ("zzz ZZ zZ")
50
+ }
51
+
52
+ }
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.6.3
4
+ version: 2.0.6.4
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-01-05 00:00:00.000000000 Z
11
+ date: 2017-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -5305,6 +5305,9 @@ files:
5305
5305
  - tracks/perl6/exercises/allergies/cases.json
5306
5306
  - tracks/perl6/exercises/anagram/Example.pm
5307
5307
  - tracks/perl6/exercises/anagram/anagram.t
5308
+ - tracks/perl6/exercises/atbash-cipher/Example.p6
5309
+ - tracks/perl6/exercises/atbash-cipher/cases.json
5310
+ - tracks/perl6/exercises/atbash-cipher/cipher.t
5308
5311
  - tracks/perl6/exercises/binary/Example.pm
5309
5312
  - tracks/perl6/exercises/binary/binary.t
5310
5313
  - tracks/perl6/exercises/bob/Example.pm
@@ -6765,6 +6768,10 @@ files:
6765
6768
  - tracks/scala/exercises/roman-numerals/example.scala
6766
6769
  - tracks/scala/exercises/roman-numerals/src/main/scala/.keep
6767
6770
  - tracks/scala/exercises/roman-numerals/src/test/scala/RomanNumeralsTest.scala
6771
+ - tracks/scala/exercises/run-length-encoding/build.sbt
6772
+ - tracks/scala/exercises/run-length-encoding/example.scala
6773
+ - tracks/scala/exercises/run-length-encoding/src/main/scala/RunLengthEncoding.scala
6774
+ - tracks/scala/exercises/run-length-encoding/src/test/scala/RunLengthEncodingTests.scala
6768
6775
  - tracks/scala/exercises/saddle-points/build.sbt
6769
6776
  - tracks/scala/exercises/saddle-points/example.scala
6770
6777
  - tracks/scala/exercises/saddle-points/src/main/scala/.keep