aboutsummaryrefslogtreecommitdiff
path: root/challenge-047
diff options
context:
space:
mode:
authorMark Anderson <mark@frontrangerunner.com>2020-02-16 05:37:06 -0700
committerMark Anderson <mark@frontrangerunner.com>2020-02-16 05:37:06 -0700
commitb2ba31c54d97b032990c5451b21468c33d995ea6 (patch)
tree0b58fb05060e753c1789fa44d394c2ae5543eb67 /challenge-047
parente8d7fcf31b79b686373a3f0c9e3bfab6ed32a64f (diff)
downloadperlweeklychallenge-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.p686
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 = $/;
}
}