trackler 2.2.1.97 → 2.2.1.98
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/custom-set/canonical-data.json +139 -69
- data/tracks/go/README.md +6 -1
- data/tracks/go/exercises/accumulate/accumulate_test.go +2 -5
- data/tracks/go/exercises/allergies/allergies_test.go +5 -11
- data/tracks/go/exercises/anagram/anagram_test.go +2 -6
- data/tracks/go/exercises/atbash-cipher/atbash_cipher_test.go +2 -5
- data/tracks/go/exercises/beer-song/beer_test.go +2 -5
- data/tracks/go/exercises/bob/bob_test.go +2 -2
- data/tracks/go/exercises/bracket-push/bracket_push_test.go +2 -5
- data/tracks/go/exercises/change/change_test.go +2 -2
- data/tracks/go/exercises/etl/etl_test.go +2 -5
- data/tracks/go/exercises/grains/grains_test.go +2 -5
- data/tracks/go/exercises/isogram/isogram_test.go +2 -5
- data/tracks/go/exercises/octal/octal_test.go +2 -5
- data/tracks/go/exercises/pangram/.meta/gen.go +5 -3
- data/tracks/go/exercises/pangram/cases_test.go +2 -2
- data/tracks/go/exercises/perfect-numbers/.meta/gen.go +5 -3
- data/tracks/go/exercises/perfect-numbers/cases_test.go +2 -2
- data/tracks/go/exercises/phone-number/.meta/gen.go +5 -3
- data/tracks/go/exercises/phone-number/cases_test.go +2 -2
- data/tracks/go/exercises/phone-number/phone_number_test.go +6 -15
- data/tracks/go/exercises/pig-latin/.meta/gen.go +5 -3
- data/tracks/go/exercises/pig-latin/cases_test.go +2 -2
- data/tracks/go/exercises/transpose/transpose_test.go +2 -2
- data/tracks/ocaml/docs/INSTALLATION.md +35 -4
- data/tracks/ocaml/exercises/atbash-cipher/{HINTS.md → .meta/hints.md} +0 -0
- data/tracks/ocaml/exercises/bob/{HINTS.md → .meta/hints.md} +0 -0
- data/tracks/ocaml/exercises/prime-factors/example.ml +2 -3
- data/tracks/perl6/.travis.yml +1 -0
- data/tracks/perl6/bin/exercise-gen.pl6 +38 -33
- data/tracks/perl6/lib/Exercism/Generator.pm6 +37 -0
- data/tracks/perl6/t/generated-tests.t +18 -0
- data/tracks/ruby/exercises/accumulate/README.md +0 -3
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61557d8c8f53297686afbfb79d34fd4bb855673b
|
4
|
+
data.tar.gz: 0e787d40634a430d4019195d58f4fdff356f82ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfd3d1d4c263d6dc3bc615d67eb273808855a2c2bfee91201963dcc168350f1b30c8fe8efe04a145d20900976a824d52a6e6540f686c42c1a81cdbf5c3108a54
|
7
|
+
data.tar.gz: a203c0f9128acfb983935569b854b134213a3da2aa254fc3a6e94565c2b3b22df296fc3027783cce311c64c22eb9415cb926c8c1e402db33f6cdcef96c52263f
|
data/lib/trackler/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"exercise": "custom-set",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.2.0",
|
4
4
|
"comments": [
|
5
5
|
"These tests cover the core components of a set data structure: checking",
|
6
6
|
"presence, adding, comparing and basic set operations. Other features",
|
@@ -18,13 +18,17 @@
|
|
18
18
|
{
|
19
19
|
"description": "sets with no elements are empty",
|
20
20
|
"property": "empty",
|
21
|
-
"
|
21
|
+
"input": {
|
22
|
+
"set": []
|
23
|
+
},
|
22
24
|
"expected": true
|
23
25
|
},
|
24
26
|
{
|
25
27
|
"description": "sets with elements are not empty",
|
26
28
|
"property": "empty",
|
27
|
-
"
|
29
|
+
"input": {
|
30
|
+
"set": [1]
|
31
|
+
},
|
28
32
|
"expected": false
|
29
33
|
}
|
30
34
|
]
|
@@ -35,22 +39,28 @@
|
|
35
39
|
{
|
36
40
|
"description": "nothing is contained in an empty set",
|
37
41
|
"property": "contains",
|
38
|
-
"
|
39
|
-
|
42
|
+
"input": {
|
43
|
+
"set": [],
|
44
|
+
"element": 1
|
45
|
+
},
|
40
46
|
"expected": false
|
41
47
|
},
|
42
48
|
{
|
43
49
|
"description": "when the element is in the set",
|
44
50
|
"property": "contains",
|
45
|
-
"
|
46
|
-
|
51
|
+
"input": {
|
52
|
+
"set": [1, 2, 3],
|
53
|
+
"element": 1
|
54
|
+
},
|
47
55
|
"expected": true
|
48
56
|
},
|
49
57
|
{
|
50
58
|
"description": "when the element is not in the set",
|
51
59
|
"property": "contains",
|
52
|
-
"
|
53
|
-
|
60
|
+
"input": {
|
61
|
+
"set": [1, 2, 3],
|
62
|
+
"element": 4
|
63
|
+
},
|
54
64
|
"expected": false
|
55
65
|
}
|
56
66
|
]
|
@@ -61,43 +71,55 @@
|
|
61
71
|
{
|
62
72
|
"description": "empty set is a subset of another empty set",
|
63
73
|
"property": "subset",
|
64
|
-
"
|
65
|
-
|
74
|
+
"input": {
|
75
|
+
"set1": [],
|
76
|
+
"set2": []
|
77
|
+
},
|
66
78
|
"expected": true
|
67
79
|
},
|
68
80
|
{
|
69
81
|
"description": "empty set is a subset of non-empty set",
|
70
82
|
"property": "subset",
|
71
|
-
"
|
72
|
-
|
83
|
+
"input": {
|
84
|
+
"set1": [],
|
85
|
+
"set2": [1]
|
86
|
+
},
|
73
87
|
"expected": true
|
74
88
|
},
|
75
89
|
{
|
76
90
|
"description": "non-empty set is not a subset of empty set",
|
77
91
|
"property": "subset",
|
78
|
-
"
|
79
|
-
|
92
|
+
"input": {
|
93
|
+
"set1": [1],
|
94
|
+
"set2": []
|
95
|
+
},
|
80
96
|
"expected": false
|
81
97
|
},
|
82
98
|
{
|
83
99
|
"description": "set is a subset of set with exact same elements",
|
84
100
|
"property": "subset",
|
85
|
-
"
|
86
|
-
|
101
|
+
"input": {
|
102
|
+
"set1": [1, 2, 3],
|
103
|
+
"set2": [1, 2, 3]
|
104
|
+
},
|
87
105
|
"expected": true
|
88
106
|
},
|
89
107
|
{
|
90
108
|
"description": "set is a subset of larger set with same elements",
|
91
109
|
"property": "subset",
|
92
|
-
"
|
93
|
-
|
110
|
+
"input": {
|
111
|
+
"set1": [1, 2, 3],
|
112
|
+
"set2": [4, 1, 2, 3]
|
113
|
+
},
|
94
114
|
"expected": true
|
95
115
|
},
|
96
116
|
{
|
97
117
|
"description": "set is not a subset of set that does not contain its elements",
|
98
118
|
"property": "subset",
|
99
|
-
"
|
100
|
-
|
119
|
+
"input": {
|
120
|
+
"set1": [1, 2, 3],
|
121
|
+
"set2": [4, 1, 3]
|
122
|
+
},
|
101
123
|
"expected": false
|
102
124
|
}
|
103
125
|
]
|
@@ -108,36 +130,46 @@
|
|
108
130
|
{
|
109
131
|
"description": "the empty set is disjoint with itself",
|
110
132
|
"property": "disjoint",
|
111
|
-
"
|
112
|
-
|
133
|
+
"input": {
|
134
|
+
"set1": [],
|
135
|
+
"set2": []
|
136
|
+
},
|
113
137
|
"expected": true
|
114
138
|
},
|
115
139
|
{
|
116
140
|
"description": "empty set is disjoint with non-empty set",
|
117
141
|
"property": "disjoint",
|
118
|
-
"
|
119
|
-
|
142
|
+
"input": {
|
143
|
+
"set1": [],
|
144
|
+
"set2": [1]
|
145
|
+
},
|
120
146
|
"expected": true
|
121
147
|
},
|
122
148
|
{
|
123
149
|
"description": "non-empty set is disjoint with empty set",
|
124
150
|
"property": "disjoint",
|
125
|
-
"
|
126
|
-
|
151
|
+
"input": {
|
152
|
+
"set1": [1],
|
153
|
+
"set2": []
|
154
|
+
},
|
127
155
|
"expected": true
|
128
156
|
},
|
129
157
|
{
|
130
158
|
"description": "sets are not disjoint if they share an element",
|
131
159
|
"property": "disjoint",
|
132
|
-
"
|
133
|
-
|
160
|
+
"input": {
|
161
|
+
"set1": [1, 2],
|
162
|
+
"set2": [2, 3]
|
163
|
+
},
|
134
164
|
"expected": false
|
135
165
|
},
|
136
166
|
{
|
137
167
|
"description": "sets are disjoint if they share no elements",
|
138
168
|
"property": "disjoint",
|
139
|
-
"
|
140
|
-
|
169
|
+
"input": {
|
170
|
+
"set1": [1, 2],
|
171
|
+
"set2": [3, 4]
|
172
|
+
},
|
141
173
|
"expected": true
|
142
174
|
}
|
143
175
|
]
|
@@ -148,43 +180,55 @@
|
|
148
180
|
{
|
149
181
|
"description": "empty sets are equal",
|
150
182
|
"property": "equal",
|
151
|
-
"
|
152
|
-
|
183
|
+
"input": {
|
184
|
+
"set1": [],
|
185
|
+
"set2": []
|
186
|
+
},
|
153
187
|
"expected": true
|
154
188
|
},
|
155
189
|
{
|
156
190
|
"description": "empty set is not equal to non-empty set",
|
157
191
|
"property": "equal",
|
158
|
-
"
|
159
|
-
|
192
|
+
"input": {
|
193
|
+
"set1": [],
|
194
|
+
"set2": [1, 2, 3]
|
195
|
+
},
|
160
196
|
"expected": false
|
161
197
|
},
|
162
198
|
{
|
163
199
|
"description": "non-empty set is not equal to empty set",
|
164
200
|
"property": "equal",
|
165
|
-
"
|
166
|
-
|
201
|
+
"input": {
|
202
|
+
"set1": [1, 2, 3],
|
203
|
+
"set2": []
|
204
|
+
},
|
167
205
|
"expected": false
|
168
206
|
},
|
169
207
|
{
|
170
208
|
"description": "sets with the same elements are equal",
|
171
209
|
"property": "equal",
|
172
|
-
"
|
173
|
-
|
210
|
+
"input": {
|
211
|
+
"set1": [1, 2],
|
212
|
+
"set2": [2, 1]
|
213
|
+
},
|
174
214
|
"expected": true
|
175
215
|
},
|
176
216
|
{
|
177
217
|
"description": "sets with different elements are not equal",
|
178
218
|
"property": "equal",
|
179
|
-
"
|
180
|
-
|
219
|
+
"input": {
|
220
|
+
"set1": [1, 2, 3],
|
221
|
+
"set2": [1, 2, 4]
|
222
|
+
},
|
181
223
|
"expected": false
|
182
224
|
},
|
183
225
|
{
|
184
226
|
"description": "set is not equal to larger set with same elements",
|
185
227
|
"property": "equal",
|
186
|
-
"
|
187
|
-
|
228
|
+
"input": {
|
229
|
+
"set1": [1, 2, 3],
|
230
|
+
"set2": [1, 2, 3, 4]
|
231
|
+
},
|
188
232
|
"expected": false
|
189
233
|
}
|
190
234
|
]
|
@@ -221,36 +265,46 @@
|
|
221
265
|
{
|
222
266
|
"description": "intersection of two empty sets is an empty set",
|
223
267
|
"property": "intersection",
|
224
|
-
"
|
225
|
-
|
268
|
+
"input": {
|
269
|
+
"set1": [],
|
270
|
+
"set2": []
|
271
|
+
},
|
226
272
|
"expected": []
|
227
273
|
},
|
228
274
|
{
|
229
275
|
"description": "intersection of an empty set and non-empty set is an empty set",
|
230
276
|
"property": "intersection",
|
231
|
-
"
|
232
|
-
|
277
|
+
"input": {
|
278
|
+
"set1": [],
|
279
|
+
"set2": [3, 2, 5]
|
280
|
+
},
|
233
281
|
"expected": []
|
234
282
|
},
|
235
283
|
{
|
236
284
|
"description": "intersection of a non-empty set and an empty set is an empty set",
|
237
285
|
"property": "intersection",
|
238
|
-
"
|
239
|
-
|
286
|
+
"input": {
|
287
|
+
"set1": [1, 2, 3, 4],
|
288
|
+
"set2": []
|
289
|
+
},
|
240
290
|
"expected": []
|
241
291
|
},
|
242
292
|
{
|
243
293
|
"description": "intersection of two sets with no shared elements is an empty set",
|
244
294
|
"property": "intersection",
|
245
|
-
"
|
246
|
-
|
295
|
+
"input": {
|
296
|
+
"set1": [1, 2, 3],
|
297
|
+
"set2": [4, 5, 6]
|
298
|
+
},
|
247
299
|
"expected": []
|
248
300
|
},
|
249
301
|
{
|
250
302
|
"description": "intersection of two sets with shared elements is a set of the shared elements",
|
251
303
|
"property": "intersection",
|
252
|
-
"
|
253
|
-
|
304
|
+
"input": {
|
305
|
+
"set1": [1, 2, 3, 4],
|
306
|
+
"set2": [3, 2, 5]
|
307
|
+
},
|
254
308
|
"expected": [2, 3]
|
255
309
|
}
|
256
310
|
]
|
@@ -261,29 +315,37 @@
|
|
261
315
|
{
|
262
316
|
"description": "difference of two empty sets is an empty set",
|
263
317
|
"property": "difference",
|
264
|
-
"
|
265
|
-
|
318
|
+
"input": {
|
319
|
+
"set1": [],
|
320
|
+
"set2": []
|
321
|
+
},
|
266
322
|
"expected": []
|
267
323
|
},
|
268
324
|
{
|
269
325
|
"description": "difference of empty set and non-empty set is an empty set",
|
270
326
|
"property": "difference",
|
271
|
-
"
|
272
|
-
|
327
|
+
"input": {
|
328
|
+
"set1": [],
|
329
|
+
"set2": [3, 2, 5]
|
330
|
+
},
|
273
331
|
"expected": []
|
274
332
|
},
|
275
333
|
{
|
276
334
|
"description": "difference of a non-empty set and an empty set is the non-empty set",
|
277
335
|
"property": "difference",
|
278
|
-
"
|
279
|
-
|
336
|
+
"input": {
|
337
|
+
"set1": [1, 2, 3, 4],
|
338
|
+
"set2": []
|
339
|
+
},
|
280
340
|
"expected": [1, 2, 3, 4]
|
281
341
|
},
|
282
342
|
{
|
283
343
|
"description": "difference of two non-empty sets is a set of elements that are only in the first set",
|
284
344
|
"property": "difference",
|
285
|
-
"
|
286
|
-
|
345
|
+
"input": {
|
346
|
+
"set1": [3, 2, 1],
|
347
|
+
"set2": [2, 4]
|
348
|
+
},
|
287
349
|
"expected": [1, 3]
|
288
350
|
}
|
289
351
|
]
|
@@ -294,29 +356,37 @@
|
|
294
356
|
{
|
295
357
|
"description": "union of empty sets is an empty set",
|
296
358
|
"property": "union",
|
297
|
-
"
|
298
|
-
|
359
|
+
"input": {
|
360
|
+
"set1": [],
|
361
|
+
"set2": []
|
362
|
+
},
|
299
363
|
"expected": []
|
300
364
|
},
|
301
365
|
{
|
302
366
|
"description": "union of an empty set and non-empty set is the non-empty set",
|
303
367
|
"property": "union",
|
304
|
-
"
|
305
|
-
|
368
|
+
"input": {
|
369
|
+
"set1": [],
|
370
|
+
"set2": [2]
|
371
|
+
},
|
306
372
|
"expected": [2]
|
307
373
|
},
|
308
374
|
{
|
309
375
|
"description": "union of a non-empty set and empty set is the non-empty set",
|
310
376
|
"property": "union",
|
311
|
-
"
|
312
|
-
|
377
|
+
"input": {
|
378
|
+
"set1": [1, 3],
|
379
|
+
"set2": []
|
380
|
+
},
|
313
381
|
"expected": [1, 3]
|
314
382
|
},
|
315
383
|
{
|
316
384
|
"description": "union of non-empty sets contains all unique elements",
|
317
385
|
"property": "union",
|
318
|
-
"
|
319
|
-
|
386
|
+
"input": {
|
387
|
+
"set1": [1, 3],
|
388
|
+
"set2": [2, 3]
|
389
|
+
},
|
320
390
|
"expected": [3, 2, 1]
|
321
391
|
}
|
322
392
|
]
|
data/tracks/go/README.md
CHANGED
@@ -221,7 +221,12 @@ directory within each exercise that makes use of a test cases generator. This
|
|
221
221
|
Whenever the shared JSON data changes, the test cases will need to be regenerated.
|
222
222
|
The generator will first look for a local copy of the **problem-specifications** repository.
|
223
223
|
If there isn't one it will attempt to get the relevant json data for the
|
224
|
-
exercise from the **problem-specifications** repository on GitHub.
|
224
|
+
exercise from the **problem-specifications** repository on GitHub. The generator
|
225
|
+
uses the GitHub API to find some information about exercises when it cannot
|
226
|
+
find a local copy of **problem-specifications**. This can cause throttling
|
227
|
+
issues if working with a large number of exercise. *We therefore recommend
|
228
|
+
using a local copy of the repository when possible* (remember to keep it
|
229
|
+
current :smile:).
|
225
230
|
|
226
231
|
To use a local copy of the **problem-specifications** repository, make sure that it has been
|
227
232
|
cloned into the same parent-directory as the **go** repository.
|
@@ -36,14 +36,11 @@ func TestAccumulate(t *testing.T) {
|
|
36
36
|
}
|
37
37
|
|
38
38
|
func BenchmarkAccumulate(b *testing.B) {
|
39
|
-
b.
|
40
|
-
for _, test := range tests {
|
41
|
-
b.StartTimer()
|
39
|
+
for i := 0; i < b.N; i++ {
|
42
40
|
|
43
|
-
for
|
41
|
+
for _, test := range tests {
|
44
42
|
Accumulate(test.given, test.converter)
|
45
43
|
}
|
46
44
|
|
47
|
-
b.StopTimer()
|
48
45
|
}
|
49
46
|
}
|
@@ -16,14 +16,11 @@ func TestAllergies(t *testing.T) {
|
|
16
16
|
}
|
17
17
|
|
18
18
|
func BenchmarkAllergies(b *testing.B) {
|
19
|
-
b.
|
20
|
-
for _, test := range allergicToTests {
|
21
|
-
b.StartTimer()
|
19
|
+
for i := 0; i < b.N; i++ {
|
22
20
|
|
23
|
-
for
|
21
|
+
for _, test := range allergicToTests {
|
24
22
|
Allergies(test.score)
|
25
23
|
}
|
26
|
-
b.StopTimer()
|
27
24
|
}
|
28
25
|
}
|
29
26
|
|
@@ -41,15 +38,12 @@ func TestAllergicTo(t *testing.T) {
|
|
41
38
|
}
|
42
39
|
|
43
40
|
func BenchmarkAllergicTo(b *testing.B) {
|
44
|
-
b.
|
45
|
-
|
46
|
-
for _, response := range test.expected {
|
47
|
-
b.StartTimer()
|
41
|
+
for i := 0; i < b.N; i++ {
|
42
|
+
for _, test := range allergicToTests {
|
48
43
|
|
49
|
-
for
|
44
|
+
for _, response := range test.expected {
|
50
45
|
AllergicTo(test.score, response.substance)
|
51
46
|
}
|
52
|
-
b.StopTimer()
|
53
47
|
}
|
54
48
|
}
|
55
49
|
}
|
@@ -35,16 +35,12 @@ func TestDetectAnagrams(t *testing.T) {
|
|
35
35
|
|
36
36
|
func BenchmarkDetectAnagrams(b *testing.B) {
|
37
37
|
|
38
|
-
b.
|
38
|
+
for i := 0; i < b.N; i++ {
|
39
39
|
|
40
|
-
|
41
|
-
b.StartTimer()
|
42
|
-
|
43
|
-
for i := 0; i < b.N; i++ {
|
40
|
+
for _, tt := range testCases {
|
44
41
|
Detect(tt.subject, tt.candidates)
|
45
42
|
}
|
46
43
|
|
47
|
-
b.StopTimer()
|
48
44
|
}
|
49
45
|
|
50
46
|
}
|
@@ -12,14 +12,11 @@ func TestAtbash(t *testing.T) {
|
|
12
12
|
}
|
13
13
|
|
14
14
|
func BenchmarkAtbash(b *testing.B) {
|
15
|
-
b.
|
16
|
-
for _, test := range tests {
|
17
|
-
b.StartTimer()
|
15
|
+
for i := 0; i < b.N; i++ {
|
18
16
|
|
19
|
-
for
|
17
|
+
for _, test := range tests {
|
20
18
|
Atbash(test.s)
|
21
19
|
}
|
22
20
|
|
23
|
-
b.StopTimer()
|
24
21
|
}
|
25
22
|
}
|
@@ -110,15 +110,12 @@ func TestSeveralVerses(t *testing.T) {
|
|
110
110
|
}
|
111
111
|
|
112
112
|
func BenchmarkSeveralVerses(b *testing.B) {
|
113
|
-
b.
|
114
|
-
for _, tt := range versesTestCases {
|
115
|
-
b.StartTimer()
|
113
|
+
for i := 0; i < b.N; i++ {
|
116
114
|
|
117
|
-
for
|
115
|
+
for _, tt := range versesTestCases {
|
118
116
|
Verses(tt.upperBound, tt.lowerBound)
|
119
117
|
}
|
120
118
|
|
121
|
-
b.StopTimer()
|
122
119
|
}
|
123
120
|
}
|
124
121
|
|
@@ -20,12 +20,9 @@ func TestBracket(t *testing.T) {
|
|
20
20
|
}
|
21
21
|
|
22
22
|
func BenchmarkBracket(b *testing.B) {
|
23
|
-
b.
|
24
|
-
|
25
|
-
b.StartTimer()
|
26
|
-
for i := 0; i < b.N; i++ {
|
23
|
+
for i := 0; i < b.N; i++ {
|
24
|
+
for _, tt := range testCases {
|
27
25
|
Bracket(tt.input)
|
28
26
|
}
|
29
|
-
b.StopTimer()
|
30
27
|
}
|
31
28
|
}
|
@@ -77,14 +77,11 @@ func TestTransform(t *testing.T) {
|
|
77
77
|
}
|
78
78
|
|
79
79
|
func BenchmarkTransform(b *testing.B) {
|
80
|
-
b.
|
81
|
-
for _, tt := range transformTests {
|
82
|
-
b.StartTimer()
|
80
|
+
for i := 0; i < b.N; i++ {
|
83
81
|
|
84
|
-
for
|
82
|
+
for _, tt := range transformTests {
|
85
83
|
Transform(map[int][]string(tt.input))
|
86
84
|
}
|
87
85
|
|
88
|
-
b.StopTimer()
|
89
86
|
}
|
90
87
|
}
|
@@ -34,16 +34,13 @@ func TestTotal(t *testing.T) {
|
|
34
34
|
}
|
35
35
|
|
36
36
|
func BenchmarkSquare(b *testing.B) {
|
37
|
-
b.StopTimer()
|
38
37
|
|
39
|
-
for
|
40
|
-
b.StartTimer()
|
38
|
+
for i := 0; i < b.N; i++ {
|
41
39
|
|
42
|
-
for
|
40
|
+
for _, test := range squareTests {
|
43
41
|
Square(test.input)
|
44
42
|
}
|
45
43
|
|
46
|
-
b.StopTimer()
|
47
44
|
}
|
48
45
|
}
|
49
46
|
|
@@ -13,14 +13,11 @@ func TestIsIsogram(t *testing.T) {
|
|
13
13
|
}
|
14
14
|
|
15
15
|
func BenchmarkIsIsogram(b *testing.B) {
|
16
|
-
b.
|
17
|
-
for _, c := range testCases {
|
18
|
-
b.StartTimer()
|
16
|
+
for i := 0; i < b.N; i++ {
|
19
17
|
|
20
|
-
for
|
18
|
+
for _, c := range testCases {
|
21
19
|
IsIsogram(c.input)
|
22
20
|
}
|
23
21
|
|
24
|
-
b.StopTimer()
|
25
22
|
}
|
26
23
|
}
|
@@ -37,15 +37,12 @@ func TestParseOctal(t *testing.T) {
|
|
37
37
|
}
|
38
38
|
|
39
39
|
func BenchmarkParseOctal(b *testing.B) {
|
40
|
-
b.StopTimer()
|
41
40
|
|
42
|
-
for
|
43
|
-
b.StartTimer()
|
41
|
+
for i := 0; i < b.N; i++ {
|
44
42
|
|
45
|
-
for
|
43
|
+
for _, test := range testCases {
|
46
44
|
ParseOctal(test.input)
|
47
45
|
}
|
48
46
|
|
49
|
-
b.StopTimer()
|
50
47
|
}
|
51
48
|
}
|
@@ -31,8 +31,10 @@ type js struct {
|
|
31
31
|
type oneCase struct {
|
32
32
|
Description string
|
33
33
|
Property string
|
34
|
-
Input
|
35
|
-
|
34
|
+
Input struct {
|
35
|
+
Sentence string
|
36
|
+
}
|
37
|
+
Expected bool
|
36
38
|
}
|
37
39
|
|
38
40
|
// Template to generate test cases.
|
@@ -47,7 +49,7 @@ var testCases = []struct {
|
|
47
49
|
}{ {{range .J.Cases}}{{range .Cases}}
|
48
50
|
{
|
49
51
|
description: {{printf "%q" .Description}},
|
50
|
-
input: {{printf "%q" .Input}},
|
52
|
+
input: {{printf "%q" .Input.Sentence}},
|
51
53
|
expected: {{printf "%t" .Expected}},
|
52
54
|
},{{end}}{{end}}
|
53
55
|
}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
package pangram
|
2
2
|
|
3
3
|
// Source: exercism/problem-specifications
|
4
|
-
// Commit:
|
5
|
-
// Problem Specifications Version: 1.
|
4
|
+
// Commit: c319f15 pangram: Apply new "input" policy
|
5
|
+
// Problem Specifications Version: 1.4.0
|
6
6
|
|
7
7
|
var testCases = []struct {
|
8
8
|
description string
|
@@ -32,8 +32,10 @@ type js struct {
|
|
32
32
|
type oneCase struct {
|
33
33
|
Description string
|
34
34
|
Property string
|
35
|
-
Input
|
36
|
-
|
35
|
+
Input struct {
|
36
|
+
Number int64
|
37
|
+
}
|
38
|
+
Expected interface{}
|
37
39
|
}
|
38
40
|
|
39
41
|
func (c oneCase) Valid() bool {
|
@@ -78,7 +80,7 @@ var classificationTestCases = []struct {
|
|
78
80
|
}{ {{range .J.Cases}} {{range .Cases}}
|
79
81
|
{
|
80
82
|
description: "{{.Description}}",
|
81
|
-
input: {{.Input}},
|
83
|
+
input: {{.Input.Number}},
|
82
84
|
{{if .Valid}} ok: true,
|
83
85
|
expected: {{.ExpectedClassification}},
|
84
86
|
{{- else}} ok: false,
|
@@ -1,8 +1,8 @@
|
|
1
1
|
package perfect
|
2
2
|
|
3
3
|
// Source: exercism/problem-specifications
|
4
|
-
// Commit:
|
5
|
-
// Problem Specifications Version: 1.0
|
4
|
+
// Commit: d7c0227 perfect-numbers: Apply new "input" policy
|
5
|
+
// Problem Specifications Version: 1.1.0
|
6
6
|
|
7
7
|
var classificationTestCases = []struct {
|
8
8
|
description string
|
@@ -47,8 +47,10 @@ type js struct {
|
|
47
47
|
Description string
|
48
48
|
Cases []struct {
|
49
49
|
Description string
|
50
|
-
|
51
|
-
|
50
|
+
Input struct {
|
51
|
+
Phrase string
|
52
|
+
}
|
53
|
+
Expected string
|
52
54
|
}
|
53
55
|
}
|
54
56
|
}
|
@@ -69,7 +71,7 @@ var numberTests = []struct {
|
|
69
71
|
}{
|
70
72
|
{{range .Cases}}{
|
71
73
|
description: {{printf "%q" .Description}},
|
72
|
-
input: {{printf "%q" .Phrase}},
|
74
|
+
input: {{printf "%q" .Input.Phrase}},
|
73
75
|
{{if expectErr .Expected}} expectErr: {{expectErr .Expected | printf "%v" }},
|
74
76
|
{{else}} number: {{printf "%q" .Expected}},
|
75
77
|
areaCode: {{areacode .Expected | printf "%q" }},
|
@@ -1,8 +1,8 @@
|
|
1
1
|
package phonenumber
|
2
2
|
|
3
3
|
// Source: exercism/problem-specifications
|
4
|
-
// Commit:
|
5
|
-
// Problem Specifications Version: 1.
|
4
|
+
// Commit: 0783171 phone-number: Apply new "input" policy
|
5
|
+
// Problem Specifications Version: 1.4.0
|
6
6
|
|
7
7
|
// Cleanup user-entered phone numbers
|
8
8
|
var numberTests = []struct {
|
@@ -24,13 +24,10 @@ func TestNumber(t *testing.T) {
|
|
24
24
|
}
|
25
25
|
|
26
26
|
func BenchmarkNumber(b *testing.B) {
|
27
|
-
b.
|
28
|
-
|
29
|
-
b.StartTimer()
|
30
|
-
for i := 0; i < b.N; i++ {
|
27
|
+
for i := 0; i < b.N; i++ {
|
28
|
+
for _, test := range numberTests {
|
31
29
|
Number(test.input)
|
32
30
|
}
|
33
|
-
b.StopTimer()
|
34
31
|
}
|
35
32
|
}
|
36
33
|
|
@@ -54,13 +51,10 @@ func TestAreaCode(t *testing.T) {
|
|
54
51
|
}
|
55
52
|
|
56
53
|
func BenchmarkAreaCode(b *testing.B) {
|
57
|
-
b.
|
58
|
-
|
59
|
-
b.StartTimer()
|
60
|
-
for i := 0; i < b.N; i++ {
|
54
|
+
for i := 0; i < b.N; i++ {
|
55
|
+
for _, test := range numberTests {
|
61
56
|
AreaCode(test.input)
|
62
57
|
}
|
63
|
-
b.StopTimer()
|
64
58
|
}
|
65
59
|
}
|
66
60
|
|
@@ -84,12 +78,9 @@ func TestFormat(t *testing.T) {
|
|
84
78
|
}
|
85
79
|
|
86
80
|
func BenchmarkFormat(b *testing.B) {
|
87
|
-
b.
|
88
|
-
|
89
|
-
b.StartTimer()
|
90
|
-
for i := 0; i < b.N; i++ {
|
81
|
+
for i := 0; i < b.N; i++ {
|
82
|
+
for _, test := range numberTests {
|
91
83
|
Format(test.input)
|
92
84
|
}
|
93
|
-
b.StopTimer()
|
94
85
|
}
|
95
86
|
}
|
@@ -35,8 +35,10 @@ type oneLevel struct {
|
|
35
35
|
type oneCase struct {
|
36
36
|
Description string
|
37
37
|
Property string
|
38
|
-
Input
|
39
|
-
|
38
|
+
Input struct {
|
39
|
+
Phrase string
|
40
|
+
}
|
41
|
+
Expected string
|
40
42
|
}
|
41
43
|
|
42
44
|
// Template to generate test cases.
|
@@ -51,7 +53,7 @@ var testCases = []struct {
|
|
51
53
|
}{ {{range .J.Cases}} {{range .Cases}}
|
52
54
|
{
|
53
55
|
description: {{printf "%q" .Description}},
|
54
|
-
input: {{printf "%#v" .Input}},
|
56
|
+
input: {{printf "%#v" .Input.Phrase}},
|
55
57
|
expected: {{printf "%#v" .Expected}},
|
56
58
|
},{{end}}{{end}}
|
57
59
|
}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
package piglatin
|
2
2
|
|
3
3
|
// Source: exercism/problem-specifications
|
4
|
-
// Commit:
|
5
|
-
// Problem Specifications Version: 1.
|
4
|
+
// Commit: d77de78 pig-latin: Apply new "input" policy
|
5
|
+
// Problem Specifications Version: 1.2.0
|
6
6
|
|
7
7
|
var testCases = []struct {
|
8
8
|
description string
|
@@ -1,5 +1,36 @@
|
|
1
|
-
|
1
|
+
1. Install the OCaml compiler (`ocaml`) and package manager (`opam`).
|
2
|
+
|
3
|
+
The excellent [Real World OCaml](https://realworldocaml.org/) book has
|
4
|
+
[installation
|
5
|
+
instructions](https://github.com/realworldocaml/book/wiki/Installation-Instructions)
|
6
|
+
for a variety of operating systems.
|
7
|
+
|
8
|
+
2. If you followed the instructions from Real World OCaml, it is likely that
|
9
|
+
your system's OCaml compiler is not the latest version.
|
10
|
+
|
11
|
+
To see a list of available versions and the one you have currently installed,
|
12
|
+
run:
|
13
|
+
|
14
|
+
```bash
|
15
|
+
opam switch
|
16
|
+
```
|
17
|
+
|
18
|
+
Note which version is the latest and install it by running:
|
19
|
+
|
20
|
+
```bash
|
21
|
+
opam switch <version-number>
|
22
|
+
```
|
23
|
+
|
24
|
+
For example, if the latest version is 4.06.0, you will run:
|
25
|
+
|
26
|
+
```bash
|
27
|
+
opam switch 4.06.0
|
28
|
+
```
|
29
|
+
|
30
|
+
3. Install the Core and [OUnit](http://ounit.forge.ocamlcore.org/) packages,
|
31
|
+
which are necessary in order to run the exercise tests:
|
32
|
+
|
33
|
+
```bash
|
34
|
+
opam install core ounit
|
35
|
+
```
|
2
36
|
|
3
|
-
```bash
|
4
|
-
opam install ounit
|
5
|
-
```
|
File without changes
|
File without changes
|
@@ -1,9 +1,8 @@
|
|
1
1
|
open Core
|
2
2
|
|
3
3
|
let square_root_trunc n =
|
4
|
-
(* Square root is not defined on int64
|
5
|
-
|
6
|
-
big_int_of_int64 n |> sqrt_big_int |> int64_of_big_int
|
4
|
+
(* Square root is not defined on int64 *)
|
5
|
+
Int64.to_float n |> sqrt |> Int64.of_float
|
7
6
|
|
8
7
|
let rec factors_of' = function
|
9
8
|
| 1L -> []
|
data/tracks/perl6/.travis.yml
CHANGED
@@ -1,25 +1,33 @@
|
|
1
1
|
#!/usr/bin/env perl6
|
2
2
|
use v6;
|
3
|
-
use Template::Mustache;
|
4
3
|
use YAML::Parser::LibYAML;
|
4
|
+
use lib (my $base-dir = $?FILE.IO.resolve.parent.parent).add('lib');
|
5
|
+
use Exercism::Generator;
|
5
6
|
|
6
|
-
my
|
7
|
-
my @exercises;
|
7
|
+
my %*SUB-MAIN-OPTS = :named-anywhere;
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
proto sub MAIN (|) {
|
10
|
+
if $base-dir.add('problem-specifications') !~~ :d {
|
11
|
+
note 'problem-specifications directory not found; some exercises may generate incorrectly.';
|
12
|
+
}
|
13
|
+
if $base-dir.add('bin/configlet') !~~ :f {
|
14
|
+
note 'configlet not found; README.md file(s) will not be generated.';
|
15
|
+
}
|
16
|
+
{*}
|
11
17
|
}
|
12
18
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
}
|
19
|
+
multi sub MAIN (Bool:D :$all where *.so) {
|
20
|
+
generate .basename for $base-dir.add('exercises').dir;
|
21
|
+
}
|
22
|
+
|
23
|
+
multi sub MAIN (*@exercises) {
|
24
|
+
@exercises».&generate;
|
25
|
+
}
|
26
|
+
|
27
|
+
multi sub MAIN {
|
20
28
|
say 'No args given; working in current directory.';
|
21
29
|
if 'example.yaml'.IO ~~ :f {
|
22
|
-
|
30
|
+
generate $*CWD.IO.basename;
|
23
31
|
} else {
|
24
32
|
say 'example.yaml not found in current directory; exiting.';
|
25
33
|
exit;
|
@@ -28,37 +36,34 @@ if @*ARGS {
|
|
28
36
|
|
29
37
|
my @dir-not-found;
|
30
38
|
my @yaml-not-found;
|
31
|
-
|
32
|
-
|
39
|
+
|
40
|
+
sub generate ($exercise) {
|
41
|
+
if (my $exercise-dir = $base-dir.add("exercises/$exercise")) !~~ :d {
|
33
42
|
push @dir-not-found, $exercise;
|
34
43
|
next;
|
35
44
|
}
|
36
|
-
if (my $yaml-file = $exercise-dir.
|
45
|
+
if (my $yaml-file = $exercise-dir.add('example.yaml')) !~~ :f {
|
37
46
|
push @yaml-not-found, $exercise;
|
38
47
|
next;
|
39
48
|
};
|
40
49
|
print "Generating $exercise... ";
|
41
50
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
create-file |<Example.pm6 module>;
|
51
|
+
given Exercism::Generator.new: :$exercise, data => yaml-parse $yaml-file.absolute {
|
52
|
+
given $exercise-dir.add("$exercise.t") -> $testfile {
|
53
|
+
$testfile.spurt: .test;
|
54
|
+
$testfile.chmod: 0o755;
|
55
|
+
}
|
56
|
+
$exercise-dir.add('Example.pm6').spurt: .example;
|
57
|
+
$exercise-dir.add("{.data<exercise>}.pm6").spurt: .stub;
|
58
|
+
}
|
51
59
|
|
52
|
-
|
53
|
-
|
60
|
+
given $base-dir.add('bin/configlet') {
|
61
|
+
if $_ ~~ :f {
|
62
|
+
run .absolute, 'generate', $base-dir, '--only', $exercise;
|
63
|
+
}
|
64
|
+
}
|
54
65
|
|
55
66
|
say 'Generated.';
|
56
|
-
|
57
|
-
sub create-file ($filename, $template) {
|
58
|
-
spurt (my $file = $exercise-dir.child($filename)),
|
59
|
-
Template::Mustache.render($base-dir.child("templates/$template.mustache").slurp, %data);
|
60
|
-
$file.chmod(0o755) if $template ~~ 'test';
|
61
|
-
}
|
62
67
|
}
|
63
68
|
|
64
69
|
if @dir-not-found {warn 'exercise directory does not exist for: ' ~ join ' ', @dir-not-found}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
unit class Exercism::Generator;
|
2
|
+
use Template::Mustache;
|
3
|
+
|
4
|
+
my $base-dir = $?FILE.IO.parent.add("../..");
|
5
|
+
|
6
|
+
has %.data;
|
7
|
+
has Str $.exercise;
|
8
|
+
|
9
|
+
submethod TWEAK {
|
10
|
+
if $!exercise && (my $cdata =
|
11
|
+
$base-dir.add: "problem-specifications/exercises/$!exercise/canonical-data.json") ~~ :f
|
12
|
+
{
|
13
|
+
%!data<cdata><json> = $cdata.slurp;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
method cdata {
|
18
|
+
%!data<cdata><json> ?? %!data<cdata><json> !! '';
|
19
|
+
}
|
20
|
+
|
21
|
+
method test {
|
22
|
+
self!render(template => 'test');
|
23
|
+
}
|
24
|
+
|
25
|
+
method stub {
|
26
|
+
self!render(template => 'module', file => 'stub');
|
27
|
+
}
|
28
|
+
|
29
|
+
method example {
|
30
|
+
self!render(template => 'module', file => 'example');
|
31
|
+
}
|
32
|
+
|
33
|
+
method !render (:$template!, :$file) {
|
34
|
+
my $data = %!data;
|
35
|
+
if $file { $data<module_file> = $data{$file} };
|
36
|
+
Template::Mustache.render($base-dir.add("templates/$template.mustache").slurp, $data);
|
37
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env perl6
|
2
|
+
use v6;
|
3
|
+
use Test;
|
4
|
+
use YAML::Parser::LibYAML;
|
5
|
+
use lib (my $base-dir = $?FILE.IO.resolve.parent.parent).add('lib');
|
6
|
+
use Exercism::Generator;
|
7
|
+
|
8
|
+
bail-out if $base-dir.add('problem-specifications') !~~ :d;
|
9
|
+
for $base-dir.add('exercises').dir {
|
10
|
+
if .add('example.yaml') ~~ :f {
|
11
|
+
todo '';
|
12
|
+
is .add("{.basename}.t").slurp,
|
13
|
+
Exercism::Generator.new(data => yaml-parse(~.add: 'example.yaml'), exercise => .basename).test,
|
14
|
+
"{.basename}: test suite matches generated";
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
done-testing;
|
@@ -25,9 +25,6 @@ Keep your hands off that collect/map/fmap/whatchamacallit functionality
|
|
25
25
|
provided by your standard library!
|
26
26
|
Solve this one yourself using other basic tools instead.
|
27
27
|
|
28
|
-
Lisp specific: it's perfectly fine to use `MAPCAR` or the equivalent,
|
29
|
-
as this is idiomatic Lisp, not a library function.
|
30
|
-
|
31
28
|
## Advanced
|
32
29
|
|
33
30
|
It is typical to call [#to_enum](http://ruby-doc.org/core-2.3.1/Object.html#method-i-to_enum) when defining methods for a generic Enumerable, in case no block is passed.
|
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.2.1.
|
4
|
+
version: 2.2.1.98
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katrina Owen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -9647,7 +9647,7 @@ files:
|
|
9647
9647
|
- tracks/ocaml/exercises/anagram/example.ml
|
9648
9648
|
- tracks/ocaml/exercises/anagram/test.ml
|
9649
9649
|
- tracks/ocaml/exercises/atbash-cipher/.merlin
|
9650
|
-
- tracks/ocaml/exercises/atbash-cipher/
|
9650
|
+
- tracks/ocaml/exercises/atbash-cipher/.meta/hints.md
|
9651
9651
|
- tracks/ocaml/exercises/atbash-cipher/Makefile
|
9652
9652
|
- tracks/ocaml/exercises/atbash-cipher/README.md
|
9653
9653
|
- tracks/ocaml/exercises/atbash-cipher/atbash_cipher.mli
|
@@ -9666,7 +9666,7 @@ files:
|
|
9666
9666
|
- tracks/ocaml/exercises/binary-search/example.ml
|
9667
9667
|
- tracks/ocaml/exercises/binary-search/test.ml
|
9668
9668
|
- tracks/ocaml/exercises/bob/.merlin
|
9669
|
-
- tracks/ocaml/exercises/bob/
|
9669
|
+
- tracks/ocaml/exercises/bob/.meta/hints.md
|
9670
9670
|
- tracks/ocaml/exercises/bob/Makefile
|
9671
9671
|
- tracks/ocaml/exercises/bob/README.md
|
9672
9672
|
- tracks/ocaml/exercises/bob/bob.mli
|
@@ -10379,6 +10379,8 @@ files:
|
|
10379
10379
|
- tracks/perl6/exercises/wordy/example.yaml
|
10380
10380
|
- tracks/perl6/exercises/wordy/wordy.t
|
10381
10381
|
- tracks/perl6/img/icon.png
|
10382
|
+
- tracks/perl6/lib/Exercism/Generator.pm6
|
10383
|
+
- tracks/perl6/t/generated-tests.t
|
10382
10384
|
- tracks/perl6/templates/module.mustache
|
10383
10385
|
- tracks/perl6/templates/test.mustache
|
10384
10386
|
- tracks/php/.editorconfig
|