Gossamer Forum
Home : General : Perl Programming :

Combinations

Quote Reply
Combinations
Hello i wanted to know if somebody can help me in as carrying out combinations with defined characters. Example:

@car=(a,b,c,d,e,f);

then they were carried out this way all the possible combinations with a,b,c,d,e,f:

to
ab
abc
abcd
abcdef
ac
ad
aefcd
etc.

and to print in screen or in a file.

thank you for any suggestion
Quote Reply
Re: Combinations In reply to
I don't exactly understand. Which of the lines will it match?

Anyhow, I would go through the file line by line and grep each one. Then, if I got a certain amount of matches, I would print or push to an array to print later.

------------------
WFMY-TV Webmaster
Quote Reply
Re: Combinations In reply to
The way I look to the problem is:
You have 6 slots, and each slot can have one of the 7 different characters (including space character).

Eventually there are 7^6= 117649 possibilities (combinations). You will end up with several megabites of text file at the end.

@chars=("a", "b", "c", "d", "e", "f", " ");

for $i (@chars){
for $ii (@chars){
for $iii (@chars){
for $iiii (@chars){
for $iiiii (@chars){
for $iiiiii (@chars){

$line = $i . $ii . $iii . $iiii . $iiiii . $iiiiii;
unless($line =~ m# [^ ]#){
print FILE "$line\n";
}

}
}
}
}
}
}

Baris.

------------------
Turk Scripts
turkiyem.com/turkscripts

[This message has been edited by sumengen (edited January 11, 2000).]

[This message has been edited by sumengen (edited January 11, 2000).]
Quote Reply
Re: Combinations In reply to
Slight modification to a really nice solution for the same type question, posted on Usenet by Kevin Campbell on 11/9/99:

Code:
#!/usr/bin/perl -w

my @mylist=qw/a b c d e f/;
my @comb=combinations(@mylist);
foreach(@comb){
$temp = join('',@$_) . "\n";
push (@temp, $temp);
}

print sort @temp;

sub combinations{
my @result=([]);
my @list=@_;

foreach my $item (@list){
@result=map {[@$_],[@$_,$item]} @result;
}
shift @result; #get rid of the empty entry
return @result;
}

--mark
Quote Reply
Re: Combinations In reply to
Thank you, will I prove the 2 codes, do I suppose that it is necessary as increasing characters, truth?.
But it takes or tomorrow I comment them I eat up it was.
Again thank you.
Quote Reply
Re: Combinations In reply to
sumengen:

I stay the following code:

Code:
#!E:\Perl\bin\perl -w

open(FILE,">comb.txt");

$num_chars = 10;

@chars=("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "ñ", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "_", "");

for $i (@chars){
for $ii (@chars){
for $iii (@chars){
for $iiii (@chars){
for $iiiii (@chars){
for $iiiiii (@chars){
for $iiiiiii (@chars){
for $iiiiiiii (@chars){
for $iiiiiiiii (@chars){
for $iiiiiiiiii (@chars){
for $iiiiiiiiiii (@chars){
for $iiiiiiiiiiii (@chars){
for $iiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){
for $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii (@chars){

$line = $i . $ii . $iii . $iiii . $iiiii . $iiiiii . $iiiiiii . $iiiiiiii . $iiiiiiiii . $iiiiiiiiii . $iiiiiiiiiii . $iiiiiiiiiiii . $iiiiiiiiiiiii . $iiiiiiiiiiiiii . $iiiiiiiiiiiiiii . $iiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii . $iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii;
unless($line =~ m# [^ ]#){
print FILE "$line\n";
}

}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

close(FILE);

and it works well of not being because they repeat some combinations. For that adds "" I believe that a subroutine could be added so that opens the file and eliminate the repeated combinations and leaves them orderly.

A thing that can observe when adding the whole alphabet in uppercase and minuscule with the numbers and some signs that a file is believed of but of 100MB. For what I believe that serious good to add a variable $charsl=8 so that the combinations are maximum of 8 characters.
Example:

aaa
aaaa
aaaaaaaa
abacgfa
aaaanbhio
etc.

As I can make it.
Quote Reply
Re: Combinations In reply to
Mark Badolato:

I am presented the following error:
Missing $ on loop variable at comb.pl line 15.

When trying to execute the following code

Code:
#!E:\Perl\bin\perl -w
my @mylist=qw/a b c d e f/;
my @comb=combinations(@mylist);
foreach(@comb){
$temp = join('',@$_) . "\n";
push (@temp, $temp);
}

print sort @temp;

sub combinations {
my @result=([]);
my @list=@_;

foreach my $item (@list){
@result=map {[@$_],[@$_,$item]} @result;
}
shift @result; #get rid of the empty entry
return @result;
}

Which the problem is?

Additionally serious good to add a variable ' $charsl= 10 ' so that they are carried out the combinations until a maximum of 10 characters, for example:
to
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa
ab
aba
abbbcd
etc.

as I make it?