javascript - roman-numerals
This commit is contained in:
parent
0282389eb4
commit
e8af849460
79
javascript/roman-numerals/README.md
Normal file
79
javascript/roman-numerals/README.md
Normal file
@ -0,0 +1,79 @@
|
||||
# Roman Numerals
|
||||
|
||||
Write a function to convert from normal numbers to Roman Numerals.
|
||||
|
||||
The Romans were a clever bunch. They conquered most of Europe and ruled
|
||||
it for hundreds of years. They invented concrete and straight roads and
|
||||
even bikinis. One thing they never discovered though was the number
|
||||
zero. This made writing and dating extensive histories of their exploits
|
||||
slightly more challenging, but the system of numbers they came up with
|
||||
is still in use today. For example the BBC uses Roman numerals to date
|
||||
their programmes.
|
||||
|
||||
The Romans wrote numbers using letters - I, V, X, L, C, D, M. (notice
|
||||
these letters have lots of straight lines and are hence easy to hack
|
||||
into stone tablets).
|
||||
|
||||
```text
|
||||
1 => I
|
||||
10 => X
|
||||
7 => VII
|
||||
```
|
||||
|
||||
There is no need to be able to convert numbers larger than about 3000.
|
||||
(The Romans themselves didn't tend to go any higher)
|
||||
|
||||
Wikipedia says: Modern Roman numerals ... are written by expressing each
|
||||
digit separately starting with the left most digit and skipping any
|
||||
digit with a value of zero.
|
||||
|
||||
To see this in practice, consider the example of 1990.
|
||||
|
||||
In Roman numerals 1990 is MCMXC:
|
||||
|
||||
1000=M
|
||||
900=CM
|
||||
90=XC
|
||||
|
||||
2008 is written as MMVIII:
|
||||
|
||||
2000=MM
|
||||
8=VIII
|
||||
|
||||
See also: http://www.novaroma.org/via_romana/numbers.html
|
||||
|
||||
## 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`.
|
||||
|
||||
|
||||
## Source
|
||||
|
||||
The Roman Numeral Kata [http://codingdojo.org/cgi-bin/index.pl?KataRomanNumerals](http://codingdojo.org/cgi-bin/index.pl?KataRomanNumerals)
|
||||
|
||||
## Submitting Incomplete Solutions
|
||||
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
7080
javascript/roman-numerals/package-lock.json
generated
Normal file
7080
javascript/roman-numerals/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
80
javascript/roman-numerals/package.json
Normal file
80
javascript/roman-numerals/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": {}
|
||||
}
|
15
javascript/roman-numerals/roman-numerals.js
Normal file
15
javascript/roman-numerals/roman-numerals.js
Normal file
@ -0,0 +1,15 @@
|
||||
const toRoman = function (number) {
|
||||
const numerals = { M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1 };
|
||||
|
||||
let roman = '';
|
||||
for (const n in numerals) {
|
||||
const value = Math.floor(number / numerals[n]);
|
||||
if (value > 0) {
|
||||
roman += n.repeat(value);
|
||||
number -= (value * numerals[n]);
|
||||
}
|
||||
}
|
||||
return roman;
|
||||
};
|
||||
|
||||
export default toRoman;
|
22
javascript/roman-numerals/roman-numerals.spec.js
Normal file
22
javascript/roman-numerals/roman-numerals.spec.js
Normal file
@ -0,0 +1,22 @@
|
||||
import toRoman from './roman-numerals';
|
||||
|
||||
describe('toRoman()', () => {
|
||||
test('converts 1', () => expect(toRoman(1)).toEqual('I'));
|
||||
test('converts 2', () => expect(toRoman(2)).toEqual('II'));
|
||||
test('converts 3', () => expect(toRoman(3)).toEqual('III'));
|
||||
test('converts 4', () => expect(toRoman(4)).toEqual('IV'));
|
||||
test('converts 5', () => expect(toRoman(5)).toEqual('V'));
|
||||
test('converts 6', () => expect(toRoman(6)).toEqual('VI'));
|
||||
test('converts 9', () => expect(toRoman(9)).toEqual('IX'));
|
||||
test('converts 27', () => expect(toRoman(27)).toEqual('XXVII'));
|
||||
test('converts 48', () => expect(toRoman(48)).toEqual('XLVIII'));
|
||||
test('converts 59', () => expect(toRoman(59)).toEqual('LIX'));
|
||||
test('converts 93', () => expect(toRoman(93)).toEqual('XCIII'));
|
||||
test('converts 141', () => expect(toRoman(141)).toEqual('CXLI'));
|
||||
test('converts 163', () => expect(toRoman(163)).toEqual('CLXIII'));
|
||||
test('converts 402', () => expect(toRoman(402)).toEqual('CDII'));
|
||||
test('converts 575', () => expect(toRoman(575)).toEqual('DLXXV'));
|
||||
test('converts 911', () => expect(toRoman(911)).toEqual('CMXI'));
|
||||
test('converts 1024', () => expect(toRoman(1024)).toEqual('MXXIV'));
|
||||
test('converts 3000', () => expect(toRoman(3000)).toEqual('MMM'));
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user