作者: Yさ
日時: 2002/5/15(03:19)
...据え膳食わぬは(;^^ゞ いや、違うか。
...毒食わば皿まで。

順列生成のロジックはアルゴリズム辞典のものを参考にしました。
(出力順が辞書順と異なるロジックです)

--^ ticket2.awk
BEGIN{
  split("4 2 1", num); num[0]="8";
  split("- * /", op); op[0]="+";
  ans=10;

  setNum(4-1);
}

function setNum(n,  tmp,j){
  if(n>0){
    setNum(n-1);
    for(j=n-1; j>=0; --j){
      tmp=num[n]; num[n]=num[j]; num[j]=tmp;
      setNum(n-1);
      tmp=num[n]; num[n]=num[j]; num[j]=tmp;
    }
  }else test();
}

function test(  limit,i,s){
  limit=4^3;
  for(i=0; i<limit; ++i){
    s=num[0] op[int(i/4/4)%4] num[1] op[int(i/4)%4] num[2] op[i%4] num[3];
    if(eval(s)==ans) print s,"=",eval(s);
} }

function eval(s,  v,command){
  command = sprintf("%s \"BEGIN{ print %s }\"", ARGV[0], s);
  command | getline v;
  close(command);
  return v;
}
--$


■実行例

 >jgawk -f ticket2.awk | sort -nr | cat -n[ENTER]
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-----
     1  8/1-2+4 = 10
     2  8/1+4/2 = 10
     3  8/1+4-2 = 10
     4  8-2/1+4 = 10
     5  8-2+4/1 = 10
     6  8-2+4*1 = 10
     7  8-2+1*4 = 10
     8  8-2*1+4 = 10
     9  8-1*2+4 = 10
    10  8+4/2/1 = 10
      :
    50  1*8+4/2 = 10
    51  1*8+4-2 = 10
    52  1*4/2+8 = 10
    53  1*4-2+8 = 10
    54  1*4+8-2 = 10
-----

以上