### Re: Rosetta PGA-TRAM

by BrowserUk (Pope)
 on Jun 16, 2009 at 17:56 UTC ( #772091=note: print w/replies, xml ) Need Help??

I rarely define such subroutines without also defining the inverse. And once you have the inverse it seems like the most natural thing to do is use it to set up a straight forward table-driven version of the required routine:

```#! perl -sw
use 5.010;
use strict;

use constant _1to9       => [ '', qw[ I II III IV V VI VII VIII IX ] ]
+;
use constant _10to90     => [ '', qw[ X XX XXX XL L LX LXX LXXX XC ] ]
+;
use constant _100to900   => [ '', qw[ C CC CCC CD D DC DCC DCCC CM ] ]
+;

sub dec2roman {
my \$dec = shift;
die "Bad input' unless \$dec =~ m[^[0-9]+\$] and \$dec < 4e3;
my @decDigits = split '', \$dec;
my \$roman = '';
\$roman .= 'M' x        shift @decDigits   if @decDigits == 4;
\$roman .= _100to900->[ shift @decDigits ] if @decDigits == 3;
\$roman .= _10to90->  [ shift @decDigits ] if @decDigits == 2;
\$roman .= _1to9->    [ shift @decDigits ] if @decDigits == 1;
return \$roman;
}

sub roman2dec {
state %roman2dec;
%roman2dec = map{ dec2roman( \$_ ), \$_ } 1 .. 3999 unless %roman2de
+c;

my \$roman = uc shift;
return \$roman2dec{ \$roman } if exists \$roman2dec{ \$roman };
die "Input '\$roman' out of range (1..3999 (roman) inclusive)";
}

for my \$r ( qw[ XLII LXIX mi MMMCMLXXXVIII ] ) {
printf "%15s : %d\n", \$r, roman2dec(\$r);
}

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Create A New User
Node Status?
node history
Node Type: note [id://772091]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (7)
As of 2021-06-13 12:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
What does the "s" stand for in "perls"? (Whence perls)

Results (55 votes). Check out past polls.

Notices?