...据え膳食わぬは(;^^ゞ いや、違うか。
...毒食わば皿まで。
順列生成のロジックはアルゴリズム辞典のものを参考にしました。
(出力順が辞書順と異なるロジックです)
--^ 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
-----
以上