diff options
| author | Mark Anderson <mark@frontrangerunner.com> | 2020-02-16 05:37:06 -0700 |
|---|---|---|
| committer | Mark Anderson <mark@frontrangerunner.com> | 2020-02-16 05:37:06 -0700 |
| commit | b2ba31c54d97b032990c5451b21468c33d995ea6 (patch) | |
| tree | 0b58fb05060e753c1789fa44d394c2ae5543eb67 /challenge-047 | |
| parent | e8d7fcf31b79b686373a3f0c9e3bfab6ed32a64f (diff) | |
| download | perlweeklychallenge-club-b2ba31c54d97b032990c5451b21468c33d995ea6.tar.gz perlweeklychallenge-club-b2ba31c54d97b032990c5451b21468c33d995ea6.tar.bz2 perlweeklychallenge-club-b2ba31c54d97b032990c5451b21468c33d995ea6.zip | |
minor touch-up
Diffstat (limited to 'challenge-047')
| -rw-r--r-- | challenge-047/mark-anderson/raku/ch-1.p6 | 86 |
1 files changed, 47 insertions, 39 deletions
diff --git a/challenge-047/mark-anderson/raku/ch-1.p6 b/challenge-047/mark-anderson/raku/ch-1.p6 index 50b015f024..ac25fe2680 100644 --- a/challenge-047/mark-anderson/raku/ch-1.p6 +++ b/challenge-047/mark-anderson/raku/ch-1.p6 @@ -2,7 +2,8 @@ grammar Roman2Arabic { token TOP { - :my Int $*Arabic; + :my $*Arabic; + <Thousands>? <Hundreds>? <Tens>? <Ones>? } @@ -17,7 +18,8 @@ grammar Roman2Arabic { grammar Arabic2Roman { token TOP { - :my Str $*Roman; + :my $*Roman; + <Thousands>? <Hundreds>? <Tens>? <Ones> } @@ -88,7 +90,7 @@ class Arabic2RomanActions { } method Thousands ($/) { - $*Roman = "M" x $/.Str; + $*Roman = "M" x $/; } method Hundreds ($/) { @@ -107,38 +109,41 @@ class Arabic2RomanActions { method Tens ($/) { given $/ { - when 9 { $*Roman ~= "XC" } + when 9 { $*Roman ~= "XC" } when 8 { $*Roman ~= "LXXX" } - when 7 { $*Roman ~= "LXX" } - when 6 { $*Roman ~= "LX" } - when 5 { $*Roman ~= "L" } - when 4 { $*Roman ~= "XL" } - when 3 { $*Roman ~= "XXX" } - when 2 { $*Roman ~= "XX" } - when 1 { $*Roman ~= "X" } + when 7 { $*Roman ~= "LXX" } + when 6 { $*Roman ~= "LX" } + when 5 { $*Roman ~= "L" } + when 4 { $*Roman ~= "XL" } + when 3 { $*Roman ~= "XXX" } + when 2 { $*Roman ~= "XX" } + when 1 { $*Roman ~= "X" } } } method Ones ($/) { given $/ { - when 9 { $*Roman ~= "IX" } + when 9 { $*Roman ~= "IX" } when 8 { $*Roman ~= "VIII" } - when 7 { $*Roman ~= "VII" } - when 6 { $*Roman ~= "VI" } - when 5 { $*Roman ~= "V" } - when 4 { $*Roman ~= "IV" } - when 3 { $*Roman ~= "III" } - when 2 { $*Roman ~= "II" } - when 1 { $*Roman ~= "I" } + when 7 { $*Roman ~= "VII" } + when 6 { $*Roman ~= "VI" } + when 5 { $*Roman ~= "V" } + when 4 { $*Roman ~= "IV" } + when 3 { $*Roman ~= "III" } + when 2 { $*Roman ~= "II" } + when 1 { $*Roman ~= "I" } } } } grammar Calculator { - has Arabic2Roman $.a2r; - has Roman2Arabic $.r2a; + rule TOP { + :my @*Arabics; + :my $*Answer; + :my $*Operator; - rule TOP { <Roman> <Operator> <Roman> } + <Roman> <Operator> <Roman> + } token Roman { <[IVXLCDM]>+ } @@ -146,26 +151,29 @@ grammar Calculator { } class CalculatorActions { - method TOP ($/ is copy) { - my $calc = $/; - - my $answer; - - my $i1 = $calc.r2a.parse($calc<Roman>[0], - :actions(Roman2ArabicActions)).made; - - my $i2 = $calc.r2a.parse($calc<Roman>[1], - :actions(Roman2ArabicActions)).made; + method TOP ($/) { + make $*Answer if $*Answer; + } - given $calc<Operator> { - when "+" { $answer = $i1 + $i2 } - when "-" { $answer = $i1 - $i2 } - when "x" { $answer = $i1 * $i2 } - when "/" { $answer = $i1 / $i2 } + method Roman ($match) { + push(@*Arabics, Roman2Arabic.parse($match, :actions( + Roman2ArabicActions)).made); + + if ($*Operator) { + given $*Operator { + when "+" { $*Answer = [+] @*Arabics } + when "-" { $*Answer = [-] @*Arabics } + when "x" { $*Answer = [*] @*Arabics } + when "/" { $*Answer = [/] @*Arabics } + } + + $*Answer = Arabic2Roman.parse($*Answer, :actions( + Arabic2RomanActions)).made; } + } - $calc.make($calc.a2r.parse($answer, - :actions(Arabic2RomanActions)).made); + method Operator ($/) { + $*Operator = $/; } } |
