Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Re: Rosetta PGA-TRAM

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

in reply to Rosetta PGA-TRAM

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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://772091]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (8)
As of 2017-02-25 03:09 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (365 votes). Check out past polls.