Created
May 9, 2021 16:00
-
-
Save ozansulukpinar/ba7ca1af25ae2aeb94daa3a01a8f7faf to your computer and use it in GitHub Desktop.
Roman Numerals Converter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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