作者: dune
日時: 2002/5/05(16:35)
極悪です。

Python の追撃を許すな、ということで次のネタ。

事の起こりは nifty.fgalts.mes.07 のサイコロゲームなの
ですが、4つの数値(実はサイコロ)の合計で表現できる数
を全部列挙する、なんてのはどうでしょう。

とりあえず4つの数値 = (8,4,2,1) としますが、個数は
4個以上にも簡単に拡張できること、各々の数値も(やろ
うと思えば)変更できること、が条件です。表示の体裁は
どうでもいいことにします。



perl の場合ですが、ノート(笑)に書いて計算したときの
手順を書き下したのがこれ:

--^ dice1.pl
#!/usr/local/bin/perl

my @DICE    = qw(8 4 2 1);  # 自由に変更できると good

sub hoge{
    my($str,@dice)  = @_;
    printf("%-@{[2*($#DICE+1)]}s = %2d\n",$str,eval $str || 0);
    while(my $next = shift @dice){
        hoge("$str+$next",@dice);
    }
    return $str;
}

hoge("",@DICE);

__END__
--$



次にアルゴリズム辞典を見て真似したのがこれ:

--^ dice2.pl
#!/usr/local/bin/perl

my @DICE    = qw(8 4 2 1);
my $comb    = 2**@DICE-1;
foreach(0..$comb){
    my $comb_bit    = sprintf("%0@{[$#DICE+1]}b",$_);
    my @dice        = @DICE;
    my $comb_str;
    foreach my $bit (split m//,$comb_bit){
        my $dice    = shift @dice;
        $comb_str   .= ($bit ? "+$dice" : "  ");
    }
    printf("%s = %2d\n",$comb_str,eval $comb_str);
}

__END__
--$



実行して

%perl dice2.pl
         =  0
      +1 =  1
    +2   =  2
    +2+1 =  3
  +4     =  4
  +4  +1 =  5
  +4+2   =  6
  +4+2+1 =  7
+8       =  8
+8    +1 =  9
+8  +2   = 10
+8  +2+1 = 11
+8+4     = 12
+8+4  +1 = 13
+8+4+2   = 14
+8+4+2+1 = 15

%

みたいな結果が出ればOKです。最初のは再帰を使うところ
が、二つ目は文字列と数値をごちゃ混ぜにしてビットパター
ンを使うところがおもしろいと思います。
-- 
FZH01112@..., http://www1.u-netsurf.ne.jp/~dune/