作者: dune
日時: 2002/5/13(00:13)
極悪です。

>># * 4つの数値が与えられた時の順番を維持したまま計算してい
>># る。
>
>変えてもいいけど、結局総当たりしか思いつかないので省略。

sugi さんの ruby 版と同じだけ答えが出たのであってると思う。



--^ ticket3.pl
use strict;

my @OPRND   = qw(8 4 2 1);
my @OPCD    = qw(+ - * /);
my $TARGET  = 10;



#
# 内積のようなものを計算
#
sub prod{
    my($last,$next,@oprnd)  = @_;
    if($next){
        prod($last.$_.$next,@oprnd) foreach(@OPCD);
    }else{
        my $result  = eval $last;
        print "$last = $result\n"   if $result == $TARGET;
    }
}



#
# 順列を生成して prod を呼び出し
#
sub perm{
    my($oprnd,@param)   = @_;
    if($#param < 0){
        print join(" ",@{$oprnd}),"\n"  if 0;
        prod(@{$oprnd});
        return;
    }
    foreach(0..$#param){
        my @next    = @param;
        perm([@{$oprnd},splice(@next,$_,1)],@next);
    }
}

perm([],@OPRND);
--$



%--^ 実行結果
%perl -w hoge.pl | cat -n
     1  8+4-2*1 = 10
     2  8+4-2/1 = 10
     3  8+4/2*1 = 10
        〜 中略 〜
    52  1*4-2+8 = 10
    53  1*4/2+8 = 10
    54  1/2*4+8 = 10
--$
-- 
FZH01112@..., http://www1.u-netsurf.ne.jp/~dune/