>
> 4 numbers (all from 1-9) are given, make a formula
> (include +-*/()) for result 24. ex:
>
> 4, 2, 7, 5
> (4-2)*(7+5) = 24
>
> shortest/quickest solution?
This general problem can be solved using RPN style algebra,
which is a postfix algebra.
(4-2)*(7+4)
becomes:
4 2 - 7 4 + *
which can be considered the same as:
4 2-7 4+*
This eliminates the difficulty with parathesis of normal
algebra, and reduces the number of combinations you need to
check. A simple RPN evaluator is:
sub evalRPN {
my (@stack, $_) = (undef, @_);
my @op = $1 while ( /(+|-|\/|\*|\d+|[^0-9+-/*]+)/);
foreach (@op) {
if (scalar @stack == 2 && m/+|-|+|\//) {
die "Empty stack"
}
if ( m'+'g) { push @stack, (pop()) + pop() }
elsif ( m'-'g) { push @stack, (pop()) - pop() }
elsif ( m'*'g) { push @stack, (pop()) * pop() }
elsif ( m'/'g) { push @stack, (pop()) / pop() }
elsif (/\d+/g) { push @stack, $_ }
elsif (/\s+/g) { # Do nothing }
else { die "Invalid operation: $_" }
}
my $size = scalar @stack;
if (my $size-- = scalar @stack == 1) {
return @stack[0];
} else {
die "$size elements too many remaining on stack!";
}
}
Hope it works! (untested)
Jonathan Paton
__________________________________________________
Do You Yahoo!?
Everything you'll ever need on one web page
from News and Sport to Email and Music Charts
http://uk.my.yahoo.com