作者: dune
日時: 2002/5/12(10:02)
極悪です。
前回の自分の出題の延長と考えて、総当たりで解いてます。

Naomasa Numajiri さんの [TSabc:150] 言語の比較の参考4(電車の切符で昔やりました) から

># * 「×、÷」が「+、−」より優先されていない。

あるものは使おうってことで、eval で(最後に評価で)済ませま
した。

># * 4つの数値が与えられた時の順番を維持したまま計算してい
># る。

変えてもいいけど、結局総当たりしか思いつかないので省略。


--^ 計算手順
8+4+2+1 = (8 4 2 1) x (+ + +)
8+4+2-1 = (8 4 2 1) x (+ + -)
8+4+2*1 = (8 4 2 1) x (+ + *)
8+4+2/1 = (8 4 2 1) x (+ + /)

8+4-2+1 = (8 4 2 1) x (+ - +)
8+4-2-1 = (8 4 2 1) x (+ - -)
8+4-2*1 = (8 4 2 1) x (+ - *)
8+4-2/1 = (8 4 2 1) x (+ - /)

8+4*2+1 = (8 4 2 1) x (+ * +)
8+4*2-1 = (8 4 2 1) x (+ * -)
8+4*2*1 = (8 4 2 1) x (+ * *)
8+4*2/1 = (8 4 2 1) x (+ * /)

以下省略
--$



--^ ticket.pl
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(@OPRND);
--$



--^ 実行結果
%perl ticket.pl
8+4-2*1 = 10
8+4-2/1 = 10
8+4/2*1 = 10
8+4/2/1 = 10

%
--$
-- 
FZH01112@..., http://www1.u-netsurf.ne.jp/~dune/