Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

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

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


    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"; }


    bash-3.00$ ./ 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 ;-)

        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.


        ++ 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

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.


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.

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 ;-)


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://495627]
Approved by planetscape
[stevieb]: yeah, so the wiringPi library appears to be missing/injecting incorrect defined variables into I2C calls, and it's all over the map. I'm going to have to revisit and use something else, write something else, or scrutinize the code and fix

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (3)
As of 2017-06-23 00:06 GMT
Find Nodes?
    Voting Booth?
    How many monitors do you use while coding?

    Results (532 votes). Check out past polls.