trackler 2.0.5.5 → 2.0.5.6
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/tracks/csharp/config.json +15 -0
- data/tracks/csharp/exercises/list-ops/Example.cs +77 -0
- data/tracks/csharp/exercises/list-ops/HINTS.md +2 -0
- data/tracks/csharp/exercises/list-ops/ListOpsTest.cs +195 -0
- data/tracks/csharp/exercises/two-bucket/Example.cs +109 -0
- data/tracks/csharp/exercises/two-bucket/TwoBucketTest.cs +71 -0
- data/tracks/ecmascript/config.json +13 -30
- data/tracks/ecmascript/exercises/all-your-base/all-your-base.spec.js +139 -0
- data/tracks/ecmascript/exercises/all-your-base/example.js +55 -0
- data/tracks/ecmascript/exercises/all-your-base/gulpfile.js +89 -0
- data/tracks/ecmascript/exercises/all-your-base/package.json +28 -0
- data/tracks/fsharp/exercises/diffie-hellman/HINTS.md +3 -0
- data/tracks/fsharp/exercises/gigasecond/HINTS.md +2 -0
- data/tracks/fsharp/exercises/palindrome-products/HINTS.md +2 -0
- data/tracks/java/config.json +6 -0
- data/tracks/java/docs/INSTALLATION.md +1 -0
- data/tracks/java/exercises/custom-set/build.gradle +18 -0
- data/tracks/java/exercises/custom-set/src/example/java/CustomSet.java +74 -0
- data/tracks/java/exercises/custom-set/src/main/java/.keep +0 -0
- data/tracks/java/exercises/custom-set/src/test/java/CustomSetTest.java +505 -0
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/purescript/config.json +25 -0
- data/tracks/purescript/exercises/accumulate/bower.json +16 -0
- data/tracks/purescript/exercises/accumulate/examples/src/Accumulate.purs +15 -0
- data/tracks/purescript/exercises/accumulate/src/Accumulate.purs +3 -0
- data/tracks/purescript/exercises/accumulate/test/Main.purs +41 -0
- data/tracks/purescript/exercises/acronym/bower.json +1 -1
- data/tracks/purescript/exercises/bob/bower.json +1 -1
- data/tracks/purescript/exercises/pangram/bower.json +1 -1
- data/tracks/purescript/exercises/raindrops/bower.json +1 -1
- data/tracks/purescript/exercises/scrabble-score/bower.json +16 -0
- data/tracks/purescript/exercises/scrabble-score/examples/src/ScrabbleScore.purs +47 -0
- data/tracks/purescript/exercises/scrabble-score/src/ScrabbleScore.purs +3 -0
- data/tracks/purescript/exercises/scrabble-score/test/Main.purs +45 -0
- data/tracks/purescript/exercises/triangle/bower.json +19 -0
- data/tracks/purescript/exercises/triangle/examples/src/Triangle.purs +40 -0
- data/tracks/purescript/exercises/triangle/src/Triangle.purs +4 -0
- data/tracks/purescript/exercises/triangle/test/Main.purs +66 -0
- data/tracks/ruby/.rubocop.yml +3 -0
- data/tracks/ruby/README.md +1 -1
- metadata +30 -2
@@ -28,7 +28,6 @@
|
|
28
28
|
"scrabble-score",
|
29
29
|
"roman-numerals",
|
30
30
|
"circular-buffer",
|
31
|
-
"binary",
|
32
31
|
"prime-factors",
|
33
32
|
"raindrops",
|
34
33
|
"allergies",
|
@@ -36,10 +35,8 @@
|
|
36
35
|
"atbash-cipher",
|
37
36
|
"accumulate",
|
38
37
|
"crypto-square",
|
39
|
-
"trinary",
|
40
38
|
"sieve",
|
41
39
|
"simple-cipher",
|
42
|
-
"octal",
|
43
40
|
"luhn",
|
44
41
|
"pig-latin",
|
45
42
|
"pythagorean-triplet",
|
@@ -48,7 +45,6 @@
|
|
48
45
|
"secret-handshake",
|
49
46
|
"linked-list",
|
50
47
|
"wordy",
|
51
|
-
"hexadecimal",
|
52
48
|
"largest-series-product",
|
53
49
|
"kindergarten-garden",
|
54
50
|
"binary-search",
|
@@ -68,7 +64,8 @@
|
|
68
64
|
"bracket-push",
|
69
65
|
"two-bucket",
|
70
66
|
"diamond",
|
71
|
-
"isogram"
|
67
|
+
"isogram",
|
68
|
+
"all-your-base"
|
72
69
|
],
|
73
70
|
"exercises": [
|
74
71
|
{
|
@@ -209,12 +206,6 @@
|
|
209
206
|
"topics": [
|
210
207
|
]
|
211
208
|
},
|
212
|
-
{
|
213
|
-
"slug": "binary",
|
214
|
-
"difficulty": 1,
|
215
|
-
"topics": [
|
216
|
-
]
|
217
|
-
},
|
218
209
|
{
|
219
210
|
"slug": "prime-factors",
|
220
211
|
"difficulty": 1,
|
@@ -257,12 +248,6 @@
|
|
257
248
|
"topics": [
|
258
249
|
]
|
259
250
|
},
|
260
|
-
{
|
261
|
-
"slug": "trinary",
|
262
|
-
"difficulty": 1,
|
263
|
-
"topics": [
|
264
|
-
]
|
265
|
-
},
|
266
251
|
{
|
267
252
|
"slug": "sieve",
|
268
253
|
"difficulty": 1,
|
@@ -275,12 +260,6 @@
|
|
275
260
|
"topics": [
|
276
261
|
]
|
277
262
|
},
|
278
|
-
{
|
279
|
-
"slug": "octal",
|
280
|
-
"difficulty": 1,
|
281
|
-
"topics": [
|
282
|
-
]
|
283
|
-
},
|
284
263
|
{
|
285
264
|
"slug": "luhn",
|
286
265
|
"difficulty": 1,
|
@@ -329,12 +308,6 @@
|
|
329
308
|
"topics": [
|
330
309
|
]
|
331
310
|
},
|
332
|
-
{
|
333
|
-
"slug": "hexadecimal",
|
334
|
-
"difficulty": 1,
|
335
|
-
"topics": [
|
336
|
-
]
|
337
|
-
},
|
338
311
|
{
|
339
312
|
"slug": "largest-series-product",
|
340
313
|
"difficulty": 1,
|
@@ -454,11 +427,21 @@
|
|
454
427
|
"difficulty": 1,
|
455
428
|
"topics": [
|
456
429
|
]
|
430
|
+
},
|
431
|
+
{
|
432
|
+
"slug": "all-your-base",
|
433
|
+
"difficulty": 1,
|
434
|
+
"topics": [
|
435
|
+
]
|
457
436
|
}
|
458
437
|
],
|
459
438
|
"deprecated": [
|
460
439
|
"nucleotide-count",
|
461
|
-
"point-mutations"
|
440
|
+
"point-mutations",
|
441
|
+
"binary",
|
442
|
+
"trinary",
|
443
|
+
"hexadecimal",
|
444
|
+
"octal"
|
462
445
|
],
|
463
446
|
"ignored": [
|
464
447
|
"node_modules",
|
@@ -0,0 +1,139 @@
|
|
1
|
+
import Converter from './all-your-base';
|
2
|
+
|
3
|
+
const converter = new Converter();
|
4
|
+
|
5
|
+
describe('Converter', () => {
|
6
|
+
|
7
|
+
it('single bit one to decimal', () => {
|
8
|
+
expect(converter.convert([1], 2, 10)).toEqual([1]);
|
9
|
+
});
|
10
|
+
|
11
|
+
xit('binary to single decimal', () => {
|
12
|
+
expect(converter.convert([1, 0, 1], 2, 10)).toEqual([5]);
|
13
|
+
});
|
14
|
+
|
15
|
+
xit('single decimal to binary', () => {
|
16
|
+
expect(converter.convert([5], 10, 2)).toEqual([1, 0, 1]);
|
17
|
+
});
|
18
|
+
|
19
|
+
xit('binary to multiple decimal', () => {
|
20
|
+
expect(converter.convert([1, 0, 1, 0, 1, 0], 2, 10)).toEqual([4, 2]);
|
21
|
+
});
|
22
|
+
|
23
|
+
xit('decimal to binary', () => {
|
24
|
+
expect(converter.convert([4, 2], 10, 2)).toEqual([1, 0, 1, 0, 1, 0]);
|
25
|
+
});
|
26
|
+
|
27
|
+
xit('trinary to hexadecimal', () => {
|
28
|
+
expect(converter.convert([1, 1, 2, 0], 3, 16)).toEqual([2, 10]);
|
29
|
+
});
|
30
|
+
|
31
|
+
xit('hexadecimal to trinary', () => {
|
32
|
+
expect(converter.convert([2, 10], 16, 3)).toEqual([1, 1, 2, 0]);
|
33
|
+
});
|
34
|
+
|
35
|
+
xit('15-bit integer', () => {
|
36
|
+
expect(converter.convert([3, 46, 60], 97, 73)).toEqual([6, 10, 45]);
|
37
|
+
});
|
38
|
+
|
39
|
+
xit('empty list', () => {
|
40
|
+
expect(() => {
|
41
|
+
converter.convert([], 2, 10);
|
42
|
+
}).toThrow(new Error('Input has wrong format'));
|
43
|
+
});
|
44
|
+
|
45
|
+
xit('single zero', () => {
|
46
|
+
expect(converter.convert([0], 10, 2)).toEqual([0]);
|
47
|
+
});
|
48
|
+
|
49
|
+
xit('multiple zeros', () => {
|
50
|
+
expect(() => {
|
51
|
+
converter.convert([0, 0, 0], 10, 2);
|
52
|
+
}).toThrow(new Error('Input has wrong format'));
|
53
|
+
});
|
54
|
+
|
55
|
+
xit('leading zeros', () => {
|
56
|
+
expect(() => {
|
57
|
+
converter.convert([0, 6, 0], 7, 10);
|
58
|
+
}).toThrow(new Error('Input has wrong format'));
|
59
|
+
});
|
60
|
+
|
61
|
+
xit('negative digit', () => {
|
62
|
+
expect(() => {
|
63
|
+
converter.convert([1, -1, 1, 0, 1, 0], 2, 10);
|
64
|
+
}).toThrow(new Error('Input has wrong format'));
|
65
|
+
});
|
66
|
+
|
67
|
+
xit('invalid positive digit', () => {
|
68
|
+
expect(() => {
|
69
|
+
converter.convert([1, 2, 1, 0, 1, 0], 2, 10);
|
70
|
+
}).toThrow(new Error('Input has wrong format'));
|
71
|
+
});
|
72
|
+
|
73
|
+
xit('first base is one', () => {
|
74
|
+
expect(() => {
|
75
|
+
converter.convert([], 1, 10);
|
76
|
+
}).toThrow(new Error('Wrong input base'));
|
77
|
+
});
|
78
|
+
|
79
|
+
xit('second base is one', () => {
|
80
|
+
expect(() => {
|
81
|
+
converter.convert([1, 0, 1, 0, 1, 0], 2, 1);
|
82
|
+
}).toThrow(new Error('Wrong output base'));
|
83
|
+
});
|
84
|
+
|
85
|
+
xit('first base is zero', () => {
|
86
|
+
expect(() => {
|
87
|
+
converter.convert([], 0, 10);
|
88
|
+
}).toThrow(new Error('Wrong input base'));
|
89
|
+
});
|
90
|
+
|
91
|
+
xit('second base is zero', () => {
|
92
|
+
expect(() => {
|
93
|
+
converter.convert([7], 10, 0);
|
94
|
+
}).toThrow(new Error('Wrong output base'));
|
95
|
+
});
|
96
|
+
|
97
|
+
xit('first base is negative', () => {
|
98
|
+
expect(() => {
|
99
|
+
converter.convert([1], -2, 10);
|
100
|
+
}).toThrow(new Error('Wrong input base'));
|
101
|
+
});
|
102
|
+
|
103
|
+
xit('second base is negative', () => {
|
104
|
+
expect(() => {
|
105
|
+
converter.convert([1], 2, -7);
|
106
|
+
}).toThrow(new Error('Wrong output base'));
|
107
|
+
});
|
108
|
+
|
109
|
+
xit('both bases are negative', () => {
|
110
|
+
expect(() => {
|
111
|
+
converter.convert([1], -2, -7);
|
112
|
+
}).toThrow(new Error('Wrong input base'));
|
113
|
+
});
|
114
|
+
|
115
|
+
xit('missing input base throws an error', () => {
|
116
|
+
expect(() => {
|
117
|
+
converter.convert([0]);
|
118
|
+
}).toThrow(new Error('Wrong input base'));
|
119
|
+
});
|
120
|
+
|
121
|
+
xit('wrong input_base base not integer', () => {
|
122
|
+
expect(() => {
|
123
|
+
converter.convert([0], 2.5);
|
124
|
+
}).toThrow(new Error('Wrong input base'));
|
125
|
+
});
|
126
|
+
|
127
|
+
xit('missing output base throws an error', () => {
|
128
|
+
expect(() => {
|
129
|
+
converter.convert([0], 2);
|
130
|
+
}).toThrow(new Error('Wrong output base'));
|
131
|
+
});
|
132
|
+
|
133
|
+
xit('wrong output_base base not integer', () => {
|
134
|
+
expect(() => {
|
135
|
+
converter.convert([0], 3, 2.5);
|
136
|
+
}).toThrow(new Error('Wrong output base'));
|
137
|
+
});
|
138
|
+
|
139
|
+
});
|
@@ -0,0 +1,55 @@
|
|
1
|
+
const isValidBase = function (base) {
|
2
|
+
return !base || base < 2 || Math.floor(base) !== base;
|
3
|
+
};
|
4
|
+
|
5
|
+
const isInputValid = function (array, base) {
|
6
|
+
if (!array || !array.length) {
|
7
|
+
return false;
|
8
|
+
}
|
9
|
+
const val = base - 1;
|
10
|
+
for (let i = 0, n = array.length; i < n; i++) {
|
11
|
+
const tmp = array[i];
|
12
|
+
if (tmp > val || tmp < 0) {
|
13
|
+
return false;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
return true;
|
17
|
+
};
|
18
|
+
|
19
|
+
const convertFromDecimalToBase = function (num, outputBase) {
|
20
|
+
let tmp = num;
|
21
|
+
const result = [];
|
22
|
+
while (tmp) {
|
23
|
+
result.unshift(tmp % outputBase);
|
24
|
+
tmp = Math.floor(tmp / outputBase);
|
25
|
+
}
|
26
|
+
return result;
|
27
|
+
};
|
28
|
+
|
29
|
+
export default class Converter {
|
30
|
+
convert(array, inputBase, outputBase) {
|
31
|
+
if (isValidBase(inputBase)) {
|
32
|
+
throw new Error('Wrong input base');
|
33
|
+
}
|
34
|
+
if (isValidBase(outputBase)) {
|
35
|
+
throw new Error('Wrong output base');
|
36
|
+
}
|
37
|
+
const regexp = new RegExp('^0.', 'g');
|
38
|
+
const str = array.join('');
|
39
|
+
if (str.match(regexp)
|
40
|
+
|| !isInputValid(array, inputBase)) {
|
41
|
+
throw new Error('Input has wrong format');
|
42
|
+
}
|
43
|
+
if (str === '0') {
|
44
|
+
return [0];
|
45
|
+
}
|
46
|
+
if (str === '1') {
|
47
|
+
return [1];
|
48
|
+
}
|
49
|
+
const decimalValue = array
|
50
|
+
.reduce((accumulator, value) => {
|
51
|
+
return accumulator * inputBase + value;
|
52
|
+
}, 0);
|
53
|
+
return convertFromDecimalToBase(decimalValue, outputBase);
|
54
|
+
}
|
55
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
function getInputDirectory(argv) {
|
2
|
+
if (argv.input) {
|
3
|
+
return argv.input;
|
4
|
+
}
|
5
|
+
return '.';
|
6
|
+
}
|
7
|
+
|
8
|
+
function getOutputDirectory(argv) {
|
9
|
+
if (argv.output) {
|
10
|
+
return argv.output;
|
11
|
+
}
|
12
|
+
return 'babel-output';
|
13
|
+
}
|
14
|
+
|
15
|
+
const gulp = require('gulp'),
|
16
|
+
eslint = require('gulp-eslint'),
|
17
|
+
jasmine = require('gulp-jasmine'),
|
18
|
+
babel = require('gulp-babel'),
|
19
|
+
polyfill = require('babel/polyfill'),
|
20
|
+
del = require('del'),
|
21
|
+
argv = require('yargs').argv,
|
22
|
+
inputDir = getInputDirectory(argv),
|
23
|
+
outputDir = getOutputDirectory(argv);
|
24
|
+
|
25
|
+
// Gulp tasks definition
|
26
|
+
|
27
|
+
gulp.task('default', [ 'test' ]);
|
28
|
+
|
29
|
+
gulp.task('test', [ 'babel' ], function () {
|
30
|
+
return gulp.src([ outputDir + '/*.spec.js' ])
|
31
|
+
.pipe(jasmine());
|
32
|
+
});
|
33
|
+
|
34
|
+
gulp.task('babel', function () {
|
35
|
+
return gulp.src([ inputDir + '/*.js', inputDir + '/lib/*.js' ])
|
36
|
+
.pipe(babel())
|
37
|
+
.pipe(gulp.dest(outputDir));
|
38
|
+
});
|
39
|
+
|
40
|
+
gulp.task('lint', function () {
|
41
|
+
return gulp.src([ inputDir + '/*.js' ])
|
42
|
+
.pipe(eslint({
|
43
|
+
envs: [
|
44
|
+
'es6' //turns on all es6 features except modules
|
45
|
+
],
|
46
|
+
rules: {
|
47
|
+
// full documentation here : http://eslint.org/docs/rules
|
48
|
+
|
49
|
+
// Possible errors
|
50
|
+
'comma-dangle': [2, 'never'], // don't let a comma at the end of object properties or array element
|
51
|
+
'no-cond-assign': [2, 'always'], // no assignments in conditional statements
|
52
|
+
'no-console': 2, // no console.log() statements in production code
|
53
|
+
'no-constant-condition': 2, // no constants in conditional statements
|
54
|
+
'no-control-regex': 2, // no control characters in regex's
|
55
|
+
'no-debugger': 2, // no debugger in productin code
|
56
|
+
'no-dupe-args': 2, // no duplicated arguments in functions
|
57
|
+
'no-dupe-keys': 2, // no duplicated keys when creating object literals
|
58
|
+
'no-duplicate-case': 2, // no duplicated `case` in `switch` statements
|
59
|
+
'no-empty-character-class': 2, // disallow the use of empty character classes in regular expressions
|
60
|
+
'no-empty': 2, // no empty blocks
|
61
|
+
'no-ex-assign': 2, // do not assign any value to an Exception raised
|
62
|
+
'no-extra-boolean-cast': 2, // do not use !!falseExpression to cast to boolean
|
63
|
+
'no-extra-parens': 2, // do not use extra parenthesis
|
64
|
+
'no-extra-semi': 2, // do not use extra semicolons
|
65
|
+
'no-func-assign': 2, // do not overwrite variables declared as functions
|
66
|
+
'no-inner-declarations': [2, 'both'], // only declare var's and funct's on function scope
|
67
|
+
'no-invalid-regexp': 2, // validates string arguments passed to RegExp constructor
|
68
|
+
'no-irregular-whitespace': 2, // detects special characters used as spaces
|
69
|
+
'no-negated-in-lhs': 2, // do not use negation in the left operand in an `in` expression
|
70
|
+
'no-obj-calls': 2, // prevent calling global objects as if they were functions
|
71
|
+
'no-regex-spaces': 2, // do not use multiple spaces in regex's
|
72
|
+
'no-sparse-arrays': 2, // do not use sparse arrays (empty elements)
|
73
|
+
'no-unexpected-multiline': 2, // Avoid code that looks like two expressions but is actually one
|
74
|
+
'no-unreachable': 2, // detects unreachable statements (after return, throw,...)
|
75
|
+
'use-isnan': 2, // do not compare with `NaN` value, use isNan() instead
|
76
|
+
'valid-jsdoc': 2, // ensure JSDoc comments are valid
|
77
|
+
'valid-typeof': 2 // ensure that the results of typeof are compared against a valid string
|
78
|
+
},
|
79
|
+
ecmaFeatures: {
|
80
|
+
'modules': true //this gives us modules :)
|
81
|
+
}
|
82
|
+
}))
|
83
|
+
.pipe(eslint.format())
|
84
|
+
.pipe(eslint.failAfterError());
|
85
|
+
});
|
86
|
+
|
87
|
+
gulp.task('clean', function (cb) {
|
88
|
+
del([ outputDir ], cb);
|
89
|
+
});
|
@@ -0,0 +1,28 @@
|
|
1
|
+
{
|
2
|
+
"name": "xecmascript",
|
3
|
+
"version": "0.0.0",
|
4
|
+
"description": "Exercism exercises in ECMAScript 6.",
|
5
|
+
"author": "Katrina Owen",
|
6
|
+
"private": true,
|
7
|
+
"repository": {
|
8
|
+
"type": "git",
|
9
|
+
"url": "https://github.com/exercism/xecmascript"
|
10
|
+
},
|
11
|
+
"devDependencies": {
|
12
|
+
"babel": "~5.8.29",
|
13
|
+
"del": "~2.0.2",
|
14
|
+
"gulp": "~3.9.0",
|
15
|
+
"gulp-babel": "~5.3.0",
|
16
|
+
"gulp-eslint": "^1.1.0",
|
17
|
+
"gulp-jasmine": "~2.0.1",
|
18
|
+
"yargs": "~3.27.0"
|
19
|
+
},
|
20
|
+
"scripts": {
|
21
|
+
"test": "gulp test",
|
22
|
+
"lint-test": "gulp lint test"
|
23
|
+
},
|
24
|
+
"licenses": [
|
25
|
+
"MIT"
|
26
|
+
],
|
27
|
+
"dependencies": {}
|
28
|
+
}
|
data/tracks/java/config.json
CHANGED
@@ -55,6 +55,7 @@
|
|
55
55
|
"binary-search-tree",
|
56
56
|
"binary-search",
|
57
57
|
"all-your-base",
|
58
|
+
"custom-set",
|
58
59
|
"wordy",
|
59
60
|
"palindrome-products"
|
60
61
|
],
|
@@ -314,6 +315,11 @@
|
|
314
315
|
"difficulty": 1,
|
315
316
|
"topics": []
|
316
317
|
},
|
318
|
+
{
|
319
|
+
"slug": "custom-set",
|
320
|
+
"difficulty": 1,
|
321
|
+
"topics": []
|
322
|
+
},
|
317
323
|
{
|
318
324
|
"slug": "wordy",
|
319
325
|
"difficulty": 1,
|