Skip to content

Latest commit

 

History

History
65 lines (55 loc) · 1.62 KB

roman-numerals-helper.org

File metadata and controls

65 lines (55 loc) · 1.62 KB
 // TODO: create a RomanNumerals helper object
 class RomanNumeralsClass {
   constructor() {
     this.numeralConversionMap = {
	'I': 1,
	'V': 5,
	'X': 10,
	'L': 50,
	'C': 100,
	'D': 500,
	'M': 1000
     }
   }

   combineValues(arrayOfValues) {
     return arrayOfValues.reduce((acc,val,idx,arr) => {
	// don't have to check next numeral on last one
	if (idx == arr.length - 1) return acc + val;
	// if next value is larger then we need to subtract from next value
	if (arr[idx + 1] > val) {
	  arr[idx+1] -= val;
	  return acc;
	} else {
	  return acc + val;
	}
     }, 0)
   }

   getNumerals(number) {
     let convMap = this.numeralConversionMap;
     let val = convMap[number];
     if (val) return val;

     let numeral = '';

     for (const [key, value] of Object.entries(convMap)) {
       numeral = number > value
     }

   }

   fromRoman(romanNumeralString) {
     let romanNumeralsArray = romanNumeralString.split("");
     let valuesArray = romanNumeralsArray.map(numeral => this.numeralConversionMap[numeral]);
     return this.combineValues(valuesArray);
   }

   toRoman(number) {
     // convert number into array of digits
     let digitsArray = number.toString().split("").map(string => +string);
     let magnitudesArray = digitsArray.map((digit, idx, arr) => {
	let numberPlace = Math.abs(idx - arr.length - 1);
	let magnitude = Math.pow(10, numberPlace);
	return magnitude * value;
     });
     return magnitudeArray.map(val => getNumerals(val)).join('');
   }
 }

 let RomanNumerals = new RomanNumeralsClass()