trackler 2.0.6.8 → 2.0.6.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/common/exercises/luhn/canonical-data.json +32 -68
- data/common/exercises/luhn/description.md +79 -52
- data/lib/trackler/version.rb +1 -1
- data/tracks/csharp/exercises/accumulate/AccumulateTest.cs +9 -0
- data/tracks/csharp/exercises/accumulate/Example.cs +1 -1
- data/tracks/csharp/exercises/luhn/Example.cs +15 -31
- data/tracks/csharp/exercises/luhn/LuhnTest.cs +9 -55
- data/tracks/fsharp/exercises/luhn/Example.fs +15 -17
- data/tracks/fsharp/exercises/luhn/LuhnTest.fs +8 -38
- data/tracks/java/config.json +6 -0
- data/tracks/java/exercises/settings.gradle +2 -0
- data/tracks/java/exercises/twelve-days/build.gradle +17 -0
- data/tracks/java/exercises/twelve-days/src/example/java/TwelveDays.java +46 -0
- data/tracks/java/exercises/twelve-days/src/main/java/.keep +0 -0
- data/tracks/java/exercises/twelve-days/src/test/java/TwelveDaysTest.java +172 -0
- data/tracks/ocaml/tools/test-generator/src/controller.ml +2 -2
- data/tracks/ocaml/tools/test-generator/src/parser.ml +12 -12
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +4 -0
- data/tracks/ocaml/tools/test-generator/templates/luhn/template.ml +16 -0
- data/tracks/ocaml/tools/test-generator/test/parser_test.ml +2 -2
- data/tracks/pascal/config.json +1 -1
- data/tracks/pascal/exercises/hello-world/uTestHelloWorld.pas +2 -3
- data/tracks/scala/config.json +9 -0
- data/tracks/scala/exercises/pascals-triangle/build.sbt +2 -2
- data/tracks/scala/exercises/pig-latin/build.sbt +2 -2
- data/tracks/scala/exercises/pythagorean-triplet/build.sbt +3 -2
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b14825c924ae155ef47cfae4208988fc6fe0792a
|
4
|
+
data.tar.gz: d95acda90518c0b892a492427df1449ada88ef61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b246ba31cee380b84c8419cd4cc55ef0e52955888e5f1da274fff1956a71f9f5cb81e6f4625be50dc2d4a82d26650aee8372b2cde6377e3a149c083d681ae0d
|
7
|
+
data.tar.gz: 2248d24225e54c4ea418a19cdf51e68140f5993e92d869866a0553023b6623ab83f9a385b1a408910db48a21bf398ea4c76bae8cb3876909020b818deb91d84c
|
@@ -1,70 +1,34 @@
|
|
1
1
|
{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
{
|
35
|
-
"description": "checksum",
|
36
|
-
"input": 4913,
|
37
|
-
"expected": 22
|
38
|
-
},
|
39
|
-
{
|
40
|
-
"description": "checksum of larger number",
|
41
|
-
"input": 201773,
|
42
|
-
"expected": 21
|
43
|
-
},
|
44
|
-
{
|
45
|
-
"description": "check invalid number",
|
46
|
-
"input": 738,
|
47
|
-
"expected": false
|
48
|
-
},
|
49
|
-
{
|
50
|
-
"description": "check valid number",
|
51
|
-
"input": 8739567,
|
52
|
-
"expected": true
|
53
|
-
},
|
54
|
-
{
|
55
|
-
"description": "create valid number",
|
56
|
-
"input": 123,
|
57
|
-
"expected": 1230
|
58
|
-
},
|
59
|
-
{
|
60
|
-
"description": "create larger valid number",
|
61
|
-
"input": 873956,
|
62
|
-
"expected": 8739567
|
63
|
-
},
|
64
|
-
{
|
65
|
-
"description": "create even larger valid number",
|
66
|
-
"input": 837263756,
|
67
|
-
"expected": 8372637564
|
68
|
-
}
|
69
|
-
]
|
2
|
+
"valid": [
|
3
|
+
{
|
4
|
+
"description": "single digit strings can not be valid",
|
5
|
+
"input": "1",
|
6
|
+
"expected": false
|
7
|
+
},
|
8
|
+
{
|
9
|
+
"description": "A single zero is invalid",
|
10
|
+
"input": "0",
|
11
|
+
"expected": false
|
12
|
+
},
|
13
|
+
{
|
14
|
+
"description": "valid Canadian SIN",
|
15
|
+
"input": "046 454 286",
|
16
|
+
"expected": true
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"description": "invalid Canadian SIN",
|
20
|
+
"input": "046 454 287",
|
21
|
+
"expected": false
|
22
|
+
},
|
23
|
+
{
|
24
|
+
"description": "invalid credit card",
|
25
|
+
"input": "8273 1232 7352 0569",
|
26
|
+
"expected": false
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"description": "strings that contain non-digits are not valid",
|
30
|
+
"input": "827a 1232 7352 0569",
|
31
|
+
"expected": false
|
32
|
+
}
|
33
|
+
]
|
70
34
|
}
|
@@ -1,53 +1,80 @@
|
|
1
|
-
The Luhn
|
2
|
-
|
3
|
-
Social Insurance
|
4
|
-
|
5
|
-
The formula verifies a number against its included check digit, which is
|
6
|
-
usually appended to a partial number to generate the full number. This
|
7
|
-
number must pass the following test:
|
8
|
-
|
9
|
-
- Counting from rightmost digit (which is the check digit) and moving
|
10
|
-
left, double the value of every second digit.
|
11
|
-
- For any digits that thus become 10 or more, subtract 9 from the
|
12
|
-
result.
|
13
|
-
- 1111 becomes 2121.
|
14
|
-
- 8763 becomes 7733 (from 2×6=12 → 12-9=3 and 2×8=16 → 16-9=7).
|
15
|
-
- Add all these digits together.
|
16
|
-
- 1111 becomes 2121 sums as 2+1+2+1 to give a check digit of 6.
|
17
|
-
- 8763 becomes 7733, and 7+7+3+3 is 20.
|
18
|
-
|
19
|
-
If the total ends in 0 (put another way, if the total modulus 10 is
|
20
|
-
congruent to 0), then the number is valid according to the Luhn formula;
|
21
|
-
else it is not valid. So, 1111 is not valid (as shown above, it comes
|
22
|
-
out to 6), while 8763 is valid (as shown above, it comes out to 20).
|
23
|
-
|
24
|
-
Write a program that, given a number
|
25
|
-
|
26
|
-
- Can check if it is valid per the Luhn formula. This should treat, for
|
27
|
-
example, "2323 2005 7766 3554" as valid.
|
28
|
-
- Can return the checksum, or the remainder from using the Luhn method.
|
29
|
-
- Can add a check digit to make the number valid per the Luhn formula and
|
30
|
-
return the original number plus that digit. This should give "2323 2005 7766
|
31
|
-
3554" in response to "2323 2005 7766 355".
|
32
|
-
|
33
|
-
## About Checksums
|
34
|
-
|
35
|
-
A checksum has to do with error-detection. There are a number of different
|
36
|
-
ways in which a checksum could be calculated.
|
37
|
-
|
38
|
-
When transmitting data, you might also send along a checksum that says how
|
39
|
-
many bytes of data are being sent. That means that when the data arrives on
|
40
|
-
the other side, you can count the bytes and compare it to the checksum. If
|
41
|
-
these are different, then the data has been garbled in transmission.
|
42
|
-
|
43
|
-
In the Luhn problem the final digit acts as a sanity check for all the prior
|
44
|
-
digits. Running those prior digits through a particular algorithm should give
|
45
|
-
you that final digit.
|
46
|
-
|
47
|
-
It doesn't actually tell you if it's a real credit card number, only that it's
|
48
|
-
a plausible one. It's the same thing with the bytes that get transmitted --
|
49
|
-
you could have the right number of bytes and still have a garbled message. So
|
50
|
-
checksums are a simple sanity-check, not a real in-depth verification of the
|
51
|
-
authenticity of some data. It's often a cheap first pass, and can be used to
|
52
|
-
quickly discard obviously invalid things.
|
1
|
+
The [Luhn algorithm](https://en.wikipedia.org/wiki/Luhn_algorithm) is
|
2
|
+
a simple checksum formula used to validate a variety of identification
|
3
|
+
numbers, such as credit card numbers and Canadian Social Insurance
|
4
|
+
Numbers.
|
53
5
|
|
6
|
+
The task is to write a function that checks if a given string is valid.
|
7
|
+
|
8
|
+
Validating a Number
|
9
|
+
------
|
10
|
+
|
11
|
+
As an example, here is a valid (but fictitious) Canadian Social Insurance
|
12
|
+
Number.
|
13
|
+
|
14
|
+
```
|
15
|
+
046 454 286
|
16
|
+
```
|
17
|
+
|
18
|
+
The first step of the Luhn algorithm is to double every second digit,
|
19
|
+
starting from the right. We will be doubling
|
20
|
+
|
21
|
+
```
|
22
|
+
_4_ 4_4 _8_
|
23
|
+
```
|
24
|
+
|
25
|
+
If doubling the number results in a number greater than 9 then subtract 9
|
26
|
+
from the product. The results of our doubling:
|
27
|
+
|
28
|
+
```
|
29
|
+
086 858 276
|
30
|
+
```
|
31
|
+
|
32
|
+
Then sum all of the digits
|
33
|
+
|
34
|
+
```
|
35
|
+
0+8+6+8+5+8+2+7+6 = 50
|
36
|
+
```
|
37
|
+
|
38
|
+
If the sum is evenly divisible by 10, then the number is valid. This number is valid!
|
39
|
+
|
40
|
+
An example of an invalid Canadian SIN where we've changed the final digit
|
41
|
+
|
42
|
+
```
|
43
|
+
046 454 287
|
44
|
+
```
|
45
|
+
|
46
|
+
Double the second digits, starting from the right
|
47
|
+
|
48
|
+
```
|
49
|
+
086 858 277
|
50
|
+
```
|
51
|
+
|
52
|
+
Sum the digits
|
53
|
+
|
54
|
+
```
|
55
|
+
0+8+6+8+5+8+2+7+7 = 51
|
56
|
+
```
|
57
|
+
|
58
|
+
51 is not evenly divisible by 10, so this number is not valid.
|
59
|
+
|
60
|
+
----
|
61
|
+
|
62
|
+
An example of an invalid credit card account
|
63
|
+
|
64
|
+
```
|
65
|
+
8273 1232 7352 0569
|
66
|
+
```
|
67
|
+
|
68
|
+
Double the second digits, starting from the right
|
69
|
+
|
70
|
+
```
|
71
|
+
7253 2262 5312 0539
|
72
|
+
```
|
73
|
+
|
74
|
+
Sum the digits
|
75
|
+
|
76
|
+
```
|
77
|
+
7+2+5+3+2+2+5+2+5+3+1+2+0+5+3+9 = 57
|
78
|
+
```
|
79
|
+
|
80
|
+
57 is not evenly divisible by 10, so this number is not valid.
|
data/lib/trackler/version.rb
CHANGED
@@ -62,4 +62,13 @@ public class AccumulateTest
|
|
62
62
|
accumulation.ToList();
|
63
63
|
Assert.That(counter, Is.EqualTo(3));
|
64
64
|
}
|
65
|
+
|
66
|
+
[Ignore("Remove to run test")]
|
67
|
+
[Test]
|
68
|
+
public void Accumulate_allows_different_return_type()
|
69
|
+
{
|
70
|
+
Assert.That(
|
71
|
+
new[] { 1, 2, 3 }.Accumulate(x => x.ToString()),
|
72
|
+
Is.EqualTo(new[] { "1", "2", "3" }));
|
73
|
+
}
|
65
74
|
}
|
@@ -3,7 +3,7 @@ using System.Collections.Generic;
|
|
3
3
|
|
4
4
|
public static class AccumulateExtensions
|
5
5
|
{
|
6
|
-
public static IEnumerable<
|
6
|
+
public static IEnumerable<U> Accumulate<T, U>(this IEnumerable<T> collection, Func<T, U> func)
|
7
7
|
{
|
8
8
|
foreach (var item in collection)
|
9
9
|
yield return func(item);
|
@@ -1,22 +1,23 @@
|
|
1
1
|
using System;
|
2
2
|
using System.Linq;
|
3
3
|
|
4
|
-
public class Luhn
|
4
|
+
public static class Luhn
|
5
5
|
{
|
6
|
-
|
6
|
+
public static bool IsValid(string number)
|
7
|
+
{
|
8
|
+
number = number.Replace(" ", "");
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
if (number.Length < 2 || number.Any(c => c < '0' || c > '9'))
|
11
|
+
{
|
12
|
+
return false;
|
13
|
+
}
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
Addends = GenerateAddends();
|
15
|
+
var checksum = GenerateChecksum(number);
|
16
|
+
|
17
|
+
return checksum % 10 == 0;
|
17
18
|
}
|
18
19
|
|
19
|
-
private int
|
20
|
+
private static int GenerateChecksum(string number)
|
20
21
|
{
|
21
22
|
var reversedIntArray = SplitToReversedIntArray(number);
|
22
23
|
for (int i = 1; i < reversedIntArray.Length; i++)
|
@@ -25,12 +26,12 @@ public class Luhn
|
|
25
26
|
reversedIntArray[i] = ConvertDigitForAddend(reversedIntArray[i]);
|
26
27
|
}
|
27
28
|
Array.Reverse(reversedIntArray);
|
28
|
-
return reversedIntArray;
|
29
|
+
return reversedIntArray.Sum();
|
29
30
|
}
|
30
31
|
|
31
|
-
private static int[] SplitToReversedIntArray(
|
32
|
+
private static int[] SplitToReversedIntArray(string value)
|
32
33
|
{
|
33
|
-
return value.
|
34
|
+
return value.Select(c => int.Parse(c.ToString())).Reverse().ToArray();
|
34
35
|
}
|
35
36
|
|
36
37
|
private static int ConvertDigitForAddend(int value)
|
@@ -38,21 +39,4 @@ public class Luhn
|
|
38
39
|
var doubled = value * 2;
|
39
40
|
return doubled < 10 ? doubled : doubled - 9;
|
40
41
|
}
|
41
|
-
|
42
|
-
public static long Create(long number)
|
43
|
-
{
|
44
|
-
var zeroCheckDigitNumber = number * 10;
|
45
|
-
var luhn = new Luhn(zeroCheckDigitNumber);
|
46
|
-
|
47
|
-
if (luhn.Valid)
|
48
|
-
return zeroCheckDigitNumber;
|
49
|
-
|
50
|
-
return zeroCheckDigitNumber + CreateCheckDigit(luhn.Checksum);
|
51
|
-
}
|
52
|
-
|
53
|
-
private static int CreateCheckDigit(int value)
|
54
|
-
{
|
55
|
-
var nearestTen = (int)(Math.Ceiling(value / 10.0m) * 10);
|
56
|
-
return nearestTen - value;
|
57
|
-
}
|
58
42
|
}
|
@@ -3,60 +3,14 @@ using NUnit.Framework;
|
|
3
3
|
[TestFixture]
|
4
4
|
public class LuhnTest
|
5
5
|
{
|
6
|
-
[
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
{
|
16
|
-
Assert.That(new Luhn(12121).Addends, Is.EqualTo(new[] { 1, 4, 1, 4, 1 }));
|
17
|
-
}
|
18
|
-
|
19
|
-
[Ignore("Remove to run test")]
|
20
|
-
[Test]
|
21
|
-
public void Addends_subtracts_9_when_doubled_number_is_more_than_9()
|
22
|
-
{
|
23
|
-
Assert.That(new Luhn(8631).Addends, Is.EqualTo(new[] { 7, 6, 6, 1 }));
|
24
|
-
}
|
25
|
-
|
26
|
-
[Ignore("Remove to run test")]
|
27
|
-
[TestCase(4913, ExpectedResult = 22)]
|
28
|
-
[TestCase(201773, ExpectedResult = 21)]
|
29
|
-
public int Checksum_adds_addends_together(int number)
|
30
|
-
{
|
31
|
-
return new Luhn(number).Checksum;
|
32
|
-
}
|
33
|
-
|
34
|
-
[Ignore("Remove to run test")]
|
35
|
-
[TestCase(738, ExpectedResult = false)]
|
36
|
-
[TestCase(8739567, ExpectedResult = true)]
|
37
|
-
public bool Number_is_valid_when_checksum_mod_10_is_zero(int number)
|
38
|
-
{
|
39
|
-
return new Luhn(number).Valid;
|
40
|
-
}
|
41
|
-
|
42
|
-
[Ignore("Remove to run test")]
|
43
|
-
[Test]
|
44
|
-
public void Luhn_can_create_simple_numbers_with_valid_check_digit()
|
45
|
-
{
|
46
|
-
Assert.That(Luhn.Create(123), Is.EqualTo(1230));
|
47
|
-
}
|
48
|
-
|
49
|
-
[Ignore("Remove to run test")]
|
50
|
-
[Test]
|
51
|
-
public void Luhn_can_create_larger_numbers_with_valid_check_digit()
|
52
|
-
{
|
53
|
-
Assert.That(Luhn.Create(873956), Is.EqualTo(8739567));
|
54
|
-
}
|
55
|
-
|
56
|
-
[Ignore("Remove to run test")]
|
57
|
-
[Test]
|
58
|
-
public void Luhn_can_create_huge_numbers_with_valid_check_digit()
|
59
|
-
{
|
60
|
-
Assert.That(Luhn.Create(837263756), Is.EqualTo(8372637564));
|
6
|
+
[TestCase("1", ExpectedResult = false)] // single digit strings can not be valid
|
7
|
+
[TestCase("0", ExpectedResult = false, Ignore = "Remove to run test")] // a single zero is invalid
|
8
|
+
[TestCase("046 454 286", ExpectedResult = true, Ignore = "Remove to run test")] // valid Canadian SIN
|
9
|
+
[TestCase("046 454 287", ExpectedResult = false, Ignore = "Remove to run test")] // invalid Canadian SIN
|
10
|
+
[TestCase("8273 1232 7352 0569", ExpectedResult = false, Ignore = "Remove to run test")] // invalid credit card
|
11
|
+
[TestCase("827a 1232 7352 0569", ExpectedResult = false, Ignore = "Remove to run test")] // strings that contain non-digits are not valid
|
12
|
+
public bool ValidateChecksum(string number)
|
13
|
+
{
|
14
|
+
return Luhn.IsValid(number);
|
61
15
|
}
|
62
16
|
}
|
@@ -1,29 +1,27 @@
|
|
1
1
|
module Luhn
|
2
|
-
|
3
|
-
let digit c = (int)c - (int)'0'
|
4
|
-
let digits number = number.ToString() |> Seq.map digit
|
5
2
|
|
6
|
-
let
|
3
|
+
let private digit c = (int)c - (int)'0'
|
4
|
+
let private digits number = number.ToString() |> Seq.map digit
|
5
|
+
|
6
|
+
let private addend index digit =
|
7
7
|
if (index % 2 = 0) then digit else
|
8
8
|
if (digit >= 5) then digit * 2 - 9
|
9
9
|
else digit * 2
|
10
10
|
|
11
|
-
let
|
12
|
-
|
13
|
-
let addends (number:int64) =
|
14
|
-
number
|
15
|
-
|> digits
|
11
|
+
let private addends number =
|
12
|
+
number
|
16
13
|
|> List.ofSeq
|
17
14
|
|> List.rev
|
18
15
|
|> List.mapi addend
|
19
16
|
|> List.rev
|
20
17
|
|
21
|
-
let checksum
|
22
|
-
|
23
|
-
let valid (number:int64) = checksum number = 0
|
24
|
-
|
25
|
-
let create (target:int64) =
|
26
|
-
let targetNumber = target * 10L
|
18
|
+
let private checksum number = (number |> digits |> addends |> List.sum) % 10
|
27
19
|
|
28
|
-
|
29
|
-
|
20
|
+
let valid (number : string) =
|
21
|
+
let noSpaces = number.Replace(" ", "")
|
22
|
+
match Seq.length noSpaces with
|
23
|
+
| 0 | 1 -> false
|
24
|
+
| _ ->
|
25
|
+
match Seq.forall (fun c -> c >= '0' && c <= '9') noSpaces with
|
26
|
+
| false -> false
|
27
|
+
| true -> checksum noSpaces = 0
|
@@ -3,41 +3,11 @@ module LuhnTest
|
|
3
3
|
open NUnit.Framework
|
4
4
|
open Luhn
|
5
5
|
|
6
|
-
[<
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
[<
|
11
|
-
[<
|
12
|
-
let ``
|
13
|
-
|
14
|
-
|
15
|
-
[<Test>]
|
16
|
-
[<Ignore("Remove to run test")>]
|
17
|
-
let ``Addends subtracts 9 when doubled number is more than 9`` () =
|
18
|
-
Assert.That(addends 8631L, Is.EqualTo [7; 6; 6; 1])
|
19
|
-
|
20
|
-
[<TestCase(4913, ExpectedResult = 2)>]
|
21
|
-
[<TestCase(201773, ExpectedResult = 1)>]
|
22
|
-
let ``Checksum adds addends together`` (number) =
|
23
|
-
checksum number
|
24
|
-
|
25
|
-
[<TestCase(738, ExpectedResult = false)>]
|
26
|
-
[<TestCase(8739567, ExpectedResult = true)>]
|
27
|
-
let ``Number is valid when checksum mod 10 is zero`` (number) =
|
28
|
-
valid number
|
29
|
-
|
30
|
-
[<Test>]
|
31
|
-
[<Ignore("Remove to run test")>]
|
32
|
-
let ``Luhn can create simple numbers with valid check digit`` () =
|
33
|
-
Assert.That(create 123L, Is.EqualTo(1230))
|
34
|
-
|
35
|
-
[<Test>]
|
36
|
-
[<Ignore("Remove to run test")>]
|
37
|
-
let ``Luhn can create larger numbers with valid check digit`` () =
|
38
|
-
Assert.That(create 873956L, Is.EqualTo(8739567))
|
39
|
-
|
40
|
-
[<Test>]
|
41
|
-
[<Ignore("Remove to run test")>]
|
42
|
-
let ``Luhn can create huge numbers with valid check digit`` () =
|
43
|
-
Assert.That(create 837263756L, Is.EqualTo(8372637564L))
|
6
|
+
[<TestCase("1", ExpectedResult = false)>] // single digit strings can not be valid
|
7
|
+
[<TestCase("0", ExpectedResult = false, Ignore = "Remove to run test")>] // a single zero is invalid
|
8
|
+
[<TestCase("046 454 286", ExpectedResult = true, Ignore = "Remove to run test")>] // valid Canadian SIN
|
9
|
+
[<TestCase("046 454 287", ExpectedResult = false, Ignore = "Remove to run test")>] // invalid Canadian SIN
|
10
|
+
[<TestCase("8273 1232 7352 0569", ExpectedResult = false, Ignore = "Remove to run test")>] // invalid credit card
|
11
|
+
[<TestCase("827a 1232 7352 0569", ExpectedResult = false, Ignore = "Remove to run test")>] // strings that contain non-digits are not valid
|
12
|
+
let ``Validate checksum`` number =
|
13
|
+
valid number
|
data/tracks/java/config.json
CHANGED
@@ -54,6 +54,7 @@
|
|
54
54
|
"custom-set",
|
55
55
|
"wordy",
|
56
56
|
"palindrome-products",
|
57
|
+
"twelve-days",
|
57
58
|
"sublist"
|
58
59
|
],
|
59
60
|
"exercises": [
|
@@ -307,6 +308,11 @@
|
|
307
308
|
"difficulty": 1,
|
308
309
|
"topics": []
|
309
310
|
},
|
311
|
+
{
|
312
|
+
"slug": "twelve-days",
|
313
|
+
"difficulty": 1,
|
314
|
+
"topics": []
|
315
|
+
},
|
310
316
|
{
|
311
317
|
"slug": "sublist",
|
312
318
|
"difficulty": 1,
|
@@ -0,0 +1,17 @@
|
|
1
|
+
apply plugin: "java"
|
2
|
+
apply plugin: "eclipse"
|
3
|
+
apply plugin: "idea"
|
4
|
+
|
5
|
+
repositories {
|
6
|
+
mavenCentral()
|
7
|
+
}
|
8
|
+
|
9
|
+
dependencies {
|
10
|
+
testCompile "junit:junit:4.12"
|
11
|
+
}
|
12
|
+
test {
|
13
|
+
testLogging {
|
14
|
+
exceptionFormat = 'full'
|
15
|
+
events = ["passed", "failed", "skipped"]
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,46 @@
|
|
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[] {
|
5
|
+
"a Partridge in a Pear Tree.",
|
6
|
+
"two Turtle Doves, ",
|
7
|
+
"three French Hens, ",
|
8
|
+
"four Calling Birds, ",
|
9
|
+
"five Gold Rings, ",
|
10
|
+
"six Geese-a-Laying, ",
|
11
|
+
"seven Swans-a-Swimming, ",
|
12
|
+
"eight Maids-a-Milking, ",
|
13
|
+
"nine Ladies Dancing, ",
|
14
|
+
"ten Lords-a-Leaping, ",
|
15
|
+
"eleven Pipers Piping, ",
|
16
|
+
"twelve Drummers Drumming, "
|
17
|
+
};
|
18
|
+
|
19
|
+
public static String verse(int verseNumber) {
|
20
|
+
return constructVerse(verseNumber);
|
21
|
+
}
|
22
|
+
|
23
|
+
public static String verses(int verseNumberStart, int verseNumberEnd) {
|
24
|
+
StringBuilder stringBuilder = new StringBuilder(constructVerse(verseNumberStart));
|
25
|
+
for (int i = verseNumberStart + 1; i <= verseNumberEnd; i++) {
|
26
|
+
stringBuilder.append("\n");
|
27
|
+
stringBuilder.append(constructVerse(i));
|
28
|
+
}
|
29
|
+
return stringBuilder.toString();
|
30
|
+
}
|
31
|
+
|
32
|
+
public static String sing() {
|
33
|
+
return verses(1, 12);
|
34
|
+
}
|
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
|
+
}
|
File without changes
|
@@ -0,0 +1,172 @@
|
|
1
|
+
import org.junit.Ignore;
|
2
|
+
import org.junit.Test;
|
3
|
+
|
4
|
+
import static org.junit.Assert.assertEquals;
|
5
|
+
|
6
|
+
public class TwelveDaysTest {
|
7
|
+
|
8
|
+
@Test
|
9
|
+
public void testVerseOne() {
|
10
|
+
String expectedVerseOne = "On the first day of Christmas my true love gave to me, " +
|
11
|
+
"a Partridge in a Pear Tree.\n";
|
12
|
+
assertEquals(expectedVerseOne, TwelveDays.verse(1));
|
13
|
+
}
|
14
|
+
|
15
|
+
@Ignore
|
16
|
+
@Test
|
17
|
+
public void testVerseTwo() {
|
18
|
+
String expectedVerseTwo = "On the second day of Christmas my true love gave to me, two Turtle Doves, " +
|
19
|
+
"and a Partridge in a Pear Tree.\n";
|
20
|
+
assertEquals(expectedVerseTwo, TwelveDays.verse(2));
|
21
|
+
}
|
22
|
+
|
23
|
+
@Ignore
|
24
|
+
@Test
|
25
|
+
public void testVerseThree() {
|
26
|
+
String expectedVerseThree = "On the third day of Christmas my true love gave to me, three French Hens, " +
|
27
|
+
"two Turtle Doves, and a Partridge in a Pear Tree.\n";
|
28
|
+
assertEquals(expectedVerseThree, TwelveDays.verse(3));
|
29
|
+
}
|
30
|
+
|
31
|
+
@Ignore
|
32
|
+
@Test
|
33
|
+
public void testVerseFour() {
|
34
|
+
String expectedVerseFour = "On the fourth day of Christmas my true love gave to me, four Calling Birds, " +
|
35
|
+
"three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
|
36
|
+
assertEquals(expectedVerseFour, TwelveDays.verse(4));
|
37
|
+
}
|
38
|
+
|
39
|
+
@Ignore
|
40
|
+
@Test
|
41
|
+
public void testVerseFive() {
|
42
|
+
String expectedVerseFive = "On the fifth day of Christmas my true love gave to me, five Gold Rings, " +
|
43
|
+
"four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
|
44
|
+
assertEquals(expectedVerseFive, TwelveDays.verse(5));
|
45
|
+
}
|
46
|
+
|
47
|
+
@Ignore
|
48
|
+
@Test
|
49
|
+
public void testVerseSix() {
|
50
|
+
String expectedVerseSix = "On the sixth day of Christmas my true love gave to me, six Geese-a-Laying, " +
|
51
|
+
"five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, " +
|
52
|
+
"and a Partridge in a Pear Tree.\n";
|
53
|
+
assertEquals(expectedVerseSix, TwelveDays.verse(6));
|
54
|
+
}
|
55
|
+
|
56
|
+
@Ignore
|
57
|
+
@Test
|
58
|
+
public void testVerseSeven() {
|
59
|
+
String expectedVerseSeven = "On the seventh day of Christmas my true love gave to me, " +
|
60
|
+
"seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, " +
|
61
|
+
"two Turtle Doves, and a Partridge in a Pear Tree.\n";
|
62
|
+
assertEquals(expectedVerseSeven, TwelveDays.verse(7));
|
63
|
+
}
|
64
|
+
|
65
|
+
@Ignore
|
66
|
+
@Test
|
67
|
+
public void testVerseEight() {
|
68
|
+
String expectedVerseEight = "On the eighth day of Christmas my true love gave to me, eight Maids-a-Milking," +
|
69
|
+
" seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, " +
|
70
|
+
"three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
|
71
|
+
assertEquals(expectedVerseEight, TwelveDays.verse(8));
|
72
|
+
}
|
73
|
+
|
74
|
+
@Ignore
|
75
|
+
@Test
|
76
|
+
public void testVerseNine() {
|
77
|
+
String expectedVerseNine = "On the ninth day of Christmas my true love gave to me, nine Ladies Dancing, " +
|
78
|
+
"eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, " +
|
79
|
+
"four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
|
80
|
+
assertEquals(expectedVerseNine, TwelveDays.verse(9));
|
81
|
+
}
|
82
|
+
|
83
|
+
@Ignore
|
84
|
+
@Test
|
85
|
+
public void testVerseTen() {
|
86
|
+
String expectedVerseTen = "On the tenth day of Christmas my true love gave to me, ten Lords-a-Leaping, " +
|
87
|
+
"nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, " +
|
88
|
+
"five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, " +
|
89
|
+
"and a Partridge in a Pear Tree.\n";
|
90
|
+
assertEquals(expectedVerseTen, TwelveDays.verse(10));
|
91
|
+
}
|
92
|
+
|
93
|
+
@Ignore
|
94
|
+
@Test
|
95
|
+
public void testVerseEleven() {
|
96
|
+
String expectedVerseEleven = "On the eleventh day of Christmas my true love gave to me, " +
|
97
|
+
"eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, " +
|
98
|
+
"seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, " +
|
99
|
+
"three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
|
100
|
+
assertEquals(expectedVerseEleven, TwelveDays.verse(11));
|
101
|
+
}
|
102
|
+
|
103
|
+
@Ignore
|
104
|
+
@Test
|
105
|
+
public void testVerseTwelve() {
|
106
|
+
String expectedVerseTwelve = "On the twelfth day of Christmas my true love gave to me, " +
|
107
|
+
"twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, " +
|
108
|
+
"eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, " +
|
109
|
+
"four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
|
110
|
+
assertEquals(expectedVerseTwelve, TwelveDays.verse(12));
|
111
|
+
}
|
112
|
+
|
113
|
+
@Ignore
|
114
|
+
@Test
|
115
|
+
public void testMultipleVerses() {
|
116
|
+
String expectedVerseOneToThree = "On the first day of Christmas my true love gave to me, " +
|
117
|
+
"a Partridge in a Pear Tree.\n\n" +
|
118
|
+
"On the second day of Christmas my true love gave to me, two Turtle Doves, " +
|
119
|
+
"and a Partridge in a Pear Tree.\n\n" +
|
120
|
+
"On the third day of Christmas my true love gave to me, three French Hens, two Turtle Doves, " +
|
121
|
+
"and a Partridge in a Pear Tree.\n";
|
122
|
+
assertEquals(expectedVerseOneToThree, TwelveDays.verses(1, 3));
|
123
|
+
}
|
124
|
+
|
125
|
+
@Ignore
|
126
|
+
@Test
|
127
|
+
public void testSingWholeSong() {
|
128
|
+
String expectedSong = "On the first day of Christmas my true love gave to me, a Partridge in a Pear Tree.\n" +
|
129
|
+
"\n" +
|
130
|
+
"On the second day of Christmas my true love gave to me, two Turtle Doves, " +
|
131
|
+
"and a Partridge in a Pear Tree.\n" +
|
132
|
+
"\n" +
|
133
|
+
"On the third day of Christmas my true love gave to me, three French Hens, two Turtle Doves, " +
|
134
|
+
"and a Partridge in a Pear Tree.\n" +
|
135
|
+
"\n" +
|
136
|
+
"On the fourth day of Christmas my true love gave to me, four Calling Birds, three French Hens, " +
|
137
|
+
"two Turtle Doves, and a Partridge in a Pear Tree.\n" +
|
138
|
+
"\n" +
|
139
|
+
"On the fifth day of Christmas my true love gave to me, five Gold Rings, four Calling Birds, " +
|
140
|
+
"three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n" +
|
141
|
+
"\n" +
|
142
|
+
"On the sixth day of Christmas my true love gave to me, six Geese-a-Laying, five Gold Rings, " +
|
143
|
+
"four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n" +
|
144
|
+
"\n" +
|
145
|
+
"On the seventh day of Christmas my true love gave to me, seven Swans-a-Swimming, " +
|
146
|
+
"six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, " +
|
147
|
+
"and a Partridge in a Pear Tree.\n" +
|
148
|
+
"\n" +
|
149
|
+
"On the eighth day of Christmas my true love gave to me, eight Maids-a-Milking, " +
|
150
|
+
"seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, " +
|
151
|
+
"three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n" +
|
152
|
+
"\n" +
|
153
|
+
"On the ninth day of Christmas my true love gave to me, nine Ladies Dancing, eight Maids-a-Milking," +
|
154
|
+
" seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, " +
|
155
|
+
"three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n" +
|
156
|
+
"\n" +
|
157
|
+
"On the tenth day of Christmas my true love gave to me, ten Lords-a-Leaping, nine Ladies Dancing," +
|
158
|
+
" eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, " +
|
159
|
+
"four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n" +
|
160
|
+
"\n" +
|
161
|
+
"On the eleventh day of Christmas my true love gave to me, eleven Pipers Piping, " +
|
162
|
+
"ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, " +
|
163
|
+
"six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, " +
|
164
|
+
"and a Partridge in a Pear Tree.\n" +
|
165
|
+
"\n" +
|
166
|
+
"On the twelfth day of Christmas my true love gave to me, twelve Drummers Drumming, " +
|
167
|
+
"eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, " +
|
168
|
+
"seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, " +
|
169
|
+
"three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.\n";
|
170
|
+
assertEquals(expectedSong, TwelveDays.sing());
|
171
|
+
}
|
172
|
+
}
|
@@ -28,7 +28,7 @@ let generate_code ~(slug: string) ~(template_file: content) ~(canonical_data_fil
|
|
28
28
|
let fill_in_template = fill_in_template edit_expected edit_parameters in
|
29
29
|
let open Result.Monad_infix in
|
30
30
|
Result.of_option template ("cannot recognize file for " ^ slug ^ " as a template") >>= fun template ->
|
31
|
-
parse_json_text canonical_data_file (expected_key_name slug)
|
31
|
+
parse_json_text canonical_data_file (expected_key_name slug) (cases_name slug)
|
32
32
|
|> Result.map_error ~f:show_error >>= (function
|
33
33
|
| Single cases ->
|
34
34
|
fill_in_template template.template slug cases
|
@@ -60,7 +60,7 @@ let check_canonical_data canonical_data_folder =
|
|
60
60
|
let canonical_data_files = List.sort canonical_data_files ~cmp:(fun (s1, _) (s2, _) -> String.compare s1 s2) in
|
61
61
|
let total_count = List.length canonical_data_files in
|
62
62
|
List.iter canonical_data_files ~f:(fun (slug, text) ->
|
63
|
-
match parse_json_text text (expected_key_name slug) with
|
63
|
+
match parse_json_text text (expected_key_name slug) (cases_name slug) with
|
64
64
|
| Error e -> print_endline @@ slug ^ ": " ^ (show_error e)
|
65
65
|
| _ -> ok_count := !ok_count + 1
|
66
66
|
);
|
@@ -55,45 +55,45 @@ let parse_case (expected_key: string) (s: json): (case, error) Result.t = match
|
|
55
55
|
| `Assoc assoc -> parse_case_assoc assoc expected_key
|
56
56
|
| _ -> Error ExpectingMapForCase
|
57
57
|
|
58
|
-
let parse_cases (text: string): (json, error) Result.t =
|
59
|
-
match from_string text |> member
|
58
|
+
let parse_cases (text: string) (cases_key: string): (json, error) Result.t =
|
59
|
+
match from_string text |> member cases_key with
|
60
60
|
| `Null -> Error (TestMustHaveKeyCalledCases "xx")
|
61
61
|
| json -> Ok json
|
62
62
|
|
63
|
-
let parse_single (text: string) (expected_key: string): (tests, error) Result.t =
|
63
|
+
let parse_single (text: string) (expected_key: string) (cases_key: string): (tests, error) Result.t =
|
64
64
|
let open Result.Monad_infix in
|
65
|
-
parse_cases text >>=
|
65
|
+
parse_cases text cases_key >>=
|
66
66
|
to_list_note ExpectingListOfCases >>=
|
67
67
|
(sequence >> (List.map ~f:(parse_case expected_key))) >>= fun ts ->
|
68
68
|
Result.return (Single ts)
|
69
69
|
|
70
|
-
let is_suite (json: json) =
|
70
|
+
let is_suite (json: json) (cases_key: string) =
|
71
71
|
let keys = List.filter (keys json) ~f:(fun k -> k <> "methods") in
|
72
72
|
let keys = List.sort keys ~cmp:String.compare in
|
73
|
-
not (List.is_empty keys || keys = [
|
73
|
+
not (List.is_empty keys || keys = [cases_key] || keys = ["#"; cases_key])
|
74
74
|
|
75
75
|
let merge_result = function
|
76
76
|
| (_, Error x) -> Error x
|
77
77
|
| (n, Ok c) -> Ok {name = n; cases = c}
|
78
78
|
|
79
|
-
let parse_cases_from_suite name suite expected_key =
|
79
|
+
let parse_cases_from_suite name suite expected_key cases_key =
|
80
80
|
let open Result.Monad_infix in
|
81
|
-
member_note (TestMustHaveKeyCalledCases name)
|
81
|
+
member_note (TestMustHaveKeyCalledCases name) cases_key suite >>=
|
82
82
|
to_list_note ExpectingListOfCases >>= fun tests ->
|
83
83
|
List.map tests ~f:(parse_case expected_key) |> sequence
|
84
84
|
|
85
|
-
let parse_json_text (text: string) (expected_key: string): (tests, error) Result.t =
|
85
|
+
let parse_json_text (text: string) (expected_key: string) (cases_key: string): (tests, error) Result.t =
|
86
86
|
let open Result.Monad_infix in
|
87
87
|
let json = from_string text in
|
88
|
-
if is_suite json
|
88
|
+
if is_suite json cases_key
|
89
89
|
then
|
90
90
|
to_assoc_note UnrecognizedJson json >>= fun tests ->
|
91
91
|
let tests = List.filter tests ~f:(fun (n, _) -> n <> "#") in
|
92
|
-
let tests = List.map tests ~f:(fun (name, suite) -> merge_result (name, parse_cases_from_suite name suite expected_key)) in
|
92
|
+
let tests = List.map tests ~f:(fun (name, suite) -> merge_result (name, parse_cases_from_suite name suite expected_key cases_key)) in
|
93
93
|
sequence tests >>= fun tests ->
|
94
94
|
Ok (Suite tests)
|
95
95
|
else
|
96
|
-
parse_single text expected_key
|
96
|
+
parse_single text expected_key cases_key
|
97
97
|
|
98
98
|
let show_error = function
|
99
99
|
| TestMustHaveKeyCalledCases name -> "Test named '" ^ name ^ "' is expected to have an object with a key: 'cases'"
|
@@ -59,3 +59,7 @@ let edit_parameters ~(slug: string) (parameters: (string * string) list) = match
|
|
59
59
|
let expected_key_name slug = match slug with
|
60
60
|
| "dominoes" -> "can_chain"
|
61
61
|
| _ -> "expected"
|
62
|
+
|
63
|
+
let cases_name slug = match slug with
|
64
|
+
| "luhn" -> "valid"
|
65
|
+
| _ -> "cases"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open Luhn
|
4
|
+
|
5
|
+
let assert_valid expected input _test_ctxt =
|
6
|
+
assert_equal ~printer:Bool.to_string expected (valid input)
|
7
|
+
|
8
|
+
let tests = [
|
9
|
+
(* TEST
|
10
|
+
"$description" >::
|
11
|
+
assert_valid $expected "$input";
|
12
|
+
END TEST *)
|
13
|
+
]
|
14
|
+
|
15
|
+
let () =
|
16
|
+
run_test_tt_main ("luhn tests" >::: tests)
|
@@ -12,11 +12,11 @@ let ae exp got _test_ctxt = assert_equal exp got ~printer:show_cases
|
|
12
12
|
|
13
13
|
let single x = Ok (Single x)
|
14
14
|
|
15
|
-
let call_parser json = parse_json_text json "expected"
|
15
|
+
let call_parser json = parse_json_text json "expected" "cases"
|
16
16
|
|
17
17
|
let parser_tests = [
|
18
18
|
"parses empty json as empty list" >::
|
19
|
-
ae (single []) (
|
19
|
+
ae (single []) (parse_json_text "{\"test-cases\" : []}" "expected" "test-cases");
|
20
20
|
|
21
21
|
"gives an error with a json map that does not have the key cases in" >::
|
22
22
|
ae (Error (TestMustHaveKeyCalledCases "case"))
|
data/tracks/pascal/config.json
CHANGED
@@ -9,13 +9,12 @@ type
|
|
9
9
|
HelloWorldTest = class(TObject)
|
10
10
|
public
|
11
11
|
[Test]
|
12
|
-
// [Ignore]
|
13
12
|
procedure test_no_name;
|
14
13
|
[Test]
|
15
|
-
|
14
|
+
[Ignore('Comment this line to run this test')]
|
16
15
|
procedure test_sample_name;
|
17
16
|
[Test]
|
18
|
-
|
17
|
+
[Ignore('Comment this line to run this test')]
|
19
18
|
procedure test_other_sample_name;
|
20
19
|
end;
|
21
20
|
|
data/tracks/scala/config.json
CHANGED
@@ -349,18 +349,27 @@
|
|
349
349
|
"slug": "pascals-triangle",
|
350
350
|
"difficulty": 1,
|
351
351
|
"topics": [
|
352
|
+
"Control-flow (loops)",
|
353
|
+
"Lists",
|
354
|
+
"Mathematics"
|
352
355
|
]
|
353
356
|
},
|
354
357
|
{
|
355
358
|
"slug": "pig-latin",
|
356
359
|
"difficulty": 1,
|
357
360
|
"topics": [
|
361
|
+
"Strings",
|
362
|
+
"Transforming"
|
358
363
|
]
|
359
364
|
},
|
360
365
|
{
|
361
366
|
"slug": "pythagorean-triplet",
|
362
367
|
"difficulty": 1,
|
363
368
|
"topics": [
|
369
|
+
"Integers",
|
370
|
+
"Mathematics",
|
371
|
+
"Sequences",
|
372
|
+
"Tuples"
|
364
373
|
]
|
365
374
|
},
|
366
375
|
{
|
@@ -1,3 +1,3 @@
|
|
1
|
-
scalaVersion := "2.
|
1
|
+
scalaVersion := "2.12.1"
|
2
2
|
|
3
|
-
libraryDependencies += "org.scalatest"
|
3
|
+
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"
|
@@ -1,3 +1,3 @@
|
|
1
|
-
scalaVersion := "2.
|
1
|
+
scalaVersion := "2.12.1"
|
2
2
|
|
3
|
-
libraryDependencies += "org.scalatest"
|
3
|
+
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"
|
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.
|
4
|
+
version: 2.0.6.9
|
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-
|
11
|
+
date: 2017-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -3756,6 +3756,10 @@ files:
|
|
3756
3756
|
- tracks/java/exercises/trinary/src/example/java/Trinary.java
|
3757
3757
|
- tracks/java/exercises/trinary/src/main/java/.keep
|
3758
3758
|
- tracks/java/exercises/trinary/src/test/java/TrinaryTest.java
|
3759
|
+
- tracks/java/exercises/twelve-days/build.gradle
|
3760
|
+
- tracks/java/exercises/twelve-days/src/example/java/TwelveDays.java
|
3761
|
+
- tracks/java/exercises/twelve-days/src/main/java/.keep
|
3762
|
+
- tracks/java/exercises/twelve-days/src/test/java/TwelveDaysTest.java
|
3759
3763
|
- tracks/java/exercises/word-count/build.gradle
|
3760
3764
|
- tracks/java/exercises/word-count/src/example/java/WordCount.java
|
3761
3765
|
- tracks/java/exercises/word-count/src/main/java/.keep
|
@@ -5058,6 +5062,7 @@ files:
|
|
5058
5062
|
- tracks/ocaml/tools/test-generator/templates/hamming/template.ml
|
5059
5063
|
- tracks/ocaml/tools/test-generator/templates/hello-world/template.ml
|
5060
5064
|
- tracks/ocaml/tools/test-generator/templates/leap/template.ml
|
5065
|
+
- tracks/ocaml/tools/test-generator/templates/luhn/template.ml
|
5061
5066
|
- tracks/ocaml/tools/test-generator/templates/minesweeper/template.ml
|
5062
5067
|
- tracks/ocaml/tools/test-generator/templates/raindrops/template.ml
|
5063
5068
|
- tracks/ocaml/tools/test-generator/templates/say/template.ml
|