Skip to content

Commit 0817924

Browse files
committed
Added Roman tests
1 parent 55b1d5e commit 0817924

File tree

4 files changed

+409
-0
lines changed

4 files changed

+409
-0
lines changed

Roman/int-to-roman-2.pb

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+

2+
EnableExplicit
3+
4+
Procedure.s ParseNumber(number.l)
5+
Protected i.l, value.l, result.s
6+
For i = 0 To 12
7+
Select i
8+
Case 0: value = 1000
9+
Case 1: value = 900
10+
Case 2: value = 500
11+
Case 3: value = 400
12+
Case 4: value = 100
13+
Case 5: value = 90
14+
Case 6: value = 50
15+
Case 7: value = 40
16+
Case 8: value = 10
17+
Case 9: value = 9
18+
Case 10: value = 5
19+
Case 11: value = 4
20+
Case 12: value = 1
21+
EndSelect
22+
While number >= value
23+
Select i
24+
Case 0: result + "M"
25+
Case 1: result + "CM"
26+
Case 2: result + "D"
27+
Case 3: result + "CD"
28+
Case 4: result + "C"
29+
Case 5: result + "XC"
30+
Case 6: result + "L"
31+
Case 7: result + "XL"
32+
Case 8: result + "X"
33+
Case 9: result + "IX"
34+
Case 10: result + "V"
35+
Case 11: result + "IV"
36+
Case 12: result + "I"
37+
EndSelect
38+
number - value
39+
Wend
40+
Next
41+
ProcedureReturn result
42+
EndProcedure
43+
44+
Procedure ParseRoman(number.s)
45+
Protected result, value, old, pos = Len(number)
46+
While pos > 0
47+
Select Mid(number, pos, 1)
48+
Case "I": value = 1
49+
Case "V": value = 5
50+
Case "X": value = 10
51+
Case "L": value = 50
52+
Case "C": value = 100
53+
Case "D": value = 500
54+
Case "M": value = 1000
55+
EndSelect
56+
If value < old
57+
result - value
58+
Else
59+
result + value
60+
EndIf
61+
old = value
62+
pos - 1
63+
Wend
64+
ProcedureReturn result
65+
EndProcedure
66+
67+
Debug "====================================================="
68+
Debug Bool( ParseRoman( "" ) = 0 )
69+
Debug Bool( ParseRoman( "IV" ) = 4 )
70+
Debug Bool( ParseRoman( "VI" ) = 6 )
71+
Debug Bool( ParseRoman( "IX" ) = 9 )
72+
Debug Bool( ParseRoman( "XI" ) = 11 )
73+
Debug Bool( ParseRoman( "XIII" ) = 13 )
74+
Debug Bool( ParseRoman( "CDXC" ) = 490 )
75+
Debug Bool( ParseRoman( "DX" ) = 510 )
76+
Debug Bool( ParseRoman( "MMMMMCDXXXVIII" ) = 5438 )
77+
Debug Bool( ParseRoman( "MMMMMMMMMDCCCLXXXVIII" ) = 9888 )
78+
Debug Bool( ParseRoman( "MMMMMMMMMCMXCIX" ) = 9999 )
79+
Debug "====================================================="
80+
Debug Bool( ParseNumber( 0 ) = "" )
81+
Debug Bool( ParseNumber( 4 ) = "IV" )
82+
Debug Bool( ParseNumber( 6 ) = "VI" )
83+
Debug Bool( ParseNumber( 9 ) = "IX" )
84+
Debug Bool( ParseNumber( 11 ) = "XI" )
85+
Debug Bool( ParseNumber( 13 ) = "XIII" )
86+
Debug Bool( ParseNumber( 490 ) = "CDXC" )
87+
Debug Bool( ParseNumber( 510 ) = "DX" )
88+
Debug Bool( ParseNumber( 5438 ) = "MMMMMCDXXXVIII" )
89+
Debug Bool( ParseNumber( 9888 ) = "MMMMMMMMMDCCCLXXXVIII" )
90+
Debug Bool( ParseNumber( 9999 ) = "MMMMMMMMMCMXCIX" )
91+
Debug "====================================================="
92+
93+
Define i, roman$, number
94+
;
95+
For i = 0 To 9999
96+
roman$ = ParseNumber(i)
97+
number = ParseRoman(roman$)
98+
Debug Str(i) + " ==> " +
99+
Chr(34) + roman$ + Chr(34) + " ==> " +
100+
Str(number) + " ==> " +
101+
StringField("ERROR,SUCCESS", Bool(i = number) + 1, ",")
102+
Next
103+
104+
; For i = 0 To 9999
105+
; Debug "DC.B '" + i + ", 0, " + ParseRoman(ParseNumber(i))
106+
; Next
107+
108+
; IDE Options = PureBasic 5.40 LTS Beta 3 (Linux - x64)
109+
; CursorPosition = 105
110+
; FirstLine = 55
111+
; Folding = -
112+
; EnableUnicode
113+
; EnableXP
114+
; SubSystem = gtk2

Roman/int-to-roman.pb

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
;======================================================================================
2+
; Roman to Number
3+
;======================================================================================
4+
5+
Procedure ParseRoman(number.s)
6+
Protected result, i, j, k, l
7+
number = UCase(number)
8+
l = Len(number)
9+
While l
10+
i = FindString("IVXLCDM", Mid(number, l, 1))
11+
If i
12+
j = Val(StringField("1,5,10,50,100,500,1000", i, ","))
13+
If j < k
14+
j = -j
15+
EndIf
16+
result + j
17+
k = j
18+
Else
19+
result = -1
20+
Break
21+
EndIf
22+
l - 1
23+
Wend
24+
ProcedureReturn result
25+
EndProcedure
26+
27+
;======================================================================================
28+
; Number to Roman
29+
;======================================================================================
30+
31+
Procedure.s ParseNumber(number.l)
32+
Protected result.s, i, j
33+
If number > 0 And number < 10000
34+
For i = 1 To 13
35+
j = Val(StringField("1000,900,500,400,100,90,50,40,10,9,5,4,1", i, ","))
36+
While number >= j
37+
result + StringField("M,CM,D,CD,C,XC,L,XL,X,IX,V,IV,I", i, ",")
38+
number - j
39+
Wend
40+
Next
41+
EndIf
42+
ProcedureReturn result
43+
EndProcedure
44+
45+
;======================================================================================
46+
; Conversion Tests
47+
;======================================================================================
48+
49+
;Debug ParseNumber(1754)
50+
;End
51+
52+
53+
For i = 0 To 9999
54+
roman$ = ParseNumber(i)
55+
If Len(roman$) > Len(maxi$)
56+
maxi$ = roman$
57+
EndIf
58+
59+
; number = ParseRoman(roman$)
60+
; Debug Str(i) + " ==> " +
61+
; Chr(34) + roman$ + Chr(34) + " ==> " +
62+
; Str(number) + " ==> " +
63+
; StringField("ERROR,SUCCESS", Bool(i = number) + 1, ",")
64+
Next
65+
Debug maxi$
66+
; IDE Options = PureBasic 5.40 LTS Beta 3 (Linux - x64)
67+
; CursorPosition = 50
68+
; FirstLine = 13
69+
; Folding = -
70+
; EnableUnicode
71+
; EnableXP
72+
; SubSystem = gtk2

Roman/integer-roman-v1.s

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
;=================================================
2+
; Number ==> Roman ==> Number
3+
; flype, 2015-09-20
4+
;=================================================
5+
6+
;=================================================
7+
; Constants
8+
;=================================================
9+
10+
assert_zero EQU $00D0000C ; magical register
11+
12+
;=================================================
13+
; Entry Point
14+
;=================================================
15+
16+
START:
17+
JSR RomanToNumber
18+
STOP #-1
19+
20+
INPUT:
21+
DC.B 'MMMMMMMMMDCCCLXXXVIII'
22+
23+
INPUTLEN:
24+
DC.B *-INPUT
25+
26+
;=================================================
27+
; Number To Roman
28+
; Input D0 : 9888
29+
; Output A0 : 'MMMMMMMMMDCCCLXXXVIII'
30+
;=================================================
31+
32+
NumberToRoman:
33+
RTS
34+
35+
;=================================================
36+
; Roman To Number
37+
; Input A0 : 'MMMMMMMMMDCCCLXXXVIII'
38+
; Output D0 : 9888
39+
;=================================================
40+
41+
RomanToNumber:
42+
LEA INPUTLEN-1,A0 ; Roman Input End
43+
LEA INPUT-1,A1 ; Roman Input Start
44+
CLR.L D1 ; Value
45+
CLR.L D2 ; Value Old
46+
CLR.L D3 ; Result
47+
R2N0: CMP.L A0,A1 ; Check Start of string
48+
BEQ R2N9 ; Exit Routine
49+
R2NI: CMPI.B #'I',(A0)
50+
BNE R2NV
51+
MOVE.W #1,D1
52+
BRA R2N1
53+
R2NV: CMPI.B #'V',(A0)
54+
BNE R2NX
55+
MOVE.W #5,D1
56+
BRA R2N1
57+
R2NX: CMPI.B #'X',(A0)
58+
BNE R2NL
59+
MOVE.W #10,D1
60+
BRA R2N1
61+
R2NL: CMPI.B #'L',(A0)
62+
BNE R2NC
63+
MOVE.W #50,D1
64+
BRA R2N1
65+
R2NC: CMPI.B #'C',(A0)
66+
BNE R2ND
67+
MOVE.W #100,D1
68+
BRA R2N1
69+
R2ND: CMPI.B #'D',(A0)
70+
BNE R2NM
71+
MOVE.W #500,D1
72+
BRA R2N1
73+
R2NM: CMPI.B #'M',(A0)
74+
BNE R2N1
75+
MOVE.W #1000,D1
76+
BRA R2N1
77+
R2N1: CMP.W D1,D2 ; Compare Value, Old Value
78+
BGT R2N3 ; If Value < Old Value Then Sub Else Add
79+
R2N2: ADD.W D1,D3 ; Result += Value
80+
BRA R2N4
81+
R2N3: SUB.W D1,D3 ; Result -= Value
82+
R2N4: MOVE.W D1,D2 ; Remember Value
83+
SUB #1,A0 ; Next Roman Digit
84+
BRA R2N0 ;
85+
R2N9: RTS
86+
87+
;=================================================
88+
; End
89+
;=================================================

0 commit comments

Comments
 (0)