commit 7dce0a15a7894d89de5bdb9c4e38b7e48c79fabf
parent 590f19f5edbdfe7d4b45827bc659329f707e3c61
Author: Samir Parikh <noreply@samirparikh.com>
Date: Tue, 28 Dec 2021 19:57:17 +0000
squash previous lame attempts
Diffstat:
2 files changed, 75 insertions(+), 0 deletions(-)
diff --git a/wordy/Wordy.pm b/wordy/Wordy.pm
@@ -1,11 +1,43 @@
package Wordy;
use strict;
use warnings;
+use v5.22;
use Exporter qw<import>;
our @EXPORT_OK = qw<answer>;
+sub addition { $_[0] + $_[1] }
+sub subtraction { $_[0] - $_[1] }
+sub division { $_[0] / $_[1] }
+sub multiplication { $_[0] * $_[1] }
+
sub answer {
my ($question) = @_;
+ my @m = ();
+ say $question;
+ @m = ($question =~ m/What is (-?\d+)\?/);
+ return $m[0] if (scalar @m == 1);
+ @m = ($question =~ m/What is (-?\d+)\s(plus|minus|divided by|multiplied by)\s(-?\d+)\?/);
+ #say "I found ", scalar @m, " matches: @m";
+ #say "no third element exists" if ($m[2] eq "");
+ if (scalar @m == 3) {
+ return addition($m[0],$m[2]) if ($m[1] eq "plus");
+ return subtraction($m[0],$m[2]) if ($m[1] eq "minus");
+ return division($m[0],$m[2]) if ($m[1] eq "divided by");
+ return multiplication($m[0],$m[2]) if ($m[1] eq "multiplied by");
+ }
+ @m = ($question =~ m/(-?\d+)\s(plus|minus|divided by|multiplied by)\s(-?\d+)\s(plus|minus|divided by|multiplied by)\s(-?\d+)/);
+ if (scalar @m == 5) {
+ #say "found multiple operations";
+ my $a;
+ $a = addition($m[0],$m[2]) if ($m[1] eq "plus");
+ $a = subtraction($m[0],$m[2]) if ($m[1] eq "minus");
+ $a = division($m[0],$m[2]) if ($m[1] eq "divided by");
+ $a = multiplication($m[0],$m[2]) if ($m[1] eq "multiplied by");
+ return addition($a,$m[4]) if ($m[3] eq "plus");
+ return subtraction($a,$m[4]) if ($m[3] eq "minus");
+ return division($a,$m[4]) if ($m[3] eq "divided by");
+ return multiplication($a,$m[4]) if ($m[3] eq "multiplied by");
+ }
return undef;
}
diff --git a/wordy/pnyman.pm b/wordy/pnyman.pm
@@ -0,0 +1,43 @@
+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;