極悪です。
>># * 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/