Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

generate combinations of lists

by gpm1982 (Initiate)
on Sep 28, 2005 at 05:04 UTC ( #495627=perlquestion: print w/ replies, xml ) Need Help??
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

Comment on generate combinations of lists
Replies are listed 'Best First'.
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));
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**($i-1); $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[$j-1]; $i = ($i - $j) / 10; } while ($i > 0); print "\n"; }

    output:

    bash-3.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); }
      No ++ from me because you work with "rand". That's not permutating but "throwing dice" and hoping to get all permutations.

      -- for doing someone's homework ;-)

      $\=~s;s*.*;q^|D9JYJ^^qq^\//\\\///^;ex;print
        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

        ++ for correcting me ;-)

        Nevertheless: Still no ++ for the answer because rand is not something I would consider a good solution for permutation. So it's not worth a good reputation. Neither is mine so the (currently) -1 is okay

        $\=~s;s*.*;q^|D9JYJ^^qq^\//\\\///^;ex;print
Re: generate combinations of lists
by planetscape (Chancellor) on Sep 28, 2005 at 05:13 UTC

    Please see this. Show us what you have already tried in order to solve the problem yourself.

    HTH,

    planetscape
Re: generate combinations of lists
by kprasanna_79 (Hermit) on Sep 28, 2005 at 07:16 UTC
    Hi gpm,

    Can u please check Link. U may get some better idea to finish your task easier.

    -Prasanna.K
Re: generate combinations of lists
by Skeeve (Vicar) on Sep 28, 2005 at 07:19 UTC
    Sounds like homework and I don't think the second answer is the one the teacher wants to see ;-)

    $\=~s;s*.*;q^|D9JYJ^^qq^\//\\\///^;ex;print

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (16)
As of 2015-07-30 15:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (272 votes), past polls