use strict; use warnings; my %pos; @pos{ qw( M D C L X V I ) } = ( 0 .. 6 ); my $n_keys = keys %pos; my $template = '.' x $n_keys; while ( ) { my ( $in, $desired) = split; my $out = $template; my $ptr = $n_keys; for my $i ( reverse ( 0 .. length( $in ) - 1 ) ) { my $c = substr $in, $i, 1; if ( $pos{ $c } < $ptr ) { substr( $out, $pos{ $c }, 1 ) = $c; $ptr = $pos{ $c }; } } print "$in\t=> $out\t", ( $out eq $desired ? '' : 'not ' ), 'ok', $/; } __DATA__ I ......I IV .....V. V .....V. VI .....VI IX ....X.. X ....X.. XI ....X.I XIV ....XV. XV ....XV. XVI ....XVI XIX ....X.I X ....X.. XL ....X.. LX ...LX.. XC ....X.. CLXIX ..CLX.I CDXLVI .D..XVI MCMXCVI M.C.XVI MDCLI MDCL..I __END__ I => ......I ok IV => .....V. ok V => .....V. ok VI => .....VI ok IX => ....X.. ok X => ....X.. ok XI => ....X.I ok XIV => ....XV. ok XV => ....XV. ok XVI => ....XVI ok XIX => ....X.. not ok X => ....X.. ok XL => ...L... not ok LX => ...LX.. ok XC => ..C.... not ok CLXIX => ..CLX.. not ok CDXLVI => .D.L.VI not ok MCMXCVI => M.C..VI not ok MDCLI => MDCL..I ok