$romans = array( 'M' => 1000, 'CM' => 900, 'D' => 500, 'CD' => 400, 'C' => 100, 'XC' => 90, 'L' => 50, 'XL' => 40, 'X' => 10, 'IX' => 9, 'V' => 5, 'IV' => 4, 'I' => 1, ); $roman = 'MMMCMXCIX'; $result = 0; foreach ($romans as $key => $value) { while (strpos($roman, $key) === 0) { $result += $value; $roman = substr($roman, strlen($key)); } } echo $result;
\ prints a single roman digit from array
: roman_digit_print \ ( n -- )
case
1 of ." i" endof
4 of ." iv" endof
5 of ." v" endof
9 of ." ix" endof
10 of ." x" endof
40 of ." xl" endof
50 of ." l" endof
90 of ." xc" endof
100 of ." c" endof
400 of ." cd" endof
500 of ." d" endof
900 of ." cm" endof
1000 of ." m" endof
endcase ;
\ iterates on a single digit until all are printed
: do_single_digit \ (number digit -- remainder)
begin 2dup >= while
dup roman_digit_print
2dup \ number digit number digit
- \ number digit remainder
swap \ number remainder digit
rot \ remainder digit number
drop \ remainder digit
repeat
drop ;
\ prints an integer on the stack as roman numeral
: roman_numeral_print ( number -- )
1000 do_single_digit
900 do_single_digit
500 do_single_digit
400 do_single_digit
100 do_single_digit
90 do_single_digit
50 do_single_digit
40 do_single_digit
10 do_single_digit
9 do_single_digit
5 do_single_digit
4 do_single_digit
1 do_single_digit
drop ;