December 04, 2020, 11:57:16 AM

### Author Topic: [bmx] Roman Numerals by xlsior [ 1+ years ago ]  (Read 528 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bmx] Roman Numerals by xlsior [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : Roman Numerals
Author : xlsior
Posted : 1+ years ago

Description : - Validate whether a Roman Numeral is syntactically correct
- Convert Roman to Int
- Convert Int to Roman

Code :
Code: BlitzMax
1. ' ROMAN NUMERAL FUNCTIONS
2. '
3. ' By Marc van den Dikkenberg / www.xlsior.org
4. ' Created in February 2009
5. '
6. '   This code will allow you to:
7. ' - Validate a Roman Numeral (Check a string and state whether or not it contains a valid number)
8. ' - Convert from 'normal' Arabic numbers into Roman
9. ' - Convert from Roman into 'normal' Arabic numbers
10. '
11. ' Note: Bah.Regex is needed to validate the validity of a Roman Numeral.
12. ' If you do not have the bah.regex module installed, you can remark out the 'ValidateRomanNumeral' call -- the others functions will still work, but won't be able to detect invalid input.
13. '
14.
15. Import BaH.RegEx
16. SuperStrict
17.
18. Local Test:String="MCMXCIX"  ' MCMXCIX = 1999
19.
20. If ValidateRomanNumeral(Test)=True Then
21.         Print test+" is "+RomanToInt(Test)
22. Else
23.         Print test+" is not a valid number"
24. End If
25.
26. Print "Roman Numeral for 1984 is: "+intToRoman(1984)
27.
28. Function RomanToInt:Int(Roman:String)
29.         Local tempvar1:Int=0
30.         Local Workvar1:Int=0
31.         roman=Trim(roman.toUpper())
32.         While Len(roman)>0
33.                 If Left(roman,2)="CM" Then
34.                         workvar1=workvar1+900
35.                         roman=Mid(roman,3)
36.                 ElseIf Left(roman,1)="M" Then
37.                         workvar1=workvar1+1000
38.                         roman=Mid(roman,2)
39.                 ElseIf Left(roman,2)="CD" Then
40.                         workvar1=workvar1+400
41.                         roman=Mid(roman,3)
42.                 ElseIf Left(roman,1)="D" Then
43.                         workvar1=workvar1+500
44.                         roman=Mid(roman,2)
45.                 ElseIf Left(roman,1)="D" Then
46.                         workvar1=workvar1+500
47.                         roman=Mid(roman,2)
48.                 ElseIf Left(roman,1)="C" Then
49.                         workvar1=workvar1+100
50.                         roman=Mid(roman,2)
51.                 ElseIf Left(roman,2)="XC" Then
52.                         workvar1=workvar1+90
53.                         roman=Mid(roman,3)
54.                 ElseIf Left(roman,2)="XL" Then
55.                         workvar1=workvar1+40
56.                         roman=Mid(roman,3)
57.                 ElseIf Left(roman,1)="L" Then
58.                         workvar1=workvar1+50
59.                         roman=Mid(roman,2)
60.                 ElseIf Left(roman,2)="IX" Then
61.                         workvar1=workvar1+9
62.                         roman=Mid(roman,3)
63.                 ElseIf Left(roman,1)="X" Then
64.                         workvar1=workvar1+10
65.                         roman=Mid(roman,2)
66.                 ElseIf Left(roman,2)="IV" Then
67.                         workvar1=workvar1+4
68.                         roman=Mid(roman,3)
69.                 ElseIf Left(roman,1)="V" Then
70.                         workvar1=workvar1+5
71.                         roman=Mid(roman,2)
72.                 ElseIf Left(roman,1)="I" Then
73.                         workvar1=workvar1+1
74.                         roman=Mid(roman,2)
75.                 End If
76.         Wend
77.         Return workvar1
78. End Function
79.
80. Function IntToRoman:String(Number:Int)
81.         Local tempint1:Int=0
82.         Local tempstring:String=""
83.         While number>=1000
84.                 tempstring=tempstring+"M"
85.                 number=number-1000
86.         Wend
87.         If number>=900 Then
88.                 tempstring=tempstring+"CM"
89.                 number=number-900
90.         End If
91.         If number>=500 Then
92.                 tempstring=tempstring+"D"
93.                 number=number-500
94.         End If
95.         If number>=400 Then
96.                 tempstring=tempstring+"CD"
97.                 number=number-400
98.         End If
99.         If number>=300 Then
100.                 tempstring=tempstring+"CCC"
101.                 number=number-300
102.         End If
103.         If number>=200 Then
104.                 tempstring=tempstring+"CC"
105.                 number=number-200
106.         End If
107.         If number>=100 Then
108.                 tempstring=tempstring+"C"
109.                 number=number-100
110.         End If
111.         If number>=90 Then
112.                 tempstring=tempstring+"XC"
113.                 number=number-90
114.         End If
115.         If number>=80 Then
116.                 tempstring=tempstring+"LXXX"
117.                 number=number-80
118.         End If
119.         If number>=70 Then
120.                 tempstring=tempstring+"LXX"
121.                 number=number-70
122.         End If
123.         If number>=60 Then
124.                 tempstring=tempstring+"LX"
125.                 number=number-60
126.         End If
127.         If number>=50 Then
128.                 tempstring=tempstring+"L"
129.                 number=number-50
130.         End If
131.         If number>=40 Then
132.                 tempstring=tempstring+"XL"
133.                 number=number-40
134.         End If
135.         If number>=30 Then
136.                 tempstring=tempstring+"XXX"
137.                 number=number-30
138.         End If
139.         If number>=20 Then
140.                 tempstring=tempstring+"XX"
141.                 number=number-20
142.         End If
143.         If number>=15 Then
144.                 tempstring=tempstring+"XV"
145.                 number=number-15
146.         End If
147.         If number>=10 Then
148.                 tempstring=tempstring+"X"
149.                 number=number-10
150.         End If
151.         If number>=9 Then
152.                 tempstring=tempstring+"IX"
153.                 number=number-9
154.         End If
155.         If number>=8 Then
156.                 tempstring=tempstring+"VIII"
157.                 number=number-8
158.         End If
159.         If number>=7 Then
160.                 tempstring=tempstring+"VII"
161.                 number=number-7
162.         End If
163.         If number>=6 Then
164.                 tempstring=tempstring+"VI"
165.                 number=number-6
166.         End If
167.         If number>=5 Then
168.                 tempstring=tempstring+"V"
169.                 number=number-5
170.         End If
171.         If number>=4 Then
172.                 tempstring=tempstring+"IV"
173.                 number=number-4
174.         End If
175.         If number>=3 Then
176.                 tempstring=tempstring+"III"
177.                 number=number-3
178.         End If
179.         If number>=2 Then
180.                 tempstring=tempstring+"II"
181.                 number=number-2
182.         End If
183.         If number>=1 Then
184.                 tempstring=tempstring+"I"
185.                 number=number-1
186.         End If
187.         Return tempstring
188. End Function
189.
190.
191. Function ValidateRomanNumeral:Int(Roman:String)
192.         Local RegEx:TRegEx = TRegEx.Create("(([IXCM])2{10,})|[^IVXLCDM]|([IL][LCDM])|([XD][DM])|(V[VXLCDM])|(IX[VXLC])|(VI[VX])|(XC[LCDM])|(LX[LC])|((CM|DC)[DM])|(I[VX]I)|(X[CL]X)|(C[DM]C)|(I{2,}[VX])|(X{2,}[CL])|(C{2,}[DM])")
193.         Local match:TRegExMatch = regex.Find(Roman)
194.         If match Or Trim(Roman)=""
195.                 ' Not a valid Roman Numeral
196.                 Return False
197.         Else
198.                 ' Valid Roman Numeral
199.                 Return True
200.         End If
201. End Function