> 
> 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

Reply via email to