Skip to content

Instantly share code, notes, and snippets.

@optyler
Last active March 29, 2019 15:12
Show Gist options
  • Save optyler/192afaf10dcc830983a3f4f40f69a506 to your computer and use it in GitHub Desktop.
Save optyler/192afaf10dcc830983a3f4f40f69a506 to your computer and use it in GitHub Desktop.
class RomanConverter {
final static def VALUES = [
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
];
final static def romanToArabic(String roman = "") {
if (roman == null || roman.isEmpty()) {
return null;
}
def number = roman.toUpperCase()
if (! number.every { d -> VALUES.any { k, v -> d == k }}) {
return null;
}
if(number.length() == 1) return VALUES.get(number[0], null)
def n1, n2
def total = 0
def c = 0
while (c < number.length()) {
n1 = VALUES.getAt(number[c])
if (c+1 < number.length()) {
n2 = VALUES.getAt(number[c+1])
if (n1 >= n2) {
total += n1
c += 1
} else {
total += n2 - n1
c += 2
}
}
else {
total += n1
c += 1
}
}
return total
}
final static def arabicToRoman(String number) { }
}
assert RomanConverter.romanToArabic(null) == null
assert RomanConverter.romanToArabic("") == null
assert RomanConverter.romanToArabic("invalid") == null
assert RomanConverter.romanToArabic("I") == 1
assert RomanConverter.romanToArabic("IV") == 4
assert RomanConverter.romanToArabic("VI") == 6
assert RomanConverter.romanToArabic("IX") == 9
assert RomanConverter.romanToArabic("ix") == 9
assert RomanConverter.romanToArabic("X") == 10
assert RomanConverter.romanToArabic("MCMXC") == 1990
assert RomanConverter.romanToArabic("MCMXCI") == 1991
assert RomanConverter.romanToArabic("MCMXCII") == 1992
assert RomanConverter.romanToArabic("MCMXCIII") == 1993
assert RomanConverter.romanToArabic("MCMXCIV") == 1994
assert RomanConverter.romanToArabic("MCMXCV") == 1995
assert RomanConverter.romanToArabic("MCMXCVI") == 1996
assert RomanConverter.romanToArabic("MCMXCVII") == 1997
assert RomanConverter.romanToArabic("MCMXCVIII") == 1998
assert RomanConverter.romanToArabic("MCMXCIX") == 1999
assert RomanConverter.romanToArabic("MM") == 2000
assert RomanConverter.romanToArabic("MMI") == 2001
assert RomanConverter.romanToArabic("MMII") == 2002
assert RomanConverter.romanToArabic("MMIII") == 2003
assert RomanConverter.romanToArabic("MMIV") == 2004
assert RomanConverter.romanToArabic("MMV") == 2005
assert RomanConverter.romanToArabic("MMVI") == 2006
assert RomanConverter.romanToArabic("MMVII") == 2007
assert RomanConverter.romanToArabic("MMVIII") == 2008
assert RomanConverter.romanToArabic("MMIX") == 2009
assert RomanConverter.romanToArabic("MMX") == 2010
assert RomanConverter.romanToArabic("MMMM") == 4000
assert RomanConverter.romanToArabic("MMMMCMXCIX") == 4999
println("End")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment