exercism-perl5

Repository for my Perl 5 Exercism exercises
git clone git://git.samirparikh.com/exercism-perl5
Log | Files | Refs | README

commit 7dce0a15a7894d89de5bdb9c4e38b7e48c79fabf
parent 590f19f5edbdfe7d4b45827bc659329f707e3c61
Author: Samir Parikh <noreply@samirparikh.com>
Date:   Tue, 28 Dec 2021 19:57:17 +0000

squash previous lame attempts

Diffstat:
Mwordy/Wordy.pm | 32++++++++++++++++++++++++++++++++
Awordy/pnyman.pm | 43+++++++++++++++++++++++++++++++++++++++++++
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;