javascript - all-your-base
This commit is contained in:
parent
0a632f27dd
commit
9304aca5a2
64
javascript/all-your-base/README.md
Normal file
64
javascript/all-your-base/README.md
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# All Your Base
|
||||||
|
|
||||||
|
Convert a number, represented as a sequence of digits in one base, to any other base.
|
||||||
|
|
||||||
|
Implement general base conversion. Given a number in base **a**,
|
||||||
|
represented as a sequence of digits, convert it to base **b**.
|
||||||
|
|
||||||
|
## Note
|
||||||
|
|
||||||
|
- Try to implement the conversion yourself.
|
||||||
|
Do not use something else to perform the conversion for you.
|
||||||
|
|
||||||
|
## About [Positional Notation](https://en.wikipedia.org/wiki/Positional_notation)
|
||||||
|
|
||||||
|
In positional notation, a number in base **b** can be understood as a linear
|
||||||
|
combination of powers of **b**.
|
||||||
|
|
||||||
|
The number 42, *in base 10*, means:
|
||||||
|
|
||||||
|
(4 * 10^1) + (2 * 10^0)
|
||||||
|
|
||||||
|
The number 101010, *in base 2*, means:
|
||||||
|
|
||||||
|
(1 * 2^5) + (0 * 2^4) + (1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (0 * 2^0)
|
||||||
|
|
||||||
|
The number 1120, *in base 3*, means:
|
||||||
|
|
||||||
|
(1 * 3^3) + (1 * 3^2) + (2 * 3^1) + (0 * 3^0)
|
||||||
|
|
||||||
|
I think you got the idea!
|
||||||
|
|
||||||
|
*Yes. Those three numbers above are exactly the same. Congratulations!*
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Go through the setup instructions for Javascript to
|
||||||
|
install the necessary dependencies:
|
||||||
|
|
||||||
|
[https://exercism.io/tracks/javascript/installation](https://exercism.io/tracks/javascript/installation)
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
Install assignment dependencies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Making the test suite pass
|
||||||
|
|
||||||
|
Execute the tests with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
In the test suites all tests but the first have been skipped.
|
||||||
|
|
||||||
|
Once you get a test passing, you can enable the next one by
|
||||||
|
changing `xtest` to `test`.
|
||||||
|
|
||||||
|
|
||||||
|
## Submitting Incomplete Solutions
|
||||||
|
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
41
javascript/all-your-base/all-your-base.js
Normal file
41
javascript/all-your-base/all-your-base.js
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
class Converter {
|
||||||
|
|
||||||
|
convert(digits, inputBase, outputBase) {
|
||||||
|
// validate in/out bases
|
||||||
|
if (inputBase < 2 || !Number.isInteger(inputBase)) {
|
||||||
|
throw Error('Wrong input base')
|
||||||
|
}
|
||||||
|
if (outputBase < 2 || !Number.isInteger(outputBase)) {
|
||||||
|
throw Error('Wrong output base')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate digits.
|
||||||
|
if (!digits.length || (digits[0] == 0 && digits.length != 1)) {
|
||||||
|
throw Error('Input has wrong format');
|
||||||
|
} else if (digits[0] == 0 && digits.length == 1){
|
||||||
|
return digits;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert to base 10
|
||||||
|
let sum = 0;
|
||||||
|
let i = 0;
|
||||||
|
while (digits.length > 0) {
|
||||||
|
let d = digits.pop();
|
||||||
|
if (d >= inputBase || d < 0) {
|
||||||
|
throw Error('Input has wrong format');
|
||||||
|
}
|
||||||
|
sum += d * (inputBase ** i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert to outputBase
|
||||||
|
let output = [];
|
||||||
|
while (sum > 0) {
|
||||||
|
output.unshift(sum % outputBase);
|
||||||
|
sum = Math.floor(sum / outputBase);
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Converter;
|
137
javascript/all-your-base/all-your-base.spec.js
Normal file
137
javascript/all-your-base/all-your-base.spec.js
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
import Converter from './all-your-base';
|
||||||
|
|
||||||
|
const converter = new Converter();
|
||||||
|
|
||||||
|
describe('Converter', () => {
|
||||||
|
test('single bit one to decimal', () => {
|
||||||
|
expect(converter.convert([1], 2, 10)).toEqual([1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('binary to single decimal', () => {
|
||||||
|
expect(converter.convert([1, 0, 1], 2, 10)).toEqual([5]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('single decimal to binary', () => {
|
||||||
|
expect(converter.convert([5], 10, 2)).toEqual([1, 0, 1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('binary to multiple decimal', () => {
|
||||||
|
expect(converter.convert([1, 0, 1, 0, 1, 0], 2, 10)).toEqual([4, 2]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('decimal to binary', () => {
|
||||||
|
expect(converter.convert([4, 2], 10, 2)).toEqual([1, 0, 1, 0, 1, 0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('trinary to hexadecimal', () => {
|
||||||
|
expect(converter.convert([1, 1, 2, 0], 3, 16)).toEqual([2, 10]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('hexadecimal to trinary', () => {
|
||||||
|
expect(converter.convert([2, 10], 16, 3)).toEqual([1, 1, 2, 0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('15-bit integer', () => {
|
||||||
|
expect(converter.convert([3, 46, 60], 97, 73)).toEqual([6, 10, 45]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('empty list', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([], 2, 10);
|
||||||
|
}).toThrow(new Error('Input has wrong format'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('single zero', () => {
|
||||||
|
expect(converter.convert([0], 10, 2)).toEqual([0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('multiple zeros', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([0, 0, 0], 10, 2);
|
||||||
|
}).toThrow(new Error('Input has wrong format'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('leading zeros', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([0, 6, 0], 7, 10);
|
||||||
|
}).toThrow(new Error('Input has wrong format'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('negative digit', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([1, -1, 1, 0, 1, 0], 2, 10);
|
||||||
|
}).toThrow(new Error('Input has wrong format'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('invalid positive digit', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([1, 2, 1, 0, 1, 0], 2, 10);
|
||||||
|
}).toThrow(new Error('Input has wrong format'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('first base is one', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([], 1, 10);
|
||||||
|
}).toThrow(new Error('Wrong input base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('second base is one', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([1, 0, 1, 0, 1, 0], 2, 1);
|
||||||
|
}).toThrow(new Error('Wrong output base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('first base is zero', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([], 0, 10);
|
||||||
|
}).toThrow(new Error('Wrong input base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('second base is zero', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([7], 10, 0);
|
||||||
|
}).toThrow(new Error('Wrong output base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('first base is negative', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([1], -2, 10);
|
||||||
|
}).toThrow(new Error('Wrong input base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('second base is negative', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([1], 2, -7);
|
||||||
|
}).toThrow(new Error('Wrong output base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('both bases are negative', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([1], -2, -7);
|
||||||
|
}).toThrow(new Error('Wrong input base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('missing input base throws an error', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([0]);
|
||||||
|
}).toThrow(new Error('Wrong input base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('wrong input_base base not integer', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([0], 2.5);
|
||||||
|
}).toThrow(new Error('Wrong input base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('missing output base throws an error', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([0], 2);
|
||||||
|
}).toThrow(new Error('Wrong output base'));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('wrong output_base base not integer', () => {
|
||||||
|
expect(() => {
|
||||||
|
converter.convert([0], 3, 2.5);
|
||||||
|
}).toThrow(new Error('Wrong output base'));
|
||||||
|
});
|
||||||
|
});
|
7080
javascript/all-your-base/package-lock.json
generated
Normal file
7080
javascript/all-your-base/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
80
javascript/all-your-base/package.json
Normal file
80
javascript/all-your-base/package.json
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
{
|
||||||
|
"name": "exercism-javascript",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "Exercism exercises in Javascript.",
|
||||||
|
"author": "Katrina Owen",
|
||||||
|
"private": true,
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/exercism/javascript"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-jest": "^21.2.0",
|
||||||
|
"babel-plugin-transform-builtin-extend": "^1.1.2",
|
||||||
|
"babel-preset-env": "^1.4.0",
|
||||||
|
"eslint": "^3.19.0",
|
||||||
|
"eslint-config-airbnb": "^15.0.1",
|
||||||
|
"eslint-plugin-import": "^2.2.0",
|
||||||
|
"eslint-plugin-jsx-a11y": "^5.0.1",
|
||||||
|
"eslint-plugin-react": "^7.0.1",
|
||||||
|
"jest": "^21.2.1"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"modulePathIgnorePatterns": [
|
||||||
|
"package.json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"babel": {
|
||||||
|
"presets": [
|
||||||
|
[
|
||||||
|
"env",
|
||||||
|
{
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"node": "current"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
[
|
||||||
|
"babel-plugin-transform-builtin-extend",
|
||||||
|
{
|
||||||
|
"globals": [
|
||||||
|
"Error"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"transform-regenerator"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "jest --no-cache ./*",
|
||||||
|
"watch": "jest --no-cache --watch ./*",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"lint-test": "eslint . && jest --no-cache ./* "
|
||||||
|
},
|
||||||
|
"eslintConfig": {
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 6,
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"env": {
|
||||||
|
"es6": true,
|
||||||
|
"node": true,
|
||||||
|
"jest": true
|
||||||
|
},
|
||||||
|
"extends": "airbnb",
|
||||||
|
"rules": {
|
||||||
|
"import/no-unresolved": "off",
|
||||||
|
"import/extensions": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"licenses": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"dependencies": {}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user