laziness, impatience, and hubris PerlMonks

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

by Limbic~Region (Chancellor)
 on Nov 16, 2011 at 14:38 UTC ( #938386=note: print w/replies, xml ) Need Help??

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

• Comment on Re^2: Challenge: Generate fixed size combination across groups without duplicates

Replies are listed 'Best First'.
Re^3: Challenge: Generate fixed size combination across groups without duplicates
by Util (Priest) on Nov 17, 2011 at 02:56 UTC
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://938386]
help
Chatterbox?
 [Corion]: Discipulus: I think Module::Corelist ( or corelist ) can tell you that [Corion]: Meh - Module::CoreList [choroba]: Just use List::Util 1.29 [choroba]: Be kind to people using old Perl with newer version of the module [Corion]: But why not simply specify 'List::Util' => 1.29 in your prerequisites? People might install a more recent version of the module into their Perl [Corion]: (what choroba said) [Discipulus]: ah! simpler and cleaner [Discipulus]: thanks! use List::Util 1.29 qw(pairmap ... just works! Discipulus is preparing another of his CUFP..

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (12)
As of 2017-05-25 09:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
My favorite model of computation is ...

Results (187 votes). Check out past polls.