我尝试按以下要求创建所有ASCII字母(至少是拉丁字母)的所有可能组合的.txt文件:
一个。 1-5个字母
B. a-z(以及这些信件的所有可能情况)
C.第1和第2,第2和第3,第3和第4之间的空间&第4和第5,适用于所有可能的组合。
例如:
a,
b,
c,
aa,
bb,
cc,
a bc,
aa b,
aaa cz,
ga l qa,
p j asd,
n ljas,
asdl q,
a q j o z;
etc. etc.
-----
我尝试过使用PHP&amp ;;正则表达但它超出了我的联盟,因为在写这个剧本时我不能错过任何一场比赛。
非常感谢任何帮助!
答案 0 :(得分:1)
以下是一个常规实现,可以轻松修改以处理不同的字符集letters
和最大长度n
。
请注意,我注释了maxLength
和letters
的原始值,并选择maxLength = 3
和letters = "ABC"
进行测试。实际上,我不认为计算所有必需的组合是易处理的。我没试过。
import itertools
# maxLength = 5
# letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
maxLength = 3
letters = "ABC"
for length in range(1, maxLength + 1):
string = [""] * (2 * length - 1)
for combination in itertools.product(letters, repeat=length):
string[::2] = combination
for blanks in itertools.product(["", " "], repeat=length-1):
string[1::2] = blanks
print "".join(string)
输出:
A
B
C
AA
A A
AB
A B
.
.
.
CCB
CC B
C CB
C C B
CCC
CC C
C CC
C C C
答案 1 :(得分:0)
可以使用Algorithm::Combinatorics
执行此操作。
使问题更简单的一个技巧是认识到"a"
和" a"
可以被视为两个不同的字母,所以我们实际上只处理一组52个可能的字母(上部和下部)后跟104个可能的字母组(上部和下部,前缀带或不带空格)。
以下脚本演示了一个小得多的排列转换:
use strict;
use warnings;
use Algorithm::Combinatorics qw(variations_with_repetition);
#my $maxlength = 5;
#my @letters = ( 'a' .. 'z', 'A' .. 'Z' );
my $maxlength = 3;
my @letters = ( 'a' .. 'c' );
for my $prefix (@letters) {
print "$prefix\n";
for my $length ( 1 .. $maxlength - 1 ) {
my $iter = variations_with_repetition( [ map { ( $_, " $_" ) } @letters ], $length );
while ( my $p = $iter->next ) {
print $prefix, @$p, "\n";
}
}
}
输出:
a
aa
a a
ab
a b
ac
a c
aaa
aa a
aab
aa b
aac
aa c
a aa
a a a
a ab
a a b
a ac
a a c
aba
ab a
abb
ab b
abc
ab c
a ba
a b a
a bb
a b b
a bc
a b c
aca
ac a
acb
ac b
acc
ac c
a ca
a c a
a cb
a c b
a cc
a c c
b
ba
b a
bb
b b
bc
b c
baa
ba a
bab
ba b
bac
ba c
b aa
b a a
b ab
b a b
b ac
b a c
bba
bb a
bbb
bb b
bbc
bb c
b ba
b b a
b bb
b b b
b bc
b b c
bca
bc a
bcb
bc b
bcc
bc c
b ca
b c a
b cb
b c b
b cc
b c c
c
ca
c a
cb
c b
cc
c c
caa
ca a
cab
ca b
cac
ca c
c aa
c a a
c ab
c a b
c ac
c a c
cba
cb a
cbb
cb b
cbc
cb c
c ba
c b a
c bb
c b b
c bc
c b c
cca
cc a
ccb
cc b
ccc
cc c
c ca
c c a
c cb
c c b
c cc
c c c
为了好玩,我创建了一个通过排列工作的脚本,并在后缀中添加了空格:
use strict;
use warnings;
use Algorithm::Combinatorics qw(variations_with_repetition);
use List::MoreUtils qw(mesh);
#my $maxlength = 5;
#my @letters = ( 'a' .. 'z', 'A' .. 'Z' );
my $maxlength = 3;
my @letters = ( 'a' .. 'c' );
for my $length ( 1 .. $maxlength ) {
my $iter = variations_with_repetition( \@letters, $length );
while ( my $p = $iter->next ) {
print @$p, "\n";
for my $spaces ( 1 .. 2**( $length - 1 ) - 1 ) {
my @spaces = (map({$_ ? ' ' : ''} split //, sprintf "%0*b", $length - 1, $spaces), '');
print mesh(@$p, @spaces), "\n";
}
}
}