use strict; use warnings; my $max=0; my %val=map { $_ => $max++ } split //,'MDCLXVI'; sub rtol { my ($word)=@_; my @r = (".") x $max; my $last = $max + 1; while (length $word) { my $c=chop $word; if ($val{$c}<$last) { $r[$val{$c}]=$c; $last=$val{$c}; } } return join "",@r; } sub ltor { my ($word)=@_; my @r = (".") x $max; my $last = -1; for my $c (split //,$word) { if ($val{$c}>$last) { $r[$val{$c}]=$c; $last=$val{$c}; } } return join "",@r; } printf "%7s => %7s ( %7s : %-3s) ( %7s : %-3s )\n", qw(Input Expect LtoR ok? RroL ok?); printf "%7s %7s %7s %-3s %7s %-3s \n", ("---") x 6; while() { last unless /\S/; chomp; my ($input,$expect)=split /\s+/,$_; my $ltor=ltor($input); my $rtol=rtol($input); printf "%7s => %7s ( %7s : %-3s) ( %7s : %-3s )\n", $input, $expect, $ltor, $ltor eq $expect ? 'Ok' : 'Not', $rtol, $rtol eq $expect ? 'Ok' : 'Not'; } __END__ 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