28 lines
670 B
Perl
28 lines
670 B
Perl
use v5.12;
|
|
use Sub::SmartMatch;
|
|
use SmartMatch::Sugar qw(any);
|
|
use List::MoreUtils qw( natatime );
|
|
|
|
my %symbols = (
|
|
1 => "I", 5 => "V", 10 => "X", 50 => "L", 100 => "C",
|
|
500 => "D", 1_000 => "M"
|
|
);
|
|
|
|
my @subtractors = (
|
|
1_000, 100, 500, 100, 100, 10, 50, 10, 10, 1, 5, 1, 1, 0
|
|
);
|
|
|
|
multi roman => [0], sub { '' };
|
|
multi roman => any, sub {
|
|
my $n = shift;
|
|
my $iter = natatime 2, @subtractors;
|
|
while( my ($cut, $minus) = $iter->() ) {
|
|
$n >= $cut
|
|
and return $symbols{$cut} . roman($n - $cut);
|
|
$n >= $cut - $minus
|
|
and return $symbols{$minus} . roman($n + $minus);
|
|
}
|
|
};
|
|
|
|
say roman($_) for 1..2_012;
|