Skip to content

Instantly share code, notes, and snippets.

@NicMcPhee
Last active December 16, 2015 21:20
Show Gist options
  • Save NicMcPhee/5499070 to your computer and use it in GitHub Desktop.
Save NicMcPhee/5499070 to your computer and use it in GitHub Desktop.
A finished solution to the roman numeral kata (http://codingdojo.org/cgi-bin/wiki.pl?KataRomanNumerals) from the 24 April and 1 May 2013 coding dojos at the University of Minnesota, Morris. This works, but it really isn't terribly readable and we'd like to do something to improve that.
class RomanNumeralConverter {
def mappings = [[[1000 , "M"], [500 , "D"], [100 , "C"]],
[[100 , "C"], [50 , "L"], [10 , "X"]],
[[10 , "X"], [5 , "V"], [1 , "I"]]]
def convert(integer) {
String result = ""
def pair = handleDigit("M","D", "C", 100, result, integer)
pair = handleDigit("C","L", "X", 10, pair[0], pair[1])
pair = handleDigit("X","V", "I", 1, pair[0], pair[1])
result = pair[0]
integer= pair[1]
while (integer >= 1){
result = result + "I"
integer = integer - 1
}
return result
}
def handleDigit(tensPlace, fivesPlace, onesPlace, number, result, integer) {
while (integer >= number*10){
result = result + tensPlace
integer = integer - number*10
}
while (integer >= number*9){
result = result + onesPlace + tensPlace
integer = integer - number*9
}
while (integer >= number*5){
result = result + fivesPlace
integer = integer - number*5
}
while (integer >= number*4){
result = result + onesPlace + fivesPlace
integer = integer - number*4
}
return [result, integer]
}
}
import spock.lang.Specification
class RomanNumeralTests extends Specification {
def converter = new RomanNumeralConverter()
def romanValues = [1:"I", 2:"II", 3:"III", 4:"IV", 5:"V", 8: "VIII", 9:"IX" , 10:"X", 40:"XL", 50:"L",
90:"XC", 99:"XCIX", 100:"C", 150:"CL", 500:"D", 800:"DCCC", 999: "CMXCIX", 1000:"M", 1050:"ML",
1500:"MD", 1750:"MDCCL", 1800:"MDCCC", 2000:"MM", 3000:"MMM"]
def "test the map romanValues"() {
expect:
romanValues.each{k,v ->
assert(converter.convert(k)==v)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment