good chemistry is complicated,and a little bit messy -LW 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?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (3)
As of 2018-01-20 05:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
How did you see in the new year?

Results (226 votes). Check out past polls.

Notices?