今度こそできたと思う。
キモは取り出したメンツの配列を再帰呼び出しするサブルーチンに渡したことだ。
まだ、メンツになっているかどうかを問わず、3つずつに分けただけである。
use strict;1
use warnings;
if($#ARGV < 0){
print "please specify haipai.\n";
exit;
}
my @haipai = split //, shift;
my @menz;
my $count = 0;
print "haipai: @haipai\n";
&select_menz([@haipai],[@menz]);
sub select_menz{
my @haipai = @{ $_[0] };
my @menz = @{ $_[1] };
my ($i,$j, $k) = (0, 1, 2);
if($#haipai < 2){
$count++;
print "$count: menz:@menz\n";
return;
}
while($i <= $#haipai - 2){
my @new_menz = @menz;
push @new_menz, "(".$haipai[$i].$haipai[$j].$haipai[$k].")";
my @new_haipai = @haipai;
$new_haipai[$i]=0;
$new_haipai[$j]=0;
$new_haipai[$k]=0;
@new_haipai = grep { $_ > 0 } @new_haipai;
&select_menz([@new_haipai], [@new_menz]);
$k++;
if($k>$#haipai){
$j++;
if($j>$#haipai -1){
$i++;
$j=$i+1;
$k=$j+1;
}else{
$k=$j+1;
}
}
}
}
チュウレンの9面待ちに対してこれを実行すると、最後は以下のようになる。
同じならびが3つ続いているが、これは1が3枚あって、その3枚のうち2枚を選ぶパターンが3つあるためである。
4804800 = combin(13,3) * combin(10,3) * combin(7,3) * combin(4,3)
である。
4804793: menz:(999) (678) (245) (111)
4804794: menz:(999) (678) (245) (113)
4804795: menz:(999) (678) (245) (113)
4804796: menz:(999) (678) (245) (113)
4804797: menz:(999) (678) (345) (111)
4804798: menz:(999) (678) (345) (112)
4804799: menz:(999) (678) (345) (112)
4804800: menz:(999) (678) (345) (112)