trackler 2.0.6.22 → 2.0.6.23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/common/exercises/book-store/canonical-data.json +61 -80
- data/common/exercises/etl/canonical-data.json +69 -0
- data/lib/trackler/version.rb +1 -1
- data/tracks/go/config.json +10 -4
- data/tracks/java/config.json +13 -1
- data/tracks/java/exercises/diamond/build.gradle +17 -0
- data/tracks/java/exercises/diamond/src/example/java/DiamondPrinter.java +41 -0
- data/tracks/java/exercises/diamond/src/main/java/DiamondPrinter.java +5 -0
- data/tracks/java/exercises/diamond/src/test/java/DiamondPrinterTest.java +111 -0
- data/tracks/java/exercises/grade-school/src/example/java/School.java +20 -19
- data/tracks/java/exercises/grade-school/src/test/java/SchoolTest.java +53 -20
- data/tracks/java/exercises/secret-handshake/build.gradle +17 -0
- data/tracks/java/exercises/secret-handshake/src/example/java/HandshakeCalculator.java +29 -0
- data/tracks/java/exercises/secret-handshake/src/example/java/Signal.java +1 -0
- data/tracks/java/exercises/secret-handshake/src/main/java/HandshakeCalculator.java +5 -0
- data/tracks/java/exercises/secret-handshake/src/main/java/Signal.java +5 -0
- data/tracks/java/exercises/secret-handshake/src/test/java/HandshakeCalculatorTest.java +106 -0
- data/tracks/java/exercises/settings.gradle +2 -0
- data/tracks/julia/config.json +42 -0
- data/tracks/julia/exercises/bob/bob.jl +3 -0
- data/tracks/julia/exercises/bob/example.jl +30 -0
- data/tracks/julia/exercises/bob/runtests.jl +70 -0
- data/tracks/julia/exercises/difference-of-squares/difference-of-squares.jl +14 -0
- data/tracks/julia/exercises/difference-of-squares/example.jl +9 -0
- data/tracks/julia/exercises/difference-of-squares/runtests.jl +22 -0
- data/tracks/julia/exercises/hamming/example.jl +5 -0
- data/tracks/julia/exercises/hamming/hamming.jl +3 -0
- data/tracks/julia/exercises/hamming/runtests.jl +42 -0
- data/tracks/julia/exercises/hello-world/example.jl +3 -0
- data/tracks/julia/exercises/hello-world/hello-world.jl +3 -0
- data/tracks/julia/exercises/hello-world/runtests.jl +12 -0
- data/tracks/julia/exercises/word-count/example.jl +9 -0
- data/tracks/julia/exercises/word-count/runtests.jl +47 -0
- data/tracks/julia/exercises/word-count/word-count.jl +3 -0
- data/tracks/objective-c/config.json +10 -0
- data/tracks/objective-c/exercises/flatten-array/FlattenArrayExample.h +6 -0
- data/tracks/objective-c/exercises/flatten-array/FlattenArrayExample.m +48 -0
- data/tracks/objective-c/exercises/flatten-array/FlattenArrayTest.m +110 -0
- data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +33 -0
- data/tracks/ocaml/config.json +5 -0
- data/tracks/ocaml/exercises/pangram/.merlin +3 -0
- data/tracks/ocaml/exercises/pangram/Makefile +11 -0
- data/tracks/ocaml/exercises/pangram/example.ml +9 -0
- data/tracks/ocaml/exercises/pangram/pangram.mli +1 -0
- data/tracks/ocaml/exercises/pangram/test.ml +29 -0
- data/tracks/ocaml/tools/test-generator/templates/pangram/template.ml +15 -0
- data/tracks/pascal/config.json +8 -0
- data/tracks/pascal/docs/INSTALLATION.md +3 -3
- data/tracks/pascal/docs/img/07delphiclicklibrarypathbuttonLogo.png +0 -0
- data/tracks/pascal/exercises/grains/GrainsTests.dpr +60 -0
- data/tracks/pascal/exercises/grains/uGrainsExample.pas +33 -0
- data/tracks/pascal/exercises/grains/uGrainsTests.pas +149 -0
- data/tracks/perl6/SETUP.md +8 -2
- metadata +41 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9cf87d7b9dd56a6a58b3c1d87d9a23ef21f730d8
|
4
|
+
data.tar.gz: eb35ab1854d690d7fc64b61977fe31f29d3735c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa2bf7b5e78b0ae76d088865728a0703ff112c64841abcc5eb621e9bfc76b367ff3c247d27788c990034c6e9af98a64d7cb2862c4c2a881189b41d909bb6c6b3
|
7
|
+
data.tar.gz: 967886a22857e8f2e2bebb00ffd20a2ed6102c649a66f9e555a76524dbaf63371fd83239697bee6866cc0fd69858bd7f66c644e5e006cb2d72a672df800685b7
|
@@ -1,106 +1,87 @@
|
|
1
1
|
{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
"book-store": {
|
3
|
+
"description": [
|
4
|
+
"Calculate lowest price for a shopping basket containing ",
|
5
|
+
"books only from a single series. There is no ",
|
6
|
+
"discount advantage for having more than one copy of ",
|
7
|
+
"any single book in a grouping."
|
8
|
+
],
|
9
|
+
"total": {
|
10
|
+
"description": "returns the total basket price after applying best discount",
|
11
|
+
"cases": [
|
10
12
|
{
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
"description": "Only a single book",
|
14
|
+
"basket": [1],
|
15
|
+
"targetgrouping": [[1]],
|
16
|
+
"expected": 8.00
|
15
17
|
},
|
16
18
|
{
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
"description": "Two of the same book",
|
20
|
+
"basket": [2,2],
|
21
|
+
"targetgrouping": [[2],[2]],
|
22
|
+
"expected": 16.00
|
21
23
|
},
|
22
24
|
{
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
"description": "Empty basket",
|
26
|
+
"basket": [],
|
27
|
+
"targetgrouping": [],
|
28
|
+
"expected": 0.00
|
27
29
|
},
|
28
30
|
{
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
"description": "Two different books",
|
32
|
+
"basket": [1,2],
|
33
|
+
"targetgrouping": [[1,2]],
|
34
|
+
"expected": 15.20
|
33
35
|
},
|
34
36
|
{
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
"description": "Three different books",
|
38
|
+
"basket": [1,2,3],
|
39
|
+
"targetgrouping": [[1,2,3]],
|
40
|
+
"expected": 21.60
|
39
41
|
},
|
40
42
|
{
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
43
|
+
"description": "Four different books",
|
44
|
+
"basket": [1,2,3,4],
|
45
|
+
"targetgrouping": [[1,2,3,4]],
|
46
|
+
"expected": 25.60
|
45
47
|
},
|
46
48
|
{
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
49
|
+
"description": "Five different books",
|
50
|
+
"basket": [1,2,3,4,5],
|
51
|
+
"targetgrouping": [[1,2,3,4,5]],
|
52
|
+
"expected": 30.00
|
51
53
|
},
|
52
54
|
{
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
"attention to this particular target grouping, it ",
|
58
|
-
"is not intuitive, but does grant the largest ",
|
59
|
-
"discount."
|
60
|
-
],
|
61
|
-
"basket": [1, 1, 2, 2, 3, 3, 4, 5],
|
62
|
-
"targetgrouping": [[1, 2, 3, 4], [1, 2, 3, 5]],
|
63
|
-
"expected": 51.20
|
55
|
+
"description": "Two each of first 3 books and 1 copy each of rest",
|
56
|
+
"basket": [1,1,2,2,3,3,4,5],
|
57
|
+
"targetgrouping": [[1,2,3,4],[1,2,3,5]],
|
58
|
+
"expected": 51.20
|
64
59
|
},
|
65
60
|
{
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
],
|
71
|
-
"basket": [1, 1, 2, 2, 3, 3, 4, 4, 5],
|
72
|
-
"targetgrouping": [[1, 2, 3, 4, 5], [1, 2, 3, 4]],
|
73
|
-
"expected": 55.60
|
61
|
+
"description": "Two each of first 4 books and 1 copy each of rest",
|
62
|
+
"basket": [1,1,2,2,3,3,4,4,5],
|
63
|
+
"targetgrouping": [[1,2,3,4,5],[1,2,3,4]],
|
64
|
+
"expected": 55.60
|
74
65
|
},
|
75
66
|
{
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
"basket": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5],
|
81
|
-
"targetgrouping": [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]],
|
82
|
-
"expected": 60.00
|
67
|
+
"description": "Two copies of each book",
|
68
|
+
"basket": [1,1,2,2,3,3,4,4,5,5],
|
69
|
+
"targetgrouping": [[1,2,3,4,5],[1,2,3,4,5]],
|
70
|
+
"expected": 60.00
|
83
71
|
},
|
84
72
|
{
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
],
|
90
|
-
"basket": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1],
|
91
|
-
"targetgrouping": [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1]],
|
92
|
-
"expected": 68.00
|
73
|
+
"description": "Three copies of first book and 2 each of remaining",
|
74
|
+
"basket": [1,1,2,2,3,3,4,4,5,5,1],
|
75
|
+
"targetgrouping": [[1,2,3,4,5],[1,2,3,4,5],[1]],
|
76
|
+
"expected": 68.00
|
93
77
|
},
|
94
78
|
{
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
],
|
100
|
-
"basket": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2],
|
101
|
-
"targetgrouping": [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2]],
|
102
|
-
"expected": 75.20
|
79
|
+
"description": "Three each of first 2 books and 2 each of remaining books",
|
80
|
+
"basket": [1,1,2,2,3,3,4,4,5,5,1,2],
|
81
|
+
"targetgrouping": [[1,2,3,4,5],[1,2,3,4,5],[1,2]],
|
82
|
+
"expected": 75.20
|
103
83
|
}
|
104
|
-
|
105
|
-
}
|
84
|
+
]
|
85
|
+
}
|
86
|
+
}
|
106
87
|
}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
{
|
2
|
+
"transform": {
|
3
|
+
"#": [
|
4
|
+
"Note: The expected input data for these tests should have",
|
5
|
+
"integer keys (not stringified numbers as shown in the JSON below",
|
6
|
+
"Unless the language prohibits that, please implement these tests",
|
7
|
+
"such that keys are integers. e.g. in JavaScript, it might look ",
|
8
|
+
"like `transform( { 1: ['A'] } );`"
|
9
|
+
],
|
10
|
+
"description": "transforms the a set of scrabble data previously indexed by the tile score to a set of data indexed by the tile letter",
|
11
|
+
"cases": [
|
12
|
+
{
|
13
|
+
"description": "a single letter",
|
14
|
+
"input": {
|
15
|
+
"1": ["A"]
|
16
|
+
},
|
17
|
+
"expected": {
|
18
|
+
"a" : 1
|
19
|
+
}
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"description": "single score with multiple letters",
|
23
|
+
"input": {
|
24
|
+
"1": ["A", "E", "I", "O", "U" ]
|
25
|
+
},
|
26
|
+
"expected": {
|
27
|
+
"a" : 1,
|
28
|
+
"e" : 1,
|
29
|
+
"i" : 1,
|
30
|
+
"o" : 1,
|
31
|
+
"u" : 1
|
32
|
+
}
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"description": "multiple scores with multiple letters",
|
36
|
+
"input": {
|
37
|
+
"1": ["A", "E"],
|
38
|
+
"2": ["D", "G"]
|
39
|
+
},
|
40
|
+
"expected": {
|
41
|
+
"a" : 1,
|
42
|
+
"e" : 1,
|
43
|
+
"d" : 2,
|
44
|
+
"g" : 2
|
45
|
+
}
|
46
|
+
},
|
47
|
+
{
|
48
|
+
"description": "multiple scores with differing numbers of letters",
|
49
|
+
"input": {
|
50
|
+
"1": [ "A", "E", "I", "O", "U", "L", "N", "R", "S", "T" ],
|
51
|
+
"2": [ "D", "G" ],
|
52
|
+
"3": [ "B", "C", "M", "P" ],
|
53
|
+
"4": [ "F", "H", "V", "W", "Y" ],
|
54
|
+
"5": [ "K" ],
|
55
|
+
"8": [ "J", "X" ],
|
56
|
+
"10": [ "Q", "Z" ]
|
57
|
+
},
|
58
|
+
"expected": {
|
59
|
+
"a": 1, "b": 3, "c": 3, "d": 2, "e": 1,
|
60
|
+
"f": 4, "g": 2, "h": 4, "i": 1, "j": 8,
|
61
|
+
"k": 5, "l": 1, "m": 3, "n": 1, "o": 1,
|
62
|
+
"p": 3, "q": 10, "r": 1, "s": 1, "t": 1,
|
63
|
+
"u": 1, "v": 4, "w": 4, "x": 8, "y": 4,
|
64
|
+
"z": 10
|
65
|
+
}
|
66
|
+
}
|
67
|
+
]
|
68
|
+
}
|
69
|
+
}
|
data/lib/trackler/version.rb
CHANGED
data/tracks/go/config.json
CHANGED
@@ -90,14 +90,20 @@
|
|
90
90
|
]
|
91
91
|
},
|
92
92
|
{
|
93
|
-
"difficulty":
|
93
|
+
"difficulty": 2,
|
94
94
|
"slug": "pangram",
|
95
|
-
"topics": [
|
95
|
+
"topics": [
|
96
|
+
"Control-flow (loops)",
|
97
|
+
"Strings"
|
98
|
+
]
|
96
99
|
},
|
97
100
|
{
|
98
|
-
"difficulty":
|
101
|
+
"difficulty": 2,
|
99
102
|
"slug": "bob",
|
100
|
-
"topics": [
|
103
|
+
"topics": [
|
104
|
+
"Control-flow (conditionals)",
|
105
|
+
"Strings"
|
106
|
+
]
|
101
107
|
},
|
102
108
|
{
|
103
109
|
"difficulty": 1,
|
data/tracks/java/config.json
CHANGED
@@ -57,7 +57,9 @@
|
|
57
57
|
"twelve-days",
|
58
58
|
"sublist",
|
59
59
|
"rectangles",
|
60
|
-
"matrix"
|
60
|
+
"matrix",
|
61
|
+
"diamond",
|
62
|
+
"secret-handshake"
|
61
63
|
],
|
62
64
|
"exercises": [
|
63
65
|
{
|
@@ -329,6 +331,16 @@
|
|
329
331
|
"slug": "matrix",
|
330
332
|
"difficulty": 1,
|
331
333
|
"topics": []
|
334
|
+
},
|
335
|
+
{
|
336
|
+
"slug": "diamond",
|
337
|
+
"difficulty": 1,
|
338
|
+
"topics": []
|
339
|
+
},
|
340
|
+
{
|
341
|
+
"slug": "secret-handshake",
|
342
|
+
"difficulty": 1,
|
343
|
+
"topics": []
|
332
344
|
}
|
333
345
|
],
|
334
346
|
"deprecated": [
|
@@ -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,41 @@
|
|
1
|
+
import java.util.ArrayList;
|
2
|
+
import java.util.Collections;
|
3
|
+
import java.util.List;
|
4
|
+
|
5
|
+
final class DiamondPrinter {
|
6
|
+
|
7
|
+
private static final int A_INT = (int) 'A';
|
8
|
+
|
9
|
+
private static String blank(final int length) {
|
10
|
+
return String.join("", Collections.nCopies(length, " "));
|
11
|
+
}
|
12
|
+
|
13
|
+
private static String reverse(final String string) {
|
14
|
+
return new StringBuilder(string).reverse().toString();
|
15
|
+
}
|
16
|
+
|
17
|
+
List<String> printToList(final char chr) {
|
18
|
+
final int nRows = 2 * ((int) chr - A_INT) + 1;
|
19
|
+
|
20
|
+
final List<String> topRows = new ArrayList<>();
|
21
|
+
|
22
|
+
// Populate the top rows.
|
23
|
+
for (int nRow = 0; nRow < (nRows + 1) / 2; nRow++) {
|
24
|
+
final char rowChr = (char) (A_INT + nRow);
|
25
|
+
|
26
|
+
final String leftHalfOfRow = blank((nRows - 1) / 2 - nRow) + rowChr + blank(nRow);
|
27
|
+
final String rightHalfOfRow = reverse(leftHalfOfRow.substring(0, leftHalfOfRow.length() - 1));
|
28
|
+
final String fullRow = leftHalfOfRow + rightHalfOfRow;
|
29
|
+
|
30
|
+
topRows.add(fullRow);
|
31
|
+
}
|
32
|
+
|
33
|
+
// Populate the bottom rows by 'reflecting' the top rows.
|
34
|
+
for (int nRow = (nRows - 1) / 2 - 1; nRow >= 0; nRow--) {
|
35
|
+
topRows.add(topRows.get(nRow));
|
36
|
+
}
|
37
|
+
|
38
|
+
return topRows;
|
39
|
+
}
|
40
|
+
|
41
|
+
}
|
@@ -0,0 +1,111 @@
|
|
1
|
+
import org.junit.Ignore;
|
2
|
+
import org.junit.Test;
|
3
|
+
|
4
|
+
import java.util.List;
|
5
|
+
|
6
|
+
import static java.util.Arrays.asList;
|
7
|
+
import static java.util.Collections.singletonList;
|
8
|
+
import static org.hamcrest.CoreMatchers.is;
|
9
|
+
import static org.junit.Assert.assertThat;
|
10
|
+
|
11
|
+
public final class DiamondPrinterTest {
|
12
|
+
|
13
|
+
@Test
|
14
|
+
public void testOneByOneDiamond() {
|
15
|
+
List<String> output = new DiamondPrinter().printToList('A');
|
16
|
+
assertThat(output, is(singletonList("A")));
|
17
|
+
}
|
18
|
+
|
19
|
+
@Ignore
|
20
|
+
@Test
|
21
|
+
public void testTwoByTwoDiamond() {
|
22
|
+
List<String> output = new DiamondPrinter().printToList('B');
|
23
|
+
assertThat(output, is(asList(" A ",
|
24
|
+
"B B",
|
25
|
+
" A ")));
|
26
|
+
}
|
27
|
+
|
28
|
+
@Ignore
|
29
|
+
@Test
|
30
|
+
public void testThreeByThreeDiamond() {
|
31
|
+
List<String> output = new DiamondPrinter().printToList('C');
|
32
|
+
assertThat(output, is(asList(" A ",
|
33
|
+
" B B ",
|
34
|
+
"C C",
|
35
|
+
" B B ",
|
36
|
+
" A ")));
|
37
|
+
}
|
38
|
+
|
39
|
+
@Ignore
|
40
|
+
@Test
|
41
|
+
public void testFiveByFiveDiamond() {
|
42
|
+
List<String> output = new DiamondPrinter().printToList('E');
|
43
|
+
assertThat(output, is(asList(" A ",
|
44
|
+
" B B ",
|
45
|
+
" C C ",
|
46
|
+
" D D ",
|
47
|
+
"E E",
|
48
|
+
" D D ",
|
49
|
+
" C C ",
|
50
|
+
" B B ",
|
51
|
+
" A ")));
|
52
|
+
}
|
53
|
+
|
54
|
+
@Ignore
|
55
|
+
@Test
|
56
|
+
public void testFullDiamond() {
|
57
|
+
List<String> output = new DiamondPrinter().printToList('Z');
|
58
|
+
assertThat(output, is(asList(" A ",
|
59
|
+
" B B ",
|
60
|
+
" C C ",
|
61
|
+
" D D ",
|
62
|
+
" E E ",
|
63
|
+
" F F ",
|
64
|
+
" G G ",
|
65
|
+
" H H ",
|
66
|
+
" I I ",
|
67
|
+
" J J ",
|
68
|
+
" K K ",
|
69
|
+
" L L ",
|
70
|
+
" M M ",
|
71
|
+
" N N ",
|
72
|
+
" O O ",
|
73
|
+
" P P ",
|
74
|
+
" Q Q ",
|
75
|
+
" R R ",
|
76
|
+
" S S ",
|
77
|
+
" T T ",
|
78
|
+
" U U ",
|
79
|
+
" V V ",
|
80
|
+
" W W ",
|
81
|
+
" X X ",
|
82
|
+
" Y Y ",
|
83
|
+
"Z Z",
|
84
|
+
" Y Y ",
|
85
|
+
" X X ",
|
86
|
+
" W W ",
|
87
|
+
" V V ",
|
88
|
+
" U U ",
|
89
|
+
" T T ",
|
90
|
+
" S S ",
|
91
|
+
" R R ",
|
92
|
+
" Q Q ",
|
93
|
+
" P P ",
|
94
|
+
" O O ",
|
95
|
+
" N N ",
|
96
|
+
" M M ",
|
97
|
+
" L L ",
|
98
|
+
" K K ",
|
99
|
+
" J J ",
|
100
|
+
" I I ",
|
101
|
+
" H H ",
|
102
|
+
" G G ",
|
103
|
+
" F F ",
|
104
|
+
" E E ",
|
105
|
+
" D D ",
|
106
|
+
" C C ",
|
107
|
+
" B B ",
|
108
|
+
" A ")));
|
109
|
+
}
|
110
|
+
|
111
|
+
}
|