Roman numerals/Decode: Difference between revisions
Content added Content deleted
Not a robot (talk | contribs) (Add Miranda) |
(Grouping BASIC dialects) |
||
Line 1,053: | Line 1,053: | ||
{{Out}} |
{{Out}} |
||
<syntaxhighlight lang="applescript">{1666, 1990, 2008, 2016, 2021}</syntaxhighlight> |
<syntaxhighlight lang="applescript">{1666, 1990, 2008, 2016, 2021}</syntaxhighlight> |
||
=={{header|Applesoft BASIC}}== |
|||
=={{header|BASIC}}== |
|||
==={{header|Applesoft BASIC}}=== |
|||
{{trans|BBC BASIC}} |
{{trans|BBC BASIC}} |
||
<syntaxhighlight lang="gwbasic"> 10 LET R$ = "MCMXCIX" |
<syntaxhighlight lang="gwbasic"> 10 LET R$ = "MCMXCIX" |
||
Line 1,087: | Line 1,089: | ||
310 RETURN |
310 RETURN |
||
320 DATA "IVXLCDM",0,1,5,10,50,100,500,1000</syntaxhighlight> |
320 DATA "IVXLCDM",0,1,5,10,50,100,500,1000</syntaxhighlight> |
||
=={{header|Arturo}}== |
|||
==={{header|BASIC256}}=== |
|||
<syntaxhighlight lang="freebasic">function romToDec (roman$) |
|||
num = 0 |
|||
prenum = 0 |
|||
for i = length(roman$) to 1 step -1 |
|||
x$ = mid(roman$, i, 1) |
|||
n = 0 |
|||
if x$ = "M" then n = 1000 |
|||
if x$ = "D" then n = 500 |
|||
if x$ = "C" then n = 100 |
|||
if x$ = "L" then n = 50 |
|||
if x$ = "X" then n = 10 |
|||
if x$ = "V" then n = 5 |
|||
if x$ = "I" then n = 1 |
|||
if n < preNum then num -= n else num += n |
|||
preNum = n |
|||
next i |
|||
return num |
|||
end function |
|||
#Testing |
|||
print "MCMXCIX = "; romToDec("MCMXCIX") #1999 |
|||
print "MDCLXVI = "; romToDec("MDCLXVI") #1666 |
|||
print "XXV = "; romToDec("XXV") #25 |
|||
print "CMLIV = "; romToDec("CMLIV") #954 |
|||
print "MMXI = "; romToDec("MMXI") #2011</syntaxhighlight> |
|||
==={{header|BBC BASIC}}=== |
|||
<syntaxhighlight lang="bbcbasic"> PRINT "MCMXCIX", FNromandecode("MCMXCIX") |
|||
PRINT "MMXII", FNromandecode("MMXII") |
|||
PRINT "MDCLXVI", FNromandecode("MDCLXVI") |
|||
PRINT "MMMDCCCLXXXVIII", FNromandecode("MMMDCCCLXXXVIII") |
|||
END |
|||
DEF FNromandecode(roman$) |
|||
LOCAL i%, j%, p%, n%, r%() |
|||
DIM r%(7) : r%() = 0,1,5,10,50,100,500,1000 |
|||
FOR i% = LEN(roman$) TO 1 STEP -1 |
|||
j% = INSTR("IVXLCDM", MID$(roman$,i%,1)) |
|||
IF j%=0 ERROR 100, "Invalid character" |
|||
IF j%>=p% n% += r%(j%) ELSE n% -= r%(j%) |
|||
p% = j% |
|||
NEXT |
|||
= n%</syntaxhighlight> |
|||
{{out}} |
|||
<pre>MCMXCIX 1999 |
|||
MMXII 2012 |
|||
MDCLXVI 1666 |
|||
MMMDCCCLXXXVIII 3888</pre> |
|||
==={{header|FreeBASIC}}=== |
|||
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64 |
|||
Function romanDecode(roman As Const String) As Integer |
|||
If roman = "" Then Return 0 '' zero denotes invalid roman number |
|||
Dim roman1(0 To 2) As String = {"MMM", "MM", "M"} |
|||
Dim roman2(0 To 8) As String = {"CM", "DCCC", "DCC", "DC", "D", "CD", "CCC", "CC", "C"} |
|||
Dim roman3(0 To 8) As String = {"XC", "LXXX", "LXX", "LX", "L", "XL", "XXX", "XX", "X"} |
|||
Dim roman4(0 To 8) As String = {"IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I"} |
|||
Dim As Integer i, value = 0, length = 0 |
|||
Dim r As String = UCase(roman) |
|||
For i = 0 To 2 |
|||
If Left(r, Len(roman1(i))) = roman1(i) Then |
|||
value += 1000 * (3 - i) |
|||
length = Len(roman1(i)) |
|||
r = Mid(r, length + 1) |
|||
length = 0 |
|||
Exit For |
|||
End If |
|||
Next |
|||
For i = 0 To 8 |
|||
If Left(r, Len(roman2(i))) = roman2(i) Then |
|||
value += 100 * (9 - i) |
|||
length = Len(roman2(i)) |
|||
r = Mid(r, length + 1) |
|||
length = 0 |
|||
Exit For |
|||
End If |
|||
Next |
|||
For i = 0 To 8 |
|||
If Left(r, Len(roman3(i))) = roman3(i) Then |
|||
value += 10 * (9 - i) |
|||
length = Len(roman3(i)) |
|||
r = Mid(r, length + 1) |
|||
length = 0 |
|||
Exit For |
|||
End If |
|||
Next |
|||
For i = 0 To 8 |
|||
If Left(r, Len(roman4(i))) = roman4(i) Then |
|||
value += 9 - i |
|||
length = Len(roman4(i)) |
|||
Exit For |
|||
End If |
|||
Next |
|||
' Can't be a valid roman number if there are any characters left |
|||
If Len(r) > length Then Return 0 |
|||
Return value |
|||
End Function |
|||
Dim a(2) As String = {"MCMXC", "MMVIII" , "MDCLXVI"} |
|||
For i As Integer = 0 To 2 |
|||
Print a(i); Tab(8); " =>"; romanDecode(a(i)) |
|||
Next |
|||
Print |
|||
Print "Press any key to quit" |
|||
Sleep</syntaxhighlight> |
|||
{{out}} |
|||
<pre>MCMXC => 1990 |
|||
MMVIII => 2008 |
|||
MDCLXVI => 1666</pre> |
|||
==={{header|FutureBasic}}=== |
|||
<syntaxhighlight lang="futurebasic">window 1 |
|||
local fn RomantoDecimal( roman as CFStringRef ) as long |
|||
long i, n, preNum = 0, num = 0 |
|||
for i = len(roman) - 1 to 0 step -1 |
|||
n = 0 |
|||
select ( fn StringCharacterAtIndex( roman, i ) ) |
|||
case _"M" : n = 1000 |
|||
case _"D" : n = 500 |
|||
case _"C" : n = 100 |
|||
case _"L" : n = 50 |
|||
case _"X" : n = 10 |
|||
case _"V" : n = 5 |
|||
case _"I" : n = 1 |
|||
end select |
|||
if ( n < preNum ) then num = num - n else num = num + n |
|||
preNum = n |
|||
next |
|||
end fn = num |
|||
print @" MCMXC = "; fn RomantoDecimal( @"MCMXC" ) |
|||
print @" MMVIII = "; fn RomantoDecimal( @"MMVIII" ) |
|||
print @" MMXVI = "; fn RomantoDecimal( @"MMXVI" ) |
|||
print @"MDCLXVI = "; fn RomantoDecimal( @"MDCLXVI" ) |
|||
print @" MCMXIV = "; fn RomantoDecimal( @"MCMXIV" ) |
|||
print @" DXIII = "; fn RomantoDecimal( @"DXIII" ) |
|||
print @" M = "; fn RomantoDecimal( @"M" ) |
|||
print @" DXIII = "; fn RomantoDecimal( @"DXIII" ) |
|||
print @" XXXIII = "; fn RomantoDecimal( @"XXXIII" ) |
|||
HandleEvents</syntaxhighlight> |
|||
{{out}} |
|||
<pre> MCMXC = 1990 |
|||
MMVIII = 2008 |
|||
MMXVI = 2016 |
|||
MDCLXVI = 1666 |
|||
MCMXIV = 1914 |
|||
DXIII = 513 |
|||
M = 1000 |
|||
DXIII = 513 |
|||
XXXIII = 33</pre> |
|||
==={{header|Gambas}}=== |
|||
<syntaxhighlight lang="gambas">'This code will create a GUI Form and Objects and carry out the Roman Numeral convertion as you type |
|||
'The input is case insensitive |
|||
'A basic check for invalid charaters is made |
|||
hTextBox As TextBox 'To allow the creation of a TextBox |
|||
hValueBox As ValueBox 'To allow the creation of a ValueBox |
|||
Public Sub Form_Open() 'Form opens.. |
|||
SetUpForm 'Go to the SetUpForm Routine |
|||
hTextBox.text = "MCMXC" 'Put a Roman numeral in the TextBox |
|||
End |
|||
Public Sub TextBoxInput_Change() 'Each time the TextBox text changes.. |
|||
Dim cRomanN As Collection = ["M": 1000, "D": 500, "C": 100, "L": 50, "X": 10, "V": 5, "I": 1] 'Collection of nemerals e.g 'M' = 1000 |
|||
Dim cMinus As Collection = ["IV": -2, "IX": -2, "XL": -20, "XC": - 20, "CD": -200, "CM": -200] 'Collection of the 'one less than' numbers e.g. 'IV' = 4 |
|||
Dim sClean, sTemp As String 'Various string variables |
|||
Dim siCount As Short 'Counter |
|||
Dim iTotal As Integer 'Stores the total of the calculation |
|||
hTextBox.Text = UCase(hTextBox.Text) 'Make any text in the TextBox upper case |
|||
For siCount = 1 To Len(hTextBox.Text) 'Loop through each character in the TextBox |
|||
If InStr("MDCLXVI", Mid(hTextBox.Text, siCount, 1)) Then 'If a Roman numeral exists then.. |
|||
sClean &= Mid(hTextBox.Text, siCount, 1) 'Put it in 'sClean' (Stops input of non Roman numerals) |
|||
End If |
|||
Next |
|||
hTextBox.Text = sClean 'Put the now clean text in the TextBox |
|||
For siCount = 1 To Len(hTextBox.Text) 'Loop through each character in the TextBox |
|||
iTotal += cRomanN[Mid(hTextBox.Text, siCount, 1)] 'Total up all the characters, note 'IX' will = 11 not 9 |
|||
Next |
|||
For Each sTemp In cMinus 'Loop through each item in the cMinus Collection |
|||
If InStr(sClean, cMinus.Key) > 0 Then iTotal += Val(sTemp) 'If a 'Minus' value is in the string e.g. 'IX' which has been calculated at 11 subtract 2 = 9 |
|||
Next |
|||
hValueBox.text = iTotal 'Display the total |
|||
End |
|||
Public Sub SetUpForm() 'Create the Objects for the Form |
|||
Dim hLabel1, hLabel2 As Label 'For 2 Labels |
|||
Me.height = 150 'Form Height |
|||
Me.Width = 300 'Form Width |
|||
Me.Padding = 20 'Form padding (border) |
|||
Me.Text = "Roman Numeral converter" 'Text in Form header |
|||
Me.Arrangement = Arrange.Vertical 'Form arrangement |
|||
hLabel1 = New Label(Me) 'Create a Label |
|||
hLabel1.Height = 21 'Label Height |
|||
hLabel1.expand = True 'Expand the Label |
|||
hLabel1.Text = "Enter a Roman numeral" 'Put text in the Label |
|||
hTextBox = New TextBox(Me) As "TextBoxInput" 'Set up a TextBox with an Event Label |
|||
hTextBox.Height = 21 'TextBox height |
|||
hTextBox.expand = True 'Expand the TextBox |
|||
hLabel2 = New Label(Me) 'Create a Label |
|||
hLabel2.Height = 21 'Label Height |
|||
hLabel2.expand = True 'Expand the Label |
|||
hLabel2.Text = "The decimal equivelent is: -" 'Put text in the Label |
|||
hValueBox = New ValueBox(Me) 'Create a ValueBox |
|||
hValueBox.Height = 21 'ValuBox Height |
|||
hValueBox.expand = True 'Expand the ValueBox |
|||
hValueBox.ReadOnly = True 'Set ValueBox to Read Only |
|||
End</syntaxhighlight> |
|||
'''[http://www.cogier.com/gambas/Roman%20Numeral%20converter.png Click here for image of running code]''' |
|||
==={{header|Liberty BASIC}}=== |
|||
As Fortran & PureBasic. |
|||
<syntaxhighlight lang="lb"> print "MCMXCIX = "; romanDec( "MCMXCIX") '1999 |
|||
print "MDCLXVI = "; romanDec( "MDCLXVI") '1666 |
|||
print "XXV = "; romanDec( "XXV") '25 |
|||
print "CMLIV = "; romanDec( "CMLIV") '954 |
|||
print "MMXI = "; romanDec( "MMXI") '2011 |
|||
end |
|||
function romanDec( roman$) |
|||
arabic =0 |
|||
lastval =0 |
|||
for i = len( roman$) to 1 step -1 |
|||
select case upper$( mid$( roman$, i, 1)) |
|||
case "M" |
|||
n = 1000 |
|||
case "D" |
|||
n = 500 |
|||
case "C" |
|||
n = 100 |
|||
case "L" |
|||
n = 50 |
|||
case "X" |
|||
n = 10 |
|||
case "V" |
|||
n = 5 |
|||
case "I" |
|||
n = 1 |
|||
case else |
|||
n = 0 |
|||
end select |
|||
if n <lastval then |
|||
arabic =arabic -n |
|||
else |
|||
arabic =arabic +n |
|||
end if |
|||
lastval =n |
|||
next |
|||
romanDec =arabic |
|||
end function</syntaxhighlight> |
|||
{{out}} |
|||
<pre>MCMXCIX = 1999 |
|||
MDCLXVI = 1666 |
|||
XXV = 25 |
|||
CMLIV = 954 |
|||
MMXI = 2011</pre> |
|||
==={{header|PureBasic}}=== |
|||
<syntaxhighlight lang="purebasic">Procedure romanDec(roman.s) |
|||
Protected i, n, lastval, arabic |
|||
For i = Len(roman) To 1 Step -1 |
|||
Select UCase(Mid(roman, i, 1)) |
|||
Case "M" |
|||
n = 1000 |
|||
Case "D" |
|||
n = 500 |
|||
Case "C" |
|||
n = 100 |
|||
Case "L" |
|||
n = 50 |
|||
Case "X" |
|||
n = 10 |
|||
Case "V" |
|||
n = 5 |
|||
Case "I" |
|||
n = 1 |
|||
Default |
|||
n = 0 |
|||
EndSelect |
|||
If (n < lastval) |
|||
arabic - n |
|||
Else |
|||
arabic + n |
|||
EndIf |
|||
lastval = n |
|||
Next |
|||
ProcedureReturn arabic |
|||
EndProcedure |
|||
If OpenConsole() |
|||
PrintN(Str(romanDec("MCMXCIX"))) ;1999 |
|||
PrintN(Str(romanDec("MDCLXVI"))) ;1666 |
|||
PrintN(Str(romanDec("XXV"))) ;25 |
|||
PrintN(Str(romanDec("CMLIV"))) ;954 |
|||
PrintN(Str(romanDec("MMXI"))) ;2011 |
|||
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input() |
|||
CloseConsole() |
|||
EndIf</syntaxhighlight> |
|||
{{out}} |
|||
<pre>1999 |
|||
1666 |
|||
25 |
|||
954 |
|||
2011</pre> |
|||
==={{header|QBasic}}=== |
|||
<syntaxhighlight lang="qbasic">FUNCTION romToDec (roman$) |
|||
num = 0 |
|||
prenum = 0 |
|||
FOR i = LEN(roman$) TO 1 STEP -1 |
|||
x$ = MID$(roman$, i, 1) |
|||
n = 0 |
|||
IF x$ = "M" THEN n = 1000 |
|||
IF x$ = "D" THEN n = 500 |
|||
IF x$ = "C" THEN n = 100 |
|||
IF x$ = "L" THEN n = 50 |
|||
IF x$ = "X" THEN n = 10 |
|||
IF x$ = "V" THEN n = 5 |
|||
IF x$ = "I" THEN n = 1 |
|||
IF n < preNum THEN num = num - n ELSE num = num + n |
|||
preNum = n |
|||
NEXT i |
|||
romToDec = num |
|||
END FUNCTION |
|||
!Testing |
|||
PRINT "MCMXCIX = "; romToDec("MCMXCIX") '1999 |
|||
PRINT "MDCLXVI = "; romToDec("MDCLXVI") '1666 |
|||
PRINT "XXV = "; romToDec("XXV") '25 |
|||
PRINT "CMLIV = "; romToDec("CMLIV") '954 |
|||
PRINT "MMXI = "; romToDec("MMXI") '2011</syntaxhighlight> |
|||
==={{header|QB64}}=== |
|||
<syntaxhighlight lang="qb64">SCREEN _NEWIMAGE(400, 600, 32) |
|||
CLS |
|||
Main: |
|||
'------------------------------------------------ |
|||
' CALLS THE romToDec FUNCTION WITH THE ROMAN |
|||
' NUMERALS AND RETURNS ITS DECIMAL EQUIVELENT. |
|||
' |
|||
PRINT "ROMAN NUMERAL TO DECIMAL CONVERSION" |
|||
PRINT: PRINT |
|||
PRINT "MDCCIV = "; romToDec("MDCCIV") '1704 |
|||
PRINT "MCMXC = "; romToDec("MCMXC") '1990 |
|||
PRINT "MMVIII = "; romToDec("MMVIII") '2008 |
|||
PRINT "MDCLXVI = "; romToDec("MDCLXVI") '1666 |
|||
PRINT: PRINT |
|||
PRINT "Here are other solutions not from the TASK:" |
|||
PRINT "MCMXCIX = "; romToDec("MCMXCIX") '1999 |
|||
PRINT "XXV = "; romToDec("XXV") '25 |
|||
PRINT "CMLIV = "; romToDec("CMLIV") '954 |
|||
PRINT "MMXI = "; romToDec("MMXI") '2011 |
|||
PRINT "MMIIIX = "; romToDec("MMIIIX") '2011 |
|||
PRINT: PRINT |
|||
PRINT "2011 can be written either as MMXI or MMIIIX" |
|||
PRINT "With the IX = 9, MMIIIX is also 2011." |
|||
PRINT "2011 IS CORRECT (MM=2000 + II = 2 + IX = 9)" |
|||
END |
|||
FUNCTION romToDec (roman AS STRING) |
|||
'------------------------------------------------------ |
|||
' FUNCTION THAT CONVERTS ANY ROMAN NUMERAL TO A DECIMAL |
|||
' |
|||
prenum = 0: num = 0 |
|||
LN = LEN(roman) |
|||
FOR i = LN TO 1 STEP -1 |
|||
x$ = MID$(roman, i, 1) |
|||
n = 1000 |
|||
SELECT CASE x$ |
|||
CASE "M": n = n / 1 |
|||
CASE "D": n = n / 2 |
|||
CASE "C": n = n / 10 |
|||
CASE "L": n = n / 20 |
|||
CASE "X": n = n / 100 |
|||
CASE "V": n = n / 200 |
|||
CASE "I": n = n / n |
|||
CASE ELSE: n = 0 |
|||
END SELECT |
|||
IF n < prenum THEN num = num - n ELSE num = num + n |
|||
prenum = n |
|||
NEXT i |
|||
romToDec = num |
|||
END FUNCTION</syntaxhighlight> |
|||
==={{header|Run BASIC}}=== |
|||
<syntaxhighlight lang="runbasic">print "MCMXCIX = "; romToDec( "MCMXCIX") '1999 |
|||
print "MDCLXVI = "; romToDec( "MDCLXVI") '1666 |
|||
print "XXV = "; romToDec( "XXV") '25 |
|||
print "CMLIV = "; romToDec( "CMLIV") '954 |
|||
print "MMXI = "; romToDec( "MMXI") '2011 |
|||
function romToDec(roman$) |
|||
for i = len(roman$) to 1 step -1 |
|||
x$ = mid$(roman$, i, 1) |
|||
n = 0 |
|||
if x$ = "M" then n = 1000 |
|||
if x$ = "D" then n = 500 |
|||
if x$ = "C" then n = 100 |
|||
if x$ = "L" then n = 50 |
|||
if x$ = "X" then n = 10 |
|||
if x$ = "V" then n = 5 |
|||
if x$ = "I" then n = 1 |
|||
if n < preNum then num = num - n else num = num + n |
|||
preNum = n |
|||
next |
|||
romToDec =num |
|||
end function</syntaxhighlight> |
|||
==={{header|TechBASIC}}=== |
|||
<syntaxhighlight lang="techbasic">Main: |
|||
!------------------------------------------------ |
|||
! CALLS THE romToDec FUNCTION WITH THE ROMAN |
|||
! NUMERALS AND RETURNS ITS DECIMAL EQUIVELENT. |
|||
! |
|||
PRINT "MCMXC = "; romToDec("MCMXC") !1990 |
|||
PRINT "MMVIII = "; romToDec("MMVIII") !2008 |
|||
PRINT "MDCLXVI = "; romToDec("MDCLXVI") !1666 |
|||
PRINT:PRINT |
|||
PRINT "Here are other solutions not from the TASK:" |
|||
PRINT "MCMXCIX = "; romToDec("MCMXCIX") !1999 |
|||
PRINT "XXV = "; romToDec("XXV") !25 |
|||
PRINT "CMLIV = "; romToDec("CMLIV") !954 |
|||
PRINT "MMXI = "; romToDec("MMXI") !2011 |
|||
PRINT:PRINT |
|||
PRINT "Without error checking, this also is 2011, but is wrong" |
|||
PRINT "MMIIIX = "; romToDec("MMIIIX") !INVAID, 2011 |
|||
STOP |
|||
FUNCTION romToDec(roman AS STRING) AS INTEGER |
|||
!------------------------------------------------------ |
|||
! FUNCTION THAT CONVERTS ANY ROMAN NUMERAL TO A DECIMAL |
|||
! |
|||
prenum=0!num=0 |
|||
ln=LEN(roman) |
|||
FOR i=ln TO 1 STEP -1 |
|||
x$=MID(roman,i,1) |
|||
n=1000 |
|||
SELECT CASE x$ |
|||
CASE "M":n=n/1 |
|||
CASE "D":n=n/2 |
|||
CASE "C":n=n/10 |
|||
CASE "L":n=n/20 |
|||
CASE "X":n=n/100 |
|||
CASE "V":n=n/200 |
|||
CASE "I":n=n/n |
|||
CASE ELSE:n=0 |
|||
END SELECT |
|||
IF n < preNum THEN num=num-n ELSE num=num+n |
|||
preNum=n |
|||
next i |
|||
romToDec=num |
|||
END FUNCTION</syntaxhighlight> |
|||
{{out}} |
|||
<pre>MCMXC = 1990 |
|||
MMVIII = 2008 |
|||
MDCLXVI = 1666 |
|||
Here are other solutions not from the TASK: |
|||
MCMXCIX = 1999 |
|||
XXV = 25 |
|||
CMLIV = 954 |
|||
MMXI = 2011 |
|||
Without error checking, this also is 2011, but is wrong |
|||
MMIIIX = 2011</pre> |
|||
==={{header|TI-83 BASIC}}=== |
|||
Using the Rom‣Dec function "real(21," from [http://www.detachedsolutions.com/omnicalc/ Omnicalc]. |
|||
<syntaxhighlight lang="ti83b">PROGRAM:ROM2DEC |
|||
:Input Str1 |
|||
:Disp real(21,Str1)</syntaxhighlight> |
|||
Using TI-83 BASIC |
|||
<syntaxhighlight lang="ti83b">PROGRAM:ROM2DEC |
|||
:Input "ROMAN:",Str1 |
|||
:{1000,500,100,50,10,5,1}➞L1 |
|||
:0➞P |
|||
:0➞Y |
|||
:For(I,length(Str1),1,-1) |
|||
:inString("MDCLXVI",sub(Str1,I,1))➞X |
|||
:If X≤0:Then |
|||
:Disp "BAD NUMBER" |
|||
:Stop |
|||
:End |
|||
:L1(x)➞N |
|||
:If N<P:Then |
|||
:Y–N➞Y |
|||
:Else |
|||
:Y+N➞Y |
|||
:End |
|||
:N➞P |
|||
:End |
|||
:Disp Y</syntaxhighlight> |
|||
==={{header|True BASIC}}=== |
|||
<syntaxhighlight lang="qbasic">FUNCTION romtodec(roman$) |
|||
LET num = 0 |
|||
LET prenum = 0 |
|||
FOR i = len(roman$) to 1 step -1 |
|||
LET x$ = (roman$)[i:i+1-1] |
|||
LET n = 0 |
|||
IF x$ = "M" then LET n = 1000 |
|||
IF x$ = "D" then LET n = 500 |
|||
IF x$ = "C" then LET n = 100 |
|||
IF x$ = "L" then LET n = 50 |
|||
IF x$ = "X" then LET n = 10 |
|||
IF x$ = "V" then LET n = 5 |
|||
IF x$ = "I" then LET n = 1 |
|||
IF n < prenum then LET num = num-n else LET num = num+n |
|||
LET prenum = n |
|||
NEXT i |
|||
LET romtodec = num |
|||
END FUNCTION |
|||
!Testing |
|||
PRINT "MCMXCIX = "; romToDec("MCMXCIX") !1999 |
|||
PRINT "MDCLXVI = "; romToDec("MDCLXVI") !1666 |
|||
PRINT "XXV = "; romToDec("XXV") !25 |
|||
PRINT "CMLIV = "; romToDec("CMLIV") !954 |
|||
PRINT "MMXI = "; romToDec("MMXI") !2011 |
|||
END</syntaxhighlight> |
|||
==={{header|Yabasic}}=== |
|||
<syntaxhighlight lang="yabasic">romans$ = "MDCLXVI" |
|||
decmls$ = "1000,500,100,50,10,5,1" |
|||
sub romanDec(s$) |
|||
local i, n, prev, res, decmls$(1) |
|||
n = token(decmls$, decmls$(), ",") |
|||
for i = len(s$) to 1 step -1 |
|||
n = val(decmls$(instr(romans$, mid$(s$, i, 1)))) |
|||
if n < prev n = 0 - n |
|||
res = res + n |
|||
prev = n |
|||
next i |
|||
return res |
|||
end sub |
|||
? romanDec("MCMXCIX") // 1999 |
|||
? romanDec("MDCLXVI") // 1666 |
|||
? romanDec("XXV") // 25 |
|||
? romanDec("XIX") // 19 |
|||
? romanDec("XI") // 11 |
|||
? romanDec("CMLIV") // 954 |
|||
? romanDec("MMXI") // 2011 |
|||
? romanDec("CD") // 400 |
|||
? romanDec("MCMXC") // 1990 |
|||
? romanDec("MMVIII") // 2008 |
|||
? romanDec("MMIX") // 2009 |
|||
? romanDec("MDCLXVI") // 1666 |
|||
? romanDec("MMMDCCCLXXXVIII") // 3888</syntaxhighlight> |
|||
=={{header|Arturo}}== |
|||
<syntaxhighlight lang="rebol">syms: #[ M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1 ] |
<syntaxhighlight lang="rebol">syms: #[ M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1 ] |
||
Line 1,106: | Line 1,722: | ||
loop ["MCMXC" "MMVIII" "MDCLXVI"] 'r -> print [r "->" fromRoman r]</syntaxhighlight> |
loop ["MCMXC" "MMVIII" "MDCLXVI"] 'r -> print [r "->" fromRoman r]</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>MCMXC -> 1990 |
<pre>MCMXC -> 1990 |
||
MMVIII -> 2008 |
MMVIII -> 2008 |
||
Line 1,161: | Line 1,775: | ||
}</syntaxhighlight> |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre>MCMXC = 1990 |
||
MCMXC = 1990 |
|||
MMVIII = 2008 |
MMVIII = 2008 |
||
MDCLXVI = 1666 |
MDCLXVI = 1666</pre> |
||
</pre> |
|||
=={{header|BASIC256}}== |
|||
<syntaxhighlight lang="freebasic">function romToDec (roman$) |
|||
num = 0 |
|||
prenum = 0 |
|||
for i = length(roman$) to 1 step -1 |
|||
x$ = mid(roman$, i, 1) |
|||
n = 0 |
|||
if x$ = "M" then n = 1000 |
|||
if x$ = "D" then n = 500 |
|||
if x$ = "C" then n = 100 |
|||
if x$ = "L" then n = 50 |
|||
if x$ = "X" then n = 10 |
|||
if x$ = "V" then n = 5 |
|||
if x$ = "I" then n = 1 |
|||
if n < preNum then num -= n else num += n |
|||
preNum = n |
|||
next i |
|||
return num |
|||
end function |
|||
#Testing |
|||
print "MCMXCIX = "; romToDec("MCMXCIX") #1999 |
|||
print "MDCLXVI = "; romToDec("MDCLXVI") #1666 |
|||
print "XXV = "; romToDec("XXV") #25 |
|||
print "CMLIV = "; romToDec("CMLIV") #954 |
|||
print "MMXI = "; romToDec("MMXI") #2011</syntaxhighlight> |
|||
=={{header|Batch File}}== |
=={{header|Batch File}}== |
||
Line 1,251: | Line 1,832: | ||
CDXLIV = 444 |
CDXLIV = 444 |
||
XCIX = 99</pre> |
XCIX = 99</pre> |
||
=={{header|BBC BASIC}}== |
|||
<syntaxhighlight lang="bbcbasic"> PRINT "MCMXCIX", FNromandecode("MCMXCIX") |
|||
PRINT "MMXII", FNromandecode("MMXII") |
|||
PRINT "MDCLXVI", FNromandecode("MDCLXVI") |
|||
PRINT "MMMDCCCLXXXVIII", FNromandecode("MMMDCCCLXXXVIII") |
|||
END |
|||
DEF FNromandecode(roman$) |
|||
LOCAL i%, j%, p%, n%, r%() |
|||
DIM r%(7) : r%() = 0,1,5,10,50,100,500,1000 |
|||
FOR i% = LEN(roman$) TO 1 STEP -1 |
|||
j% = INSTR("IVXLCDM", MID$(roman$,i%,1)) |
|||
IF j%=0 ERROR 100, "Invalid character" |
|||
IF j%>=p% n% += r%(j%) ELSE n% -= r%(j%) |
|||
p% = j% |
|||
NEXT |
|||
= n%</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
MCMXCIX 1999 |
|||
MMXII 2012 |
|||
MDCLXVI 1666 |
|||
MMMDCCCLXXXVIII 3888 |
|||
</pre> |
|||
=={{header|BCPL}}== |
=={{header|BCPL}}== |
||
Line 2,677: | Line 3,233: | ||
{{out}} |
{{out}} |
||
<pre> 1990 2008 1666</pre> |
<pre> 1990 2008 1666</pre> |
||
=={{header|FreeBASIC}}== |
|||
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64 |
|||
Function romanDecode(roman As Const String) As Integer |
|||
If roman = "" Then Return 0 '' zero denotes invalid roman number |
|||
Dim roman1(0 To 2) As String = {"MMM", "MM", "M"} |
|||
Dim roman2(0 To 8) As String = {"CM", "DCCC", "DCC", "DC", "D", "CD", "CCC", "CC", "C"} |
|||
Dim roman3(0 To 8) As String = {"XC", "LXXX", "LXX", "LX", "L", "XL", "XXX", "XX", "X"} |
|||
Dim roman4(0 To 8) As String = {"IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I"} |
|||
Dim As Integer i, value = 0, length = 0 |
|||
Dim r As String = UCase(roman) |
|||
For i = 0 To 2 |
|||
If Left(r, Len(roman1(i))) = roman1(i) Then |
|||
value += 1000 * (3 - i) |
|||
length = Len(roman1(i)) |
|||
r = Mid(r, length + 1) |
|||
length = 0 |
|||
Exit For |
|||
End If |
|||
Next |
|||
For i = 0 To 8 |
|||
If Left(r, Len(roman2(i))) = roman2(i) Then |
|||
value += 100 * (9 - i) |
|||
length = Len(roman2(i)) |
|||
r = Mid(r, length + 1) |
|||
length = 0 |
|||
Exit For |
|||
End If |
|||
Next |
|||
For i = 0 To 8 |
|||
If Left(r, Len(roman3(i))) = roman3(i) Then |
|||
value += 10 * (9 - i) |
|||
length = Len(roman3(i)) |
|||
r = Mid(r, length + 1) |
|||
length = 0 |
|||
Exit For |
|||
End If |
|||
Next |
|||
For i = 0 To 8 |
|||
If Left(r, Len(roman4(i))) = roman4(i) Then |
|||
value += 9 - i |
|||
length = Len(roman4(i)) |
|||
Exit For |
|||
End If |
|||
Next |
|||
' Can't be a valid roman number if there are any characters left |
|||
If Len(r) > length Then Return 0 |
|||
Return value |
|||
End Function |
|||
Dim a(2) As String = {"MCMXC", "MMVIII" , "MDCLXVI"} |
|||
For i As Integer = 0 To 2 |
|||
Print a(i); Tab(8); " =>"; romanDecode(a(i)) |
|||
Next |
|||
Print |
|||
Print "Press any key to quit" |
|||
Sleep</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
MCMXC => 1990 |
|||
MMVIII => 2008 |
|||
MDCLXVI => 1666 |
|||
</pre> |
|||
=={{header|FutureBasic}}== |
|||
<syntaxhighlight lang="futurebasic">window 1 |
|||
local fn RomantoDecimal( roman as CFStringRef ) as long |
|||
long i, n, preNum = 0, num = 0 |
|||
for i = len(roman) - 1 to 0 step -1 |
|||
n = 0 |
|||
select ( fn StringCharacterAtIndex( roman, i ) ) |
|||
case _"M" : n = 1000 |
|||
case _"D" : n = 500 |
|||
case _"C" : n = 100 |
|||
case _"L" : n = 50 |
|||
case _"X" : n = 10 |
|||
case _"V" : n = 5 |
|||
case _"I" : n = 1 |
|||
end select |
|||
if ( n < preNum ) then num = num - n else num = num + n |
|||
preNum = n |
|||
next |
|||
end fn = num |
|||
print @" MCMXC = "; fn RomantoDecimal( @"MCMXC" ) |
|||
print @" MMVIII = "; fn RomantoDecimal( @"MMVIII" ) |
|||
print @" MMXVI = "; fn RomantoDecimal( @"MMXVI" ) |
|||
print @"MDCLXVI = "; fn RomantoDecimal( @"MDCLXVI" ) |
|||
print @" MCMXIV = "; fn RomantoDecimal( @"MCMXIV" ) |
|||
print @" DXIII = "; fn RomantoDecimal( @"DXIII" ) |
|||
print @" M = "; fn RomantoDecimal( @"M" ) |
|||
print @" DXIII = "; fn RomantoDecimal( @"DXIII" ) |
|||
print @" XXXIII = "; fn RomantoDecimal( @"XXXIII" ) |
|||
HandleEvents</syntaxhighlight> |
|||
Output: |
|||
<pre> |
|||
MCMXC = 1990 |
|||
MMVIII = 2008 |
|||
MMXVI = 2016 |
|||
MDCLXVI = 1666 |
|||
MCMXIV = 1914 |
|||
DXIII = 513 |
|||
M = 1000 |
|||
DXIII = 513 |
|||
XXXIII = 33 |
|||
</pre> |
|||
=={{header|Gambas}}== |
|||
<syntaxhighlight lang="gambas">'This code will create a GUI Form and Objects and carry out the Roman Numeral convertion as you type |
|||
'The input is case insensitive |
|||
'A basic check for invalid charaters is made |
|||
hTextBox As TextBox 'To allow the creation of a TextBox |
|||
hValueBox As ValueBox 'To allow the creation of a ValueBox |
|||
Public Sub Form_Open() 'Form opens.. |
|||
SetUpForm 'Go to the SetUpForm Routine |
|||
hTextBox.text = "MCMXC" 'Put a Roman numeral in the TextBox |
|||
End |
|||
Public Sub TextBoxInput_Change() 'Each time the TextBox text changes.. |
|||
Dim cRomanN As Collection = ["M": 1000, "D": 500, "C": 100, "L": 50, "X": 10, "V": 5, "I": 1] 'Collection of nemerals e.g 'M' = 1000 |
|||
Dim cMinus As Collection = ["IV": -2, "IX": -2, "XL": -20, "XC": - 20, "CD": -200, "CM": -200] 'Collection of the 'one less than' numbers e.g. 'IV' = 4 |
|||
Dim sClean, sTemp As String 'Various string variables |
|||
Dim siCount As Short 'Counter |
|||
Dim iTotal As Integer 'Stores the total of the calculation |
|||
hTextBox.Text = UCase(hTextBox.Text) 'Make any text in the TextBox upper case |
|||
For siCount = 1 To Len(hTextBox.Text) 'Loop through each character in the TextBox |
|||
If InStr("MDCLXVI", Mid(hTextBox.Text, siCount, 1)) Then 'If a Roman numeral exists then.. |
|||
sClean &= Mid(hTextBox.Text, siCount, 1) 'Put it in 'sClean' (Stops input of non Roman numerals) |
|||
End If |
|||
Next |
|||
hTextBox.Text = sClean 'Put the now clean text in the TextBox |
|||
For siCount = 1 To Len(hTextBox.Text) 'Loop through each character in the TextBox |
|||
iTotal += cRomanN[Mid(hTextBox.Text, siCount, 1)] 'Total up all the characters, note 'IX' will = 11 not 9 |
|||
Next |
|||
For Each sTemp In cMinus 'Loop through each item in the cMinus Collection |
|||
If InStr(sClean, cMinus.Key) > 0 Then iTotal += Val(sTemp) 'If a 'Minus' value is in the string e.g. 'IX' which has been calculated at 11 subtract 2 = 9 |
|||
Next |
|||
hValueBox.text = iTotal 'Display the total |
|||
End |
|||
Public Sub SetUpForm() 'Create the Objects for the Form |
|||
Dim hLabel1, hLabel2 As Label 'For 2 Labels |
|||
Me.height = 150 'Form Height |
|||
Me.Width = 300 'Form Width |
|||
Me.Padding = 20 'Form padding (border) |
|||
Me.Text = "Roman Numeral converter" 'Text in Form header |
|||
Me.Arrangement = Arrange.Vertical 'Form arrangement |
|||
hLabel1 = New Label(Me) 'Create a Label |
|||
hLabel1.Height = 21 'Label Height |
|||
hLabel1.expand = True 'Expand the Label |
|||
hLabel1.Text = "Enter a Roman numeral" 'Put text in the Label |
|||
hTextBox = New TextBox(Me) As "TextBoxInput" 'Set up a TextBox with an Event Label |
|||
hTextBox.Height = 21 'TextBox height |
|||
hTextBox.expand = True 'Expand the TextBox |
|||
hLabel2 = New Label(Me) 'Create a Label |
|||
hLabel2.Height = 21 'Label Height |
|||
hLabel2.expand = True 'Expand the Label |
|||
hLabel2.Text = "The decimal equivelent is: -" 'Put text in the Label |
|||
hValueBox = New ValueBox(Me) 'Create a ValueBox |
|||
hValueBox.Height = 21 'ValuBox Height |
|||
hValueBox.expand = True 'Expand the ValueBox |
|||
hValueBox.ReadOnly = True 'Set ValueBox to Read Only |
|||
End</syntaxhighlight> |
|||
'''[http://www.cogier.com/gambas/Roman%20Numeral%20converter.png Click here for image of running code]''' |
|||
=={{header|Go}}== |
=={{header|Go}}== |
||
Line 4,115: | Line 4,477: | ||
br |
br |
||
'MDCLXVI as integer is '+decodeRoman('MDCLXVI')</syntaxhighlight> |
'MDCLXVI as integer is '+decodeRoman('MDCLXVI')</syntaxhighlight> |
||
=={{header|Liberty BASIC}}== |
|||
As Fortran & PureBasic. |
|||
<syntaxhighlight lang="lb"> print "MCMXCIX = "; romanDec( "MCMXCIX") '1999 |
|||
print "MDCLXVI = "; romanDec( "MDCLXVI") '1666 |
|||
print "XXV = "; romanDec( "XXV") '25 |
|||
print "CMLIV = "; romanDec( "CMLIV") '954 |
|||
print "MMXI = "; romanDec( "MMXI") '2011 |
|||
end |
|||
function romanDec( roman$) |
|||
arabic =0 |
|||
lastval =0 |
|||
for i = len( roman$) to 1 step -1 |
|||
select case upper$( mid$( roman$, i, 1)) |
|||
case "M" |
|||
n = 1000 |
|||
case "D" |
|||
n = 500 |
|||
case "C" |
|||
n = 100 |
|||
case "L" |
|||
n = 50 |
|||
case "X" |
|||
n = 10 |
|||
case "V" |
|||
n = 5 |
|||
case "I" |
|||
n = 1 |
|||
case else |
|||
n = 0 |
|||
end select |
|||
if n <lastval then |
|||
arabic =arabic -n |
|||
else |
|||
arabic =arabic +n |
|||
end if |
|||
lastval =n |
|||
next |
|||
romanDec =arabic |
|||
end function</syntaxhighlight> |
|||
<pre> |
|||
MCMXCIX = 1999 |
|||
MDCLXVI = 1666 |
|||
XXV = 25 |
|||
CMLIV = 954 |
|||
MMXI = 2011 |
|||
</pre> |
|||
=={{header|LiveScript}}== |
=={{header|LiveScript}}== |
||
Line 5,462: | Line 5,771: | ||
The respective goal succeeds. |
The respective goal succeeds. |
||
Therefore the test passes. |
Therefore the test passes. |
||
=={{header|PureBasic}}== |
|||
<syntaxhighlight lang="purebasic">Procedure romanDec(roman.s) |
|||
Protected i, n, lastval, arabic |
|||
For i = Len(roman) To 1 Step -1 |
|||
Select UCase(Mid(roman, i, 1)) |
|||
Case "M" |
|||
n = 1000 |
|||
Case "D" |
|||
n = 500 |
|||
Case "C" |
|||
n = 100 |
|||
Case "L" |
|||
n = 50 |
|||
Case "X" |
|||
n = 10 |
|||
Case "V" |
|||
n = 5 |
|||
Case "I" |
|||
n = 1 |
|||
Default |
|||
n = 0 |
|||
EndSelect |
|||
If (n < lastval) |
|||
arabic - n |
|||
Else |
|||
arabic + n |
|||
EndIf |
|||
lastval = n |
|||
Next |
|||
ProcedureReturn arabic |
|||
EndProcedure |
|||
If OpenConsole() |
|||
PrintN(Str(romanDec("MCMXCIX"))) ;1999 |
|||
PrintN(Str(romanDec("MDCLXVI"))) ;1666 |
|||
PrintN(Str(romanDec("XXV"))) ;25 |
|||
PrintN(Str(romanDec("CMLIV"))) ;954 |
|||
PrintN(Str(romanDec("MMXI"))) ;2011 |
|||
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input() |
|||
CloseConsole() |
|||
EndIf</syntaxhighlight> |
|||
{{out}} |
|||
<pre>1999 |
|||
1666 |
|||
25 |
|||
954 |
|||
2011</pre> |
|||
=={{header|Python}}== |
=={{header|Python}}== |
||
Line 5,688: | Line 5,946: | ||
MMXVIII -> 2018 |
MMXVIII -> 2018 |
||
MMZZIII -> (Contains unknown character)</pre> |
MMZZIII -> (Contains unknown character)</pre> |
||
=={{header|QBasic}}== |
|||
<syntaxhighlight lang="qbasic">FUNCTION romToDec (roman$) |
|||
num = 0 |
|||
prenum = 0 |
|||
FOR i = LEN(roman$) TO 1 STEP -1 |
|||
x$ = MID$(roman$, i, 1) |
|||
n = 0 |
|||
IF x$ = "M" THEN n = 1000 |
|||
IF x$ = "D" THEN n = 500 |
|||
IF x$ = "C" THEN n = 100 |
|||
IF x$ = "L" THEN n = 50 |
|||
IF x$ = "X" THEN n = 10 |
|||
IF x$ = "V" THEN n = 5 |
|||
IF x$ = "I" THEN n = 1 |
|||
IF n < preNum THEN num = num - n ELSE num = num + n |
|||
preNum = n |
|||
NEXT i |
|||
romToDec = num |
|||
END FUNCTION |
|||
!Testing |
|||
PRINT "MCMXCIX = "; romToDec("MCMXCIX") '1999 |
|||
PRINT "MDCLXVI = "; romToDec("MDCLXVI") '1666 |
|||
PRINT "XXV = "; romToDec("XXV") '25 |
|||
PRINT "CMLIV = "; romToDec("CMLIV") '954 |
|||
PRINT "MMXI = "; romToDec("MMXI") '2011</syntaxhighlight> |
|||
=={{header|Quackery}}== |
=={{header|Quackery}}== |
||
<syntaxhighlight lang="quackery"> [ 2dup < |
<syntaxhighlight lang="quackery"> [ 2dup < |
||
if |
if |
||
Line 5,751: | Line 5,979: | ||
dup echo$ say " = " ->arabic echo cr |
dup echo$ say " = " ->arabic echo cr |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
{{Out}} |
{{Out}} |
||
<pre> MCMXC = 1990 |
<pre> MCMXC = 1990 |
||
MMVIII = 2008 |
MMVIII = 2008 |
||
Line 5,760: | Line 5,986: | ||
I MIX VIVID MILD MIMIC = 3063</pre> |
I MIX VIVID MILD MIMIC = 3063</pre> |
||
=={{header|QB64}}== |
|||
<syntaxhighlight lang="qb64"> |
|||
SCREEN _NEWIMAGE(400, 600, 32) |
|||
CLS |
|||
Main: |
|||
'------------------------------------------------ |
|||
' CALLS THE romToDec FUNCTION WITH THE ROMAN |
|||
' NUMERALS AND RETURNS ITS DECIMAL EQUIVELENT. |
|||
' |
|||
PRINT "ROMAN NUMERAL TO DECIMAL CONVERSION" |
|||
PRINT: PRINT |
|||
PRINT "MDCCIV = "; romToDec("MDCCIV") '1704 |
|||
PRINT "MCMXC = "; romToDec("MCMXC") '1990 |
|||
PRINT "MMVIII = "; romToDec("MMVIII") '2008 |
|||
PRINT "MDCLXVI = "; romToDec("MDCLXVI") '1666 |
|||
PRINT: PRINT |
|||
PRINT "Here are other solutions not from the TASK:" |
|||
PRINT "MCMXCIX = "; romToDec("MCMXCIX") '1999 |
|||
PRINT "XXV = "; romToDec("XXV") '25 |
|||
PRINT "CMLIV = "; romToDec("CMLIV") '954 |
|||
PRINT "MMXI = "; romToDec("MMXI") '2011 |
|||
PRINT "MMIIIX = "; romToDec("MMIIIX") '2011 |
|||
PRINT: PRINT |
|||
PRINT "2011 can be written either as MMXI or MMIIIX" |
|||
PRINT "With the IX = 9, MMIIIX is also 2011." |
|||
PRINT "2011 IS CORRECT (MM=2000 + II = 2 + IX = 9)" |
|||
END |
|||
FUNCTION romToDec (roman AS STRING) |
|||
'------------------------------------------------------ |
|||
' FUNCTION THAT CONVERTS ANY ROMAN NUMERAL TO A DECIMAL |
|||
' |
|||
prenum = 0: num = 0 |
|||
LN = LEN(roman) |
|||
FOR i = LN TO 1 STEP -1 |
|||
x$ = MID$(roman, i, 1) |
|||
n = 1000 |
|||
SELECT CASE x$ |
|||
CASE "M": n = n / 1 |
|||
CASE "D": n = n / 2 |
|||
CASE "C": n = n / 10 |
|||
CASE "L": n = n / 20 |
|||
CASE "X": n = n / 100 |
|||
CASE "V": n = n / 200 |
|||
CASE "I": n = n / n |
|||
CASE ELSE: n = 0 |
|||
END SELECT |
|||
IF n < prenum THEN num = num - n ELSE num = num + n |
|||
prenum = n |
|||
NEXT i |
|||
romToDec = num |
|||
END FUNCTION |
|||
</syntaxhighlight> |
|||
=={{header|R}}== |
=={{header|R}}== |
||
===version 1=== |
===version 1=== |
||
Modelled along the lines of other decode routines on this page, but using a vectorised approach |
Modelled along the lines of other decode routines on this page, but using a vectorised approach |
||
Line 6,198: | Line 6,361: | ||
MDCLXVI : 1666 |
MDCLXVI : 1666 |
||
</pre> |
</pre> |
||
=={{header|Run BASIC}}== |
|||
<syntaxhighlight lang="runbasic">print "MCMXCIX = "; romToDec( "MCMXCIX") '1999 |
|||
print "MDCLXVI = "; romToDec( "MDCLXVI") '1666 |
|||
print "XXV = "; romToDec( "XXV") '25 |
|||
print "CMLIV = "; romToDec( "CMLIV") '954 |
|||
print "MMXI = "; romToDec( "MMXI") '2011 |
|||
function romToDec(roman$) |
|||
for i = len(roman$) to 1 step -1 |
|||
x$ = mid$(roman$, i, 1) |
|||
n = 0 |
|||
if x$ = "M" then n = 1000 |
|||
if x$ = "D" then n = 500 |
|||
if x$ = "C" then n = 100 |
|||
if x$ = "L" then n = 50 |
|||
if x$ = "X" then n = 10 |
|||
if x$ = "V" then n = 5 |
|||
if x$ = "I" then n = 1 |
|||
if n < preNum then num = num - n else num = num + n |
|||
preNum = n |
|||
next |
|||
romToDec =num |
|||
end function</syntaxhighlight> |
|||
=={{header|Rust}}== |
=={{header|Rust}}== |
||
Line 6,692: | Line 6,829: | ||
MDCLXVI -> 1666 |
MDCLXVI -> 1666 |
||
MMVIII -> 2008</pre> |
MMVIII -> 2008</pre> |
||
=={{header|TechBASIC}}== |
|||
<syntaxhighlight lang="techbasic"> |
|||
Main: |
|||
!------------------------------------------------ |
|||
! CALLS THE romToDec FUNCTION WITH THE ROMAN |
|||
! NUMERALS AND RETURNS ITS DECIMAL EQUIVELENT. |
|||
! |
|||
PRINT "MCMXC = "; romToDec("MCMXC") !1990 |
|||
PRINT "MMVIII = "; romToDec("MMVIII") !2008 |
|||
PRINT "MDCLXVI = "; romToDec("MDCLXVI") !1666 |
|||
PRINT:PRINT |
|||
PRINT "Here are other solutions not from the TASK:" |
|||
PRINT "MCMXCIX = "; romToDec("MCMXCIX") !1999 |
|||
PRINT "XXV = "; romToDec("XXV") !25 |
|||
PRINT "CMLIV = "; romToDec("CMLIV") !954 |
|||
PRINT "MMXI = "; romToDec("MMXI") !2011 |
|||
PRINT:PRINT |
|||
PRINT "Without error checking, this also is 2011, but is wrong" |
|||
PRINT "MMIIIX = "; romToDec("MMIIIX") !INVAID, 2011 |
|||
STOP |
|||
FUNCTION romToDec(roman AS STRING) AS INTEGER |
|||
!------------------------------------------------------ |
|||
! FUNCTION THAT CONVERTS ANY ROMAN NUMERAL TO A DECIMAL |
|||
! |
|||
prenum=0!num=0 |
|||
ln=LEN(roman) |
|||
FOR i=ln TO 1 STEP -1 |
|||
x$=MID(roman,i,1) |
|||
n=1000 |
|||
SELECT CASE x$ |
|||
CASE "M":n=n/1 |
|||
CASE "D":n=n/2 |
|||
CASE "C":n=n/10 |
|||
CASE "L":n=n/20 |
|||
CASE "X":n=n/100 |
|||
CASE "V":n=n/200 |
|||
CASE "I":n=n/n |
|||
CASE ELSE:n=0 |
|||
END SELECT |
|||
IF n < preNum THEN num=num-n ELSE num=num+n |
|||
preNum=n |
|||
next i |
|||
romToDec=num |
|||
END FUNCTION |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
MCMXC = 1990 |
|||
MMVIII = 2008 |
|||
MDCLXVI = 1666 |
|||
Here are other solutions not from the TASK: |
|||
MCMXCIX = 1999 |
|||
XXV = 25 |
|||
CMLIV = 954 |
|||
MMXI = 2011 |
|||
Without error checking, this also is 2011, but is wrong |
|||
MMIIIX = 2011 |
|||
</pre> |
|||
=={{header|TI-83 BASIC}}== |
|||
Using the Rom‣Dec function "real(21," from [http://www.detachedsolutions.com/omnicalc/ Omnicalc]. |
|||
<syntaxhighlight lang="ti83b">PROGRAM:ROM2DEC |
|||
:Input Str1 |
|||
:Disp real(21,Str1)</syntaxhighlight> |
|||
Using TI-83 BASIC |
|||
<syntaxhighlight lang="ti83b">PROGRAM:ROM2DEC |
|||
:Input "ROMAN:",Str1 |
|||
:{1000,500,100,50,10,5,1}➞L1 |
|||
:0➞P |
|||
:0➞Y |
|||
:For(I,length(Str1),1,-1) |
|||
:inString("MDCLXVI",sub(Str1,I,1))➞X |
|||
:If X≤0:Then |
|||
:Disp "BAD NUMBER" |
|||
:Stop |
|||
:End |
|||
:L1(x)➞N |
|||
:If N<P:Then |
|||
:Y–N➞Y |
|||
:Else |
|||
:Y+N➞Y |
|||
:End |
|||
:N➞P |
|||
:End |
|||
:Disp Y</syntaxhighlight> |
|||
=={{header|TMG}}== |
=={{header|TMG}}== |
||
Line 6,869: | Line 6,907: | ||
error: IM |
error: IM |
||
error: XXCIII</pre> |
error: XXCIII</pre> |
||
=={{header|True BASIC}}== |
|||
<syntaxhighlight lang="qbasic">FUNCTION romtodec(roman$) |
|||
LET num = 0 |
|||
LET prenum = 0 |
|||
FOR i = len(roman$) to 1 step -1 |
|||
LET x$ = (roman$)[i:i+1-1] |
|||
LET n = 0 |
|||
IF x$ = "M" then LET n = 1000 |
|||
IF x$ = "D" then LET n = 500 |
|||
IF x$ = "C" then LET n = 100 |
|||
IF x$ = "L" then LET n = 50 |
|||
IF x$ = "X" then LET n = 10 |
|||
IF x$ = "V" then LET n = 5 |
|||
IF x$ = "I" then LET n = 1 |
|||
IF n < prenum then LET num = num-n else LET num = num+n |
|||
LET prenum = n |
|||
NEXT i |
|||
LET romtodec = num |
|||
END FUNCTION |
|||
!Testing |
|||
PRINT "MCMXCIX = "; romToDec("MCMXCIX") !1999 |
|||
PRINT "MDCLXVI = "; romToDec("MDCLXVI") !1666 |
|||
PRINT "XXV = "; romToDec("XXV") !25 |
|||
PRINT "CMLIV = "; romToDec("CMLIV") !954 |
|||
PRINT "MMXI = "; romToDec("MMXI") !2011 |
|||
END</syntaxhighlight> |
|||
=={{header|TUSCRIPT}}== |
=={{header|TUSCRIPT}}== |
||
Line 7,256: | Line 7,265: | ||
) |
) |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
=={{header|Yabasic}}== |
|||
<syntaxhighlight lang="yabasic">romans$ = "MDCLXVI" |
|||
decmls$ = "1000,500,100,50,10,5,1" |
|||
sub romanDec(s$) |
|||
local i, n, prev, res, decmls$(1) |
|||
n = token(decmls$, decmls$(), ",") |
|||
for i = len(s$) to 1 step -1 |
|||
n = val(decmls$(instr(romans$, mid$(s$, i, 1)))) |
|||
if n < prev n = 0 - n |
|||
res = res + n |
|||
prev = n |
|||
next i |
|||
return res |
|||
end sub |
|||
? romanDec("MCMXCIX") // 1999 |
|||
? romanDec("MDCLXVI") // 1666 |
|||
? romanDec("XXV") // 25 |
|||
? romanDec("XIX") // 19 |
|||
? romanDec("XI") // 11 |
|||
? romanDec("CMLIV") // 954 |
|||
? romanDec("MMXI") // 2011 |
|||
? romanDec("CD") // 400 |
|||
? romanDec("MCMXC") // 1990 |
|||
? romanDec("MMVIII") // 2008 |
|||
? romanDec("MMIX") // 2009 |
|||
? romanDec("MDCLXVI") // 1666 |
|||
? romanDec("MMMDCCCLXXXVIII") // 3888</syntaxhighlight> |
|||
=={{header|zkl}}== |
=={{header|zkl}}== |