Convert to/from Roman Numerals

Author: Rosetta Code

You want to convert to/from Roman Numerals

Source code: 02-05-roman-numerals.p6

#!/usr/bin/env perl6

use v6;

say to-roman(2015); # ==> MMXV

say from-roman('MMXV'); # ==> 2015

multi sub to-roman (0) { '' }
multi sub to-roman (Int $n) {
    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;

    for @subtractors -> $cut, $minus {
        $n >= $cut
            and return %symbols{$cut} ~ to-roman($n - $cut);
        $n >= $cut - $minus
            and return %symbols{$minus} ~ to-roman($n + $minus);
    }
}

sub from-roman($r) {
    [+] gather $r.uc ~~ /
        ^
        [
        | M  { take 1000 }
        | CM { take 900 }
        | D  { take 500 }
        | CD { take 400 }
        | C  { take 100 }
        | XC { take 90 }
        | L  { take 50 }
        | XL { take 40 }
        | X  { take 10 }
        | IX { take 9 }
        | V  { take 5 }
        | IV { take 4 }
        | I  { take 1 }
        ]+
        $
    /;
}