trackler 2.2.1.97 → 2.2.1.98
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 +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
|