unit U_X9321;
 {Copyright 2001, Gary Darby, Intellitech Systems Inc., www.DelphiForFun.org
 This program may be used or modified for any non-commercial purpose
 so long as this original notice remains in place.
 All other rights are reserved
 }

{
Consider the following equation where "op" represents one of the four basic
operators + (addition), - (subtraction), * (multiplication) or / (division).

X = 9 op 3 op 2  op 1

Complete the equation by filling in the  "op" operators to produce integer X
values 0 through 9 in as many ways as possible.
}


....
{Generated code snipped}
....

var
  {character representation of operators - used to display results}
  opstr:array [1..4] of char=('+','-','*','/');

function eval(i,j,k:integer):integer;
{given 3 operators, (i,j,k), evaluate 9 i 3 j 2 k 1}
{i,j,k values: 1 ==> '+', 2 ==> '-', 3 ==> '*', 4 ==> '/'}
var
  x,x2:extended;
  n:integer;
begin
  {make a number from 0 to 7 representing the 8 possible
   sequences of operations}
   {n=  (0 or 4)      +  (0 or 2)        + (0 or 1)  }
   n:=((i-1) div 2)*4 + ((j-1) div 2)*2 + (k-1) div 2;
   case n of
   0:  {+-, +-, +-}
     begin
       if i=1 then x:=9+3  else x:=9-3;
       if j=1 then x:=x+2  else x:=x-2;
       if k=1 then x:=x+1 else x:=x-1;
     end;
   1: begin  {+-, +-, */}
        if k=3 then x2:= 2*1 else x2:=2;
        if i=1 then x:=9+3 else x:=9-3;
        if j=1 then x:=x+x2 else x:=x-x2;
      end;
   2: begin  {+-, */, +-}
        if j=3 then x:= 3*2 else x:=3 / 2;
        if i=1 then x:=9+x else x:=9-x;
        if k=1 then x:=x+1 else x:=x-1;
      end;
   3: begin  {+-, */, */}
        if j=3 then x:= 3*2 else x:=3 / 2;
        if k=3 then x:=x*1 else x:=x / 1;
        if i=1 then x:=9+x else x:=9-x;
      end;
   4: begin  {*/, +-, +-}
        if i=3 then x:=9*3  else x:=9 / 3;
        if j=1 then x:=x+2  else x:=x-2;
        if k=1 then x:=x+1 else x:=x-1;
      end;
   5: begin  {*/, +-, */}
        if i=3 then x:=9*3  else x:=9 / 3;
        if k=3 then x2:= 2*1 else x2:=2 / 1;
        if j=1 then x:=x+x2 else x:=x-x2;
      end;
   6: begin  {*/, */, +-}
        if i=3 then x:=9*3  else x:=9 / 3;
        if j=3 then x:= x*2 else x:=x / 2;
        if k=1 then x:=x+1 else x:=x-1;
      end;
   7: begin  {*/, */, */}
        if i=3 then x:=9*3  else x:=9 / 3;
        if j=3 then x:= x*2 else x:=x / 2;
        if k=3 then x:=x*1 else x:=x / 1;
      end;
   end; {case}
   if x =int(x) then result:=trunc(x) {if x is an integer, return it}
   else result:=-9999; {if not an integer, return -9999 as an error flag}
end;

procedure Tform1.Showvalues(from,through:integer);
{generate all permutations of operators and evaluate each}
var
  i,j,k,answer:integer;
  list:Tstringlist;
begin
  list:=Tstringlist.create; {make a stringlist so we can sort it}
  for i:=1 to 4 do {1st operator}
  for j:=1 to 4 do {2nd operator}
  for k:=1 to 4 do {3rd operator}
  begin
    answer:=eval(i,j,k);  {evaluate expression}
    if (answer >=from) and (answer <=through) and (answer<>-9999)
    then list.add(format('%4d = 9 %s 3 %s 2 %s 1 ',
               [answer, opstr[i], opstr[j], opstr[k]]));
   end;
   list.sort; {sort by answer value}
   listbox1.Items.Assign(list); {move sorted list to display area}
   list.free;
end;

procedure TForm1.AllBtnClick(Sender: TObject);
begin   showvalues(-1000000,100000);  end;

procedure TForm1.OneNineBtnClick(Sender: TObject);
begin  showvalues(0,9); end;

procedure TForm1.AboutBtnClick(Sender: TObject);
begin   aboutbox.showmodal;  end;

end.