Roman numeral to decimal converter Program written in TI-Basic that works on TI-83/84/+/SE calculators. Automatically detects whether input is a number of a Roman numeral, and converts to the opposite. Please try to optimize for size, if possible.

DelVar IDelVar VDelVar XDelVar LDelVar CDelVar DDelVar MClrHome
Input Str1
expr(Str1-&gt;A
If A
Then
A-&gt;B
"?-&gt;Str2
For(I,1,iPart(A/|E3
Str2+"M-&gt;Str2
B-|E3-&gt;B
End
If B&gt;899
Then
Str2+"CM-&gt;Str2
B-900-&gt;B
End
If B&gt;499
Then
Str2+"D-&gt;Str2
B-500-&gt;B
End
If B&gt;399
Then
Str2+"CD-&gt;Str2
B-400-&gt;B
End
B-&gt;A
For(I,1,iPart(A.01
Str2+"C-&gt;Str2
B-|E2-&gt;B
End
If B&gt;89
Then
Str2+"XC-&gt;Str2
B-90-&gt;B
End
If B&gt;49
Then
Str2+"L-&gt;Str2
B-50-&gt;B
End
If B&gt;39
Then
Str2+"XL-&gt;Str2
B-40-&gt;B
End
B-&gt;A
For(I,1,iPart(A.1
Str2+"X-&gt;Str2
B-10-&gt;B
End
If B=9
Then
DelVar BStr2+"IX-&gt;Str2
End
If B&gt;4
Then
Str2+"V-&gt;Str2
B-5-&gt;B
End
If B=4
Then
DelVar BStr2+"IV-&gt;Str2
End
For(I,1,B
Str2+"I-&gt;Str2
End
sub(Str2,2,length(Str2)-1
Else
"?"+Str1+"?-&gt;Str1
For(I,0,5
inString(Str1,sub("IVIXXLXCCDCM",2I+1,2
If Ans
Then
sub(Str1,1,Ans-1)+sub(Str1,Ans+2,length(Str1)-Ans-1-&gt;Str1
C+(4+10fPart(I/2))10^(iPart(I/2-&gt;C
End
End
For(I,1,length(Str1
inString("IVXLCDM",sub(Str1,I,1
If Ans
C+(5-8fPart(Ans/2))10^(iPart(.5(Ans-1-&gt;C
End
C
End
Ans
You have optimized this very well. However, using a different algorithm can reduce code size from 665 bytes to 411 bytes:

DelVar IDelVar VDelVar XDelVar LDelVar CDelVar DDelVar M"?-&gt;Str2
"IVXLCDM-&gt;Str3
ClrHome
Input Str1
expr(Str1-&gt;N
If N
Then
For(I,0,log(N
10fPart(.1N-&gt;A
While A
sum({4.1,4.1,9.2}(A={4,5,9-&gt;B
sub(Str3,2I+10fPart(B)+1,1)+Str2-&gt;Str2
abs(A-1-int(B-&gt;A
End
int(.1N-&gt;N
End
sub(Str2,1,length(Str2)-1
Else
Str2+Str1+"?-&gt;Str1
For(I,0,5
inString(Str1,sub("IVIXXLXCCDCM",2I+1,2
If Ans
Then
sub(Str1,1,Ans-1)+sub(Str1,Ans+2,length(Str1)-Ans-1-&gt;Str1
C+(4+10fPart(I/2))10^(iPart(I/2-&gt;C
End
End
For(I,1,length(Str1
inString(Str3,sub(Str1,I,1
If Ans
C+(5-8fPart(.5Ans))10^(iPart(.5Ans-.5-&gt;C
End
C
End
Ans