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