aboutsummaryrefslogtreecommitdiff
path: root/challenge-047/javier-luque/raku/ch-1.p6
blob: 196779ad68eca61510f40f6275fd49579886b45c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# Test: perl6 ch1.p6 "V + VI"
use v6.d;

sub MAIN($equation) {
    my %operators = (
        '+' => -> $a , $b { rtoa($a) + rtoa($b) },
        '-' => -> $a , $b { rtoa($a) - rtoa($b) },
        'x' => -> $a , $b { rtoa($a) * rtoa($b) },
        '/' => -> $a , $b { rtoa($a) / rtoa($b) },
    );

    if ($equation ~~ /^(\w+)\s*(\+|\-|x|\/)\s*(\w+)$/) {
        say ator(%operators{$1}($0.Str, $2.Str).Int);
    } else {
        say "Invalid input";
    }
}


# Inspired by:
# https://examples.p6c.dev/categories/euler/prob089-andreoss.html

multi rtoa() { 0 }
multi rtoa(Str $r where $r.chars > 1 ) {
    rtoa(| $r.comb)
}

multi rtoa('I',      |a) { 1   + rtoa(|a) }
multi rtoa('I', 'V', |a) { 4   + rtoa(|a) }
multi rtoa('V',      |a) { 5   + rtoa(|a) }
multi rtoa('I', 'X', |a) { 9   + rtoa(|a) }
multi rtoa('X',      |a) { 10  + rtoa(|a) }
multi rtoa('X', 'L', |a) { 40  + rtoa(|a) }
multi rtoa('L'     , |a) { 50  + rtoa(|a) }
multi rtoa('X', 'C', |a) { 90  + rtoa(|a) }
multi rtoa('C',      |a) { 100 + rtoa(|a) }
multi rtoa('C', 'D', |a) { 400 + rtoa(|a) }
multi rtoa('D',      |a) { 500 + rtoa(|a) }
multi rtoa('C', 'M', |a) { 900 + rtoa(|a) }
multi rtoa('M',      |a) { 1000 + rtoa(|a) }

sub ator(Int $n) returns Str {
    given $n {
        when $n >= 1000 { 'M'  ~ ator($n- 1000) }
        when $n >= 900  { 'CM' ~ ator($n - 900) }
        when $n >= 500  { 'D'  ~ ator($n - 500) }
        when $n >= 400  { 'CD' ~ ator($n- 400) }
        when $n >= 100  { 'C'  ~ ator($n - 100) }
        when $n >= 90   { 'XC' ~ ator($n - 90) }
        when $n >= 50   { 'L'  ~ ator($n - 50) }
        when $n >= 40   { 'XL' ~ ator($n - 40) }
        when $n >= 10   { 'X'  ~ ator($n - 10) }
        when $n >= 9    { 'IX' ~ ator($n- 9) }
        when $n >= 5    { 'V'  ~ ator($n - 5) }
        when $n >= 4    { 'IV' ~ ator($n - 4) }
        when $n >= 1    { 'I'  ~ ator($n - 1) }
        default        { '' }
    }
}