30 lines
973 B
Plaintext
30 lines
973 B
Plaintext
* # Arabic to Roman
|
|
define('roman(n)s,ch,val,str') :(roman_end)
|
|
roman roman = ge(n,4000) n :s(return)
|
|
s = 'M1000 CM900 D500 CD400 C100 XC90 L50 XL40 X10 IX9 V5 IV4 I1 '
|
|
rom1 s span(&ucase) . ch break(' ') . val span(' ') = :f(rom2)
|
|
str = str dupl(ch,(n / val))
|
|
n = remdr(n,val) :(rom1)
|
|
rom2 roman = str :(return)
|
|
roman_end
|
|
|
|
* # Roman to Arabic
|
|
define('arabic(n)s,ch,val,sum,x') :(arabic_end)
|
|
arabic s = 'M1000 D500 C100 L50 X10 V5 I1 '
|
|
n = reverse(n)
|
|
arab1 n len(1) . ch = :f(arab2)
|
|
s ch break(' ') . val
|
|
val = lt(val,x) (-1 * val)
|
|
sum = sum + val; x = val :(arab1)
|
|
arab2 arabic = sum :(return)
|
|
arabic_end
|
|
|
|
* # Test and display
|
|
tstr = '2010 1999 1492 1066 476 '
|
|
tloop tstr break(' ') . year span(' ') = :f(out)
|
|
r = roman(year)
|
|
rstr = rstr year '=' r ' '
|
|
astr = astr r '=' arabic(r) ' ' :(tloop)
|
|
out output = rstr; output = astr
|
|
end
|