The problem
Create a perform that takes a Roman numeral as its argument and returns its worth as a numeric decimal integer. You don’t have to validate the type of the Roman numeral.
Trendy Roman numerals are written by expressing every decimal digit of the quantity to be encoded individually, beginning with the leftmost digit and skipping any 0s. So 1990 is rendered “MCMXC” (1000 = M, 900 = CM, 90 = XC) and 2008 is rendered “MMVIII” (2000 = MM, 8 = VIII). The Roman numeral for 1666, “MDCLXVI”, makes use of every letter in descending order.
Instance:
// ought to return 21
resolution('XXI');
Assist:
Image Worth
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
The answer in Golang
Choice 1:
package deal resolution
var decoder = map[rune]int {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
func Decode(roman string) int {
if len(roman) == 0 { return 0 }
first := decoder[rune(roman[0])]
if len(roman) == 1 { return first }
subsequent := decoder[rune(roman[1])]
if subsequent > first { return (subsequent - first) + Decode(roman[2:]) }
return first + Decode(roman[1:])
}
Choice 2:
package deal resolution
func Decode(roman string) int {
var sum int
var Roman = map[byte] int {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000,}
for okay, v := vary roman {
if okay < len(roman) - 1 && Roman[byte(roman[k + 1])] > Roman[byte(roman[k])] {
sum -= Roman[byte(v)]
} else {
sum += Roman[byte(v)]
}
}
return sum
}
Choice 3:
package deal resolution
func Decode(roman string) int {
translateRoman := map[byte]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
var decNum, tmpNum int
for i := len(roman) - 1; i >= 0; i-- {
romanDigit := roman[i]
decDigit := translateRoman[romanDigit]
if decDigit < tmpNum {
decNum -= decDigit
} else {
decNum += decDigit
tmpNum = decDigit
}
}
return decNum
}
Check circumstances to validate our resolution
package deal solution_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("check roman to decimal converter", func() {
It("ought to give decimal quantity from roman", func() {
Anticipate(Decode("XXI")).To(Equal(21))
})
It("ought to give decimal quantity from roman", func() {
Anticipate(Decode("I")).To(Equal(1))
})
It("ought to give decimal quantity from roman", func() {
Anticipate(Decode("IV")).To(Equal(4))
})
It("ought to give decimal quantity from roman", func() {
Anticipate(Decode("MMVIII")).To(Equal(2008))
})
It("ought to give decimal quantity from roman", func() {
Anticipate(Decode("MDCLXVI")).To(Equal(1666))
})
})