Created
March 6, 2018 02:13
-
-
Save mrbusche/6eff0aeeb3b67486cfed951e6fb5a095 to your computer and use it in GitHub Desktop.
Roman Numeral to Number
This file contains hidden or 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
//no return type specified because it can be an int or a string. | |
//Generally this would be in a class and an exception would be throw rather than | |
//returning a string, but a whole class cannot be ran on the Groovy Console | |
def romanToDecimal(String romanNumber) { | |
Integer newNumber = 0, previousNumber = 0 | |
Map romanToNumberMapping = [M:1000, D:500, C:100, L:50, X:10, V:5, I:1] | |
//convert the string to upper case in case the user entered it in lower case | |
String romanNumeral = romanNumber.toUpperCase() | |
for (Integer oneChar = romanNumeral.length() - 1; oneChar >= 0; oneChar--) { | |
String oneLetter = romanNumeral.charAt(oneChar) | |
if (romanToNumberMapping[oneLetter]) {//make sure oneChar has a key in the map | |
newNumber = processNumber(romanToNumberMapping[oneLetter], previousNumber, newNumber) | |
previousNumber = romanToNumberMapping[oneLetter] | |
} else { | |
return 'invalid roman numeral' | |
} | |
} | |
return newNumber | |
} | |
Integer processNumber(Integer currentNumber, Integer previousNumber, Integer newNumber) { | |
return previousNumber > currentNumber ? newNumber - currentNumber : newNumber + currentNumber | |
} | |
println 1 == romanToDecimal('I') | |
println 2 == romanToDecimal('II') | |
println 3 == romanToDecimal('III') | |
println 4 == romanToDecimal('IV') | |
println 5 == romanToDecimal('V') | |
println 6 == romanToDecimal('VI') | |
println 7 == romanToDecimal('VII') | |
println 8 == romanToDecimal('VIII') | |
println 9 == romanToDecimal('IX') | |
println 10 == romanToDecimal('X') | |
println 100 == romanToDecimal('C') | |
println 101 == romanToDecimal('CI') | |
println 400 == romanToDecimal('CD') | |
println 300 == romanToDecimal('CCC') | |
println 999 == romanToDecimal('IM') | |
println 1000 == romanToDecimal('M') | |
println 2000 == romanToDecimal('MM') | |
println 3000 == romanToDecimal('mmm') | |
println 2500 == romanToDecimal('mmd') | |
println 2501 == romanToDecimal('mmdi') | |
println 2999 == romanToDecimal('immm') | |
println 'invalid roman numeral' == romanToDecimal('A') | |
println 'invalid roman numeral' == romanToDecimal('InvalidRoman') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment