gpm1982 has asked for the
wisdom of the Perl Monks concerning the following question:
hello there.
i need some help here. what im trying to do is to list out combinations of a given array of strings, numbers, etc.
for example:
if i had an array like qw(a b c), i would like to generate combinations of the array above, so that i would have:
qw(a b c), qw(a c b), qw(b a c), qw(b c a), qw(c a b), and qw(c b a)
is there a way, in Perl, to come up with the result above? please help. thanx.
ps: to find out how many different combinations can be produced from an array of n elements, use factorial (!). for example, if i had an array of 5 elements, my combinations will have a total of
5! = 5x4x3x2x1 = 120 different combinations
Re: generate combinations of lists by ikegami (Pope) on Sep 28, 2005 at 06:07 UTC 
Those are permutations, not combinations. Order doesn't matter for combinations.
Algorithm::Loops has a function called NextPermute which iterates permutations. Taken almost verbatim from the documentation:
use Algorithm::Loops qw( NextPermute );
my @list = sort qw( a b c );
do {
print(join(', ', @list), "\n");
} while (NextPermute(@list));
 [reply] [d/l] [select] 
Re: generate combinations of lists by gargle (Hermit) on Sep 28, 2005 at 07:27 UTC 
Hi,
update: clarification
disclaimer: bogoperm, but it does fit your description of the problem!
#!/usr/bin/perl
use strict;
use warnings;
#############
# bogoperm! #
#############
my @array = qw(a b c);
my $length = @array;
# faculty
my $fac = 1;
foreach my $f (1..$length) {
$fac *= $f;
}
# my results
my %hash = ();
# internals
my $check; # if equals control then we found a number
my $control; # has to contain something like 123...
my $index; # the number itself, it's an index!
my $count = 0; # 'till this equals $fac
OUTER: do {
INNER: while (1) {
do {
$check = 0;
$control = 0;
$index = 0;
foreach my $i (1..$length) {
my $number = 1+int(rand()*$length);
$index += $number * 10**($i1);
$check += 10**$number;
$control += 10**$i;
}
$check /= 10; $control /= 10;
} while ($check != $control);
last INNER if defined $hash{$index};
$hash{$index}++;
$count++;
}
} while $count != $fac;
# print out the results
foreach my $i (keys %hash) {
my $j;
do {
$j = $i % 10;
print $array[$j1];
$i = ($i  $j) / 10;
} while ($i > 0);
print "\n";
}
output:
bash3.00$ ./perm.pl
cba
acb
bac
cab
abc
bca
I'll leave it as an exercise to put the output in real lists.
Well, at least I used strict and warnings :o

if ( 1 ) { $postman>ring() for (1..2); }
 [reply] [d/l] [select] 

 [reply] [d/l] 

No ++ from me because you work with "rand". That's not permutating but "throwing dice" and hoping to get all permutations.
Um, I think that's the point of it — it's a joke! (Especially considering its name.)
 for doing someone's homework ;)
But surely approaching a homework question in an intentionally stupid way that they wouldn't get any marks doesn't actually count as doing somebody's homework? I thought gargle's node was humourous, and can't see what's so harmful about it to warrant its negative reputation.
Smylers
 [reply] 

 [reply] [d/l] 
Re: generate combinations of lists by planetscape (Chancellor) on Sep 28, 2005 at 05:13 UTC 
 [reply] 
Re: generate combinations of lists by kprasanna_79 (Hermit) on Sep 28, 2005 at 07:16 UTC 
 [reply] 
Re: generate combinations of lists by Skeeve (Vicar) on Sep 28, 2005 at 07:19 UTC 
 [reply] [d/l] 

