Perl: the Markov chain saw PerlMonks

### 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 all is quiet...

How do I use this? | Other CB clients
Other Users?
As of 2018-02-25 10:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When it is dark outside I am happiest to see ...

Results (312 votes). Check out past polls.

Notices?