Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
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??


in reply to Challenge: Generate fixed size combination across groups without duplicates

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
Download Code
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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://938327]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (7)
As of 2014-08-22 09:54 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (153 votes), past polls