Perl Monk, Perl Meditation PerlMonks

### Re: Challenge: Generate fixed size combination across groups without duplicates

by JavaFan (Canon)
 on Nov 16, 2011 at 07:29 UTC ( #938327=note: print w/replies, xml ) Need Help??

A sample to work with:

```group_1 = A B C
group_2 = 1 2 3 4
group_3 = yellow blue green
group_4 = tiny small medium large gigantic

fixed_size = 2
Can't you just use standard techniques to pick all combinations of 2 out of a set of 4, picking pairs of groups, then for each pair, calculate the Cartesian product?
• Comment on Re: Challenge: Generate fixed size combination across groups without duplicates

Replies are listed 'Best First'.
Re^2: Challenge: Generate fixed size combination across groups without duplicates
by Limbic~Region (Chancellor) on Nov 16, 2011 at 14:38 UTC
JavaFan,
Well, that only works for the sample provided and not the larger problem of a variable number of groups but it is trivial to extend it to the general case. I simply need to reverse the solution I provided in the original problem description:
• Use any fixed size combination iterator to produce the combination of groups matching the fixed size target
• Use Algorithm::Loops or similar to generate the cartesian product

This is also much simpler than the odometer model solution I came up with last night after posting this. Thanks.

Cheers - L~R

I arrived at the same solution:
```use Algorithm::Loops;
use Math::Combinatorics;

my \$fixed_size = 2;
my @groups = (
[qw( A B C )],
[qw( 1 2 3 4 )],
[qw( yellow blue green )],
[qw( tiny small medium large gigantic )],
);

for my \$fixed_size_groups ( combine( \$fixed_size, @groups ) ) {
Algorithm::Loops::NestedLoops \$fixed_size_groups, sub {
print "@_\n";
};
}
I got the same. ++

I used you code for my own problem and it worked fine in the beginning but the moment I add another array to @groups the order of the arrays changes intern.I have little experiences with subs so I don't know how to change the code to make sure the order stays the same?

```my @groups=(
[qw( yes no 0 )],
[qw( yes all 0 )],
[qw( all stop 0 )],
[qw( 1 0 )],
[qw( 1 0 )],    );
my @names=('rscode','nonsyn','aac','splice','var');
my \$fixed_size=scalar(@names);
my (\$combo,\$count)= create_combo(\$fixed_size,\@groups);

sub create_combo
{
my @array;
my \$count=0;
my \$fixed_size= \$_[0];
my \$groups=\$_[1];
for my \$fixed_size_groups ( combine( \$fixed_size, @{\$groups} ) )
{    Algorithm::Loops::NestedLoops \$fixed_size_groups,
sub {
push @array,@_;
print "@_\n";
\$count++;
};
return (\@array,\$count);
}

}

It gives as result

```1 all 1 yes yes
1 all 1 yes all
1 all 1 yes 0
....

which are the right combinations but not the right order of the elements! Any help is much appreciated.

Create A New User
Node Status?
node history
Node Type: note [id://938327]
help
Chatterbox?
 shmem is bored... sending limericks to the auth log

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (8)
As of 2018-02-20 16:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When it is dark outside I am happiest to see ...

Results (271 votes). Check out past polls.

Notices?