Respuesta :
Answer:
let convertRomanToInt romanNumber : int =
match romanNumber with
| 'I' -> 1
| 'V' -> 5
| 'X' -> 10
| 'L' -> 50
| 'C' -> 100
| 'D' -> 500
| 'M' -> 100
let rec romanNumberToInteger romanNumber =
if (String.length romanNumber = 1) then
convertRomanToInt romanNumber.[0]
elif (String.length romanNumber = 0) then 0
else let atuple = (romanNumber.[0],romanNumber.[1])
let f atuple = match atuple with
| (f,s) when (convertRomanToInt f) >=(convertRomanToInt s)->(convertRomanToInt f) + (romanNumberToInteger romanNumber.[1..])
| (f,s) when (convertRomanToInt f) < (convertRomanToInt s) -> (convertRomanToInt s) - (convertRomanToInt f) + (romanNumberToInteger romanNumber.[2..])
f atuple
let charToRomanDigit c =
printfn "%c" c
match c with
| 'I' -> 'I'
| 'V' -> 'V'
| 'X' -> 'X'
| 'L' -> 'L'
| 'C' -> 'C'
| 'D' -> 'D'
| 'M' -> 'M'
| _ -> failwith "Invalid Entry"
let stringToNumber str =
let upperDigit (x:string) = x.ToUpper()
let upperString = upperDigit str
printfn "%s" upperString
String.collect (fun c -> sprintf "%c" (charToRomanDigit c)) upperString
let romanNumber = "XIX"
let upperDigit (x:string) = x.ToUpper()
printfn "a: %s" (upperDigit romanNumber)
romanNumber = stringToNumber romanNumber
printfn "\nValue = %d" (romanNumberToInteger romanNumber)
Explanation:
- Create a function called convertRomanToInt for pattern matching to convert romanNumber to valid integer
- Create a recursive function called romanNumberToInteger and check if length of romanNumber is 1 or 0 .
- Check whether the first character is less than second character, then its reverse otherwise it's normal .
- Create tuple of first and second character for pattern matching .
- Create a function charToRomanDigit and use String.collect to go through each character present in string and reconstruct them again .
- System.Char.ToUpper is used to convert a character to uppercase and stringToNumber to convert string in valid Roman number .
- Finally print the results.