メンツ選択



今度こそできたと思う。

キモは取り出したメンツの配列を再帰呼び出しするサブルーチンに渡したことだ。

まだ、メンツになっているかどうかを問わず、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)