sub solvepart($);
...
sub reformat;
...
sub reformat($){
...
sub solvepart($){
####
if ($given ~~ /(?:exit)|(?:end)|(?:quit)/i){
...
if ($VERBOSE or $VERBOSE ~~ /v(?:erbose)?/i){
##
##
my $num=qr/(-?\d++\.?\d*?)/;
...
unshift(@stack, [$2,$3,$4]) while $given =~ s/(.*)\((\S++) ++(-?\d++\.?\d*?) ++(-?\d++\.?\d*?)?\)/$1/;
##
##
if ($level[0]eq'+'){
$level[2]
?($value=$level[1]+$level[2])
:($value+=$level[1]);
}
elsif ($level[0]eq'-'){
$level[2]
?($value=$level[1]-$level[2])
:($value=$level[1]-$value);
}
elsif ($level[0]eq'/'){
$level[2]
?($value=$level[1]/$level[2])
:($value=$level[1]/$value);
}
elsif ($level[0]eq'*'){
$level[2]
?($value=$level[1]*$level[2])
:($value*=$level[1]);
}
elsif ($level[0]eq'**'or$level[0]eq'^'){
$level[2]
?($value=$level[1]**$level[2])
:($value=$level[1]**$value);
}
elsif ($level[0]eq'%'){
$level[2]
?($value=$level[1] % $level[2])
:($value=$level[1] % $value);
}
##
##
if ($level[0]eq'+'){
$value = $level[1] + $level[2] || $value;
}
elsif ($level[0]eq'-'){
$value = $level[1] - $level[2] || $value;
}
elsif ($level[0]eq'/'){
$value = $level[1] / $level[2] || $value;
}
elsif ($level[0]eq'*'){
$value = $level[1] * $level[2] || $value;
}
elsif ($level[0]eq'**'or$level[0]eq'^'){
$value = $level[1] ** $level[2] || $value;
}
elsif ($level[0]eq'%'){
$value = $level[1] % $level[2] || $value;
}
##
##
#!/usr/bin/perl
use warnings;
use strict;
use Scalar::Util 'looks_like_number';
my $MAXITERATIONS = 500;
while ( <> ) {
my $iterations = 0;
1 while s/(\([^()]+\))/ die "MAX ITERATIONS ACHIEVED: ABORTING\n" if ++$iterations >= $MAXITERATIONS; solvepart( $1 ) /eg;
print "\nANSWER: $_\n\n";
}
sub solvepart {
my $expression = shift;
$expression =~ tr/()//d;
$expression =~ s/\^/**/;
my ( $operator, @values ) = split ' ', $expression;
$operator =~ /\*\*|[+\-*\/%]/ && @values >= 2 && @values == grep looks_like_number( $_ ), @values
or die "IMPROPER INPUT\n";
eval join $operator, @values;
}