Home: Perl Programming Help: Intermediate:
How to generate Cartesian of all combination!!

gevni
Novice

Feb 12, 2014, 5:24 AM

Views: 2409
 How to generate Cartesian of all combination!!
Let me explain my problem with an example of set
 Code
`Let i have two sets A{1,2} B={1,2,3}  The Cartesian product AXB=2X3=6 so resultant sets are {1,1},{1,2},{1,3},{2,1},{2,2},{2,3}  I want the output where order also matter for example Total combinations of set A= 2! (factorial)=2 Total combination of set B= 3! (factorial)=6 and then i want AXB=12 {1,1},{1,2},{1,3},{1,1},{2,1},{3,1} {2,1},{2,2},{2,3},{1,2},{2,2},{3,2}`
I have this code
 Code
`sub Cartesian { #return one array contening one vector of index. #these index could be used to generate one vector of the cartesian product. #if shift function call without parameter it will use default array @_ for getting all the parameters of function   my \$i = shift; # function use to get the parameter of function, it return the first element of array @_     my \$ref_array = shift; #keep this copy (to avoid the copy before the call) #array with the size of each sub arrays   my @array = @{\$ref_array}; # way of getting all the variable of array      my @res;   my \$elem;   while(\$elem = shift @array){     push @res, \$i % \$elem;     \$i = \$i / \$elem;   }   return \@res; }`

 Code
`Cartesian(\$i,\@size_set);`

Can you plz help me how can i get all strings of combination by modifying the above code. As i am not too gud in perl. Thanks

Laurent_R
Veteran / Moderator

Feb 12, 2014, 11:05 AM

Views: 2394
 Re: [gevni] How to generate Cartesian of all combination!!
Hi, just a quick example one-liner:

 Code
`\$ perl -e 'my  @a = qw /1 2/; my  @b = qw /3 4 5/; for my \$first (@a) { print "[\$first, \$_]\n", "[\$_, \$first]\n" for @b;}' [1, 3] [3, 1] [1, 4] [4, 1] [1, 5] [5, 1] [2, 3] [3, 2] [2, 4] [4, 2] [2, 5] [5, 2]`

(I changed the digits in B so that it would be more obvious where the data is coming from.

If you need an array of arrays (AoA), just change the loop:

 Code
`\$ perl -e 'use Data::Dumper; my  @a = qw /1 2/; my  @b = qw /3 4 5/; my @c; for my \$first (@a) { push @c, [\$first, \$_], [\$_, \$first] for @b;}; print Dumper \@c;' \$VAR1 = [           [             '1',             '3'           ],           [             '3',             '1'           ],           [             '1',             '4'           ],           [             '4',             '1'           ],           [             '1',             '5'           ],           [             '5',             '1'           ],           [             '2',             '3'           ],           [             '3',             '2'           ],           [             '2',             '4'           ],           [             '4',             '2'           ],           [             '2',             '5'           ],           [             '5',             '2'           ]         ];`

Now, there are also some modules to do that, such as Algorithm::Combinatorics or Math::Combinatorics.

The glob function might also help.

(This post was edited by Laurent_R on Feb 12, 2014, 2:02 PM)