Skip to content

Instantly share code, notes, and snippets.

@mrbusche
Created March 6, 2018 02:13
Show Gist options
  • Save mrbusche/6eff0aeeb3b67486cfed951e6fb5a095 to your computer and use it in GitHub Desktop.
Save mrbusche/6eff0aeeb3b67486cfed951e6fb5a095 to your computer and use it in GitHub Desktop.
Roman Numeral to Number
//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