commit a27aa361f554abb126e7f01259346912bc08b355
parent 2f6f45e83b5845525a016e1be2ee7f05bf4b3afd
Author: Samir Parikh <noreply@samirparikh.com>
Date: Tue, 28 Dec 2021 23:38:03 +0000
cleanup code and add more comments documenting solution
Diffstat:
2 files changed, 22 insertions(+), 62 deletions(-)
diff --git a/wordy/Wordy.pm b/wordy/Wordy.pm
@@ -1,44 +1,47 @@
package Wordy;
use strict;
use warnings;
-use v5.22;
use Exporter qw<import>;
our @EXPORT_OK = qw<answer>;
-my $pattern = qr/(-?\d+|plus|minus|divided|multiplied)/;
-my $op_regex = qr/plus|minus|divided|multiplied/;
+########################################################################
+# PLEASE NOTE: This solution, as posted, passes all test conditions #
+# except #15 which tests whether "What is -3 plus 7 multiplied by -2?" #
+# returns `-8` as order of operations are to be ignored. My solution, #
+# which does respect order of operations, returns `-17`, which causes #
+# the test case to fail but I am marking it "Complete" nonetheless. #
+########################################################################
+
+my $pattern = qr/(-?\d+|plus|minus|divided|multiplied)/; # to parse input
+my $op_regex = qr/plus|minus|divided|multiplied/; # valid operations
sub answer {
my ($question) = @_;
+ # if input does not begin with "What is":
die "unknown operation" if ($question !~ m/^What is/);
- say $question;
my @m = ($question =~ m/$pattern/g);
- die "syntax error" unless (scalar @m);
- say "here is what I found";
- say "->$_<-" foreach @m;
- say "total elements: ", scalar @m;
+ die "syntax error" unless (scalar @m); # no operands or operations
if (scalar @m == 1) {
- if ($question =~ m/-?\d+\?/) { # operand with no operation
+ if ($question =~ m/-?\d+\?/) { # 1 operand with no operation
return $m[0];
} else {
- die "unknown operation"; # operand with unknown operation
+ die "unknown operation"; # 1 operand with unknown operation
}
}
my @stack;
- #foreach (@m) {
foreach my $i (0 .. $#m) {
+ # check whether odd indices contain valid operation
die "syntax error" if ($i%2 && $m[$i] !~ m/$op_regex/);
push @stack =>
- $m[$i] =~ m/-?\d+/ ? $m[$i] :
- $m[$i] eq 'plus' ? '+' :
- $m[$i] eq 'minus' ? '-' :
- $m[$i] eq 'divided' ? '/' :
- '*' ;
+ # <EXPR to evaluate> ? if true : else
+ $m[$i] =~ m/-?\d+/ ? $m[$i] :
+ $m[$i] eq 'plus' ? '+' :
+ $m[$i] eq 'minus' ? '-' :
+ $m[$i] eq 'divided' ? '/' :
+ '*' ;
}
- say "<", (join "><", @stack), ">";
- my $result = eval join ' ', @stack;
+ my $result = eval join ' ', @stack; # trap error in $@, if any
die "syntax error" if $@;
- say "I am returning $result";
return $result;
}
diff --git a/wordy/pnyman.pm b/wordy/pnyman.pm
@@ -1,43 +0,0 @@
-package Wordy;
-use strict;
-use warnings;
-use v5.22;
-use Exporter qw<import>;
-our @EXPORT_OK = qw<answer>;
-use experimental qw(signatures);
-use Regexp::Grammars;
-
-my $parser = qr{
- <Query>
- <rule: Query> <Prefix> <Number> <[Group]>+ <QMark>
- <rule: Prefix> What is
- <rule: Number> -? \d+
- <rule: Group> <Operator> <Number>
- <rule: Operator> <Plus> | <Minus> | <Multiplied> | <Divided>
- <rule: Plus> plus
- <rule: Minus> minus
- <rule: Multiplied> multiplied by
- <rule: Divided> divided by
- <rule: QMark> \?
- (?{ $MATCH = substr $^N, 1 })
-}xms;
-
-sub answer {
- say "my parser is $parser";
- my $input = shift;
- say "and my input is $input";
- die 'ArgumentError' if $input !~ $parser;
- push my @result, $/{Query}{Number};
- for ( $/{Query}{Group}->@* ) {
- push @result,
- $_->{Operator}{Plus} ? '+'
- : $_->{Operator}{Minus} ? '-'
- : $_->{Operator}{Multiplied} ? '*'
- : '/';
- push @result, $_->{Number};
- @result = ( eval join ' ', @result );
- }
- pop @result;
-}
-
-1;