Skip to content

Instantly share code, notes, and snippets.

@ozansulukpinar
Created May 9, 2021 16:00
Show Gist options
  • Save ozansulukpinar/ba7ca1af25ae2aeb94daa3a01a8f7faf to your computer and use it in GitHub Desktop.
Save ozansulukpinar/ba7ca1af25ae2aeb94daa3a01a8f7faf to your computer and use it in GitHub Desktop.
Roman Numerals Converter
//This script converts Roman numerals to decimal between I(1) to MMMCMXCIX(3999)
var numeral = "romanNumeral";
convertFromRoman(numeral);
function convertFromRoman(numeral) {
var numbers = [];
var previousNumber, currentNumber, sum, equalityTime, repeatedTimeOfV, repeatedTimeOfL, repeatedTimeOfD;
sum = repeatedTimeOfV = repeatedTimeOfL = repeatedTimeOfD = 0;
equalityTime = 2;
var characters = numeral.split('');
for (var i = 0; i < characters.length; i++) {
if (characters[i] != "I" && characters[i] != "V" && characters[i] != "X" && characters[i] != "L" && characters[i] != "C" && characters[i] != "D" && characters[i] != "M") {
alert("This is not a Roman numeral!");
return;
}
switch (characters[i]) {
case "I":
currentNumber = 1;
break;
case "V":
currentNumber = 5;
repeatedTimeOfV++;
break;
case "X":
currentNumber = 10;
break;
case "L":
currentNumber = 50;
repeatedTimeOfL++;
break;
case "C":
currentNumber = 100;
break;
case "D":
currentNumber = 500;
repeatedTimeOfD++;
break;
case "M":
currentNumber = 1000;
}
//* The symbols V, L and D are never repeated
if (repeatedTimeOfV == 2 || repeatedTimeOfL == 2 || repeatedTimeOfD == 2) {
alert("This is not a valid Roman numeral!");
return;
}
if (i != 0) {
if (previousNumber < currentNumber) {
//The symbols V, L and D are never subtracted
if (previousNumber == 5 || previousNumber == 50 || previousNumber == 500) {
alert("This is not a valid Roman numeral!");
return;
}
//The symbol I can be subtracted from V and X only
if (previousNumber == 1 && (!(currentNumber == 5 || currentNumber == 10))) {
alert("This is not a valid Roman numeral!");
return;
}
//The symbol X can be subtracted from L, M, and C only
if (previousNumber == 10 && (!(currentNumber == 50 || currentNumber == 100 || currentNumber == 1000))) {
alert("This is not a valid Roman numeral!");
return;
}
//A symbol cannot be subtracted more than once from a greater one
if (i >= 2) {
if (previousNumber == numbers[i - 2]) {
alert("This is not a valid Roman numeral!");
return;
}
}
//A lower symbol is written to the left of greater one, it is subtracted from the greater one
numbers[i - 1] = (-1 * previousNumber);
equalityTime = 1;
}
else if (previousNumber == currentNumber) {
if (i >= 2) {
if (previousNumber == numbers[i - 2])
equalityTime++;
}
}
else { //previousNumber > currentNumber
equalityTime = 1;
}
}
numbers[i] = currentNumber;
//A symbol is not repeated more than three times
if (equalityTime > 3) {
alert("This is not a valid Roman numeral!");
return;
}
previousNumber = currentNumber;
}
numbers.forEach(function (item) {
sum = sum + item;
})
alert(sum);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment