Hallo,
ich habe mal die Version von Gammatester erweitert.
Was mich stutzig machte war die Angabe einer Zeichenmenge von '11', was so nicht geht.
Es geht doch um die Erstellung aller Variationen aus einer Zeichenmenge mit einer Länge von 1 bis maxlen, und dabei müßen die Elemente der Menge alle verschieden sein.
Delphi-Quellcode:
{$apptype console}
program kette;
uses
sysutils,classes;
function MaxCountVariation(AnzahlverschiedeneZeichen,MaxLaengeAusgabe:cardinal):Int64;
var
i : integer;
begin
result := 0;
IF MaxLaengeAusgabe> 0 then
begin
try
// r = (q^(n+1)-1 )/(q-1) -1
//q= AnzahlverschiedeneZeichen;n = MaxLaengeAusgabe
result := AnzahlverschiedeneZeichen;
For i := 1 to MaxLaengeAusgabe do
result := result * AnzahlverschiedeneZeichen;
result := (result -1) div (AnzahlverschiedeneZeichen-1)-1;
except
writeln('Zuviele Möglchkeiten');
halt(-2);
end;
end;
end;
function BereinigeZeichenvorrat(ZV:string):string;
// keine doppelten Zeichen
var
i,j: integer;
begin
i := 1;
while length(ZV)>i do
begin
j := i+1;
while j <=length(ZV) do
begin
IF ZV[i]=ZV[j] then
delete(ZV,j,1)
else
inc(j);
end;
inc(i);
end;
result := ZV;
end;
function ErzeugeVariationen(ZeichenVorrat:string;
Laenge:integer;
out SL:TStringlist):boolean;
var
pre : string;
procedure genlen(len: integer);
var
i: integer;
begin
IF len = 1 then
for i:=1 to length(Zeichenvorrat) do
begin
pre[len]:=Zeichenvorrat[i];
SL.Add(pre)
end
else
for i:=1 to length(Zeichenvorrat) do
begin
pre[len]:=Zeichenvorrat[i];
genlen(len-1)
end;
end;
var
len,
cap : integer;
begin
Zeichenvorrat := BereinigeZeichenvorrat(Zeichenvorrat);
result := false;
SL.clear;
try
cap := MaxCountVariation(length(Zeichenvorrat),Laenge);
IF cap < 1000000 then
begin
SL.capacity := MaxCountVariation(length(Zeichenvorrat),Laenge);
for len:=1 to Laenge do
begin
setlength(pre,len);
genlen( len);
end;
result := true;
if SL.count < 10000 then
writeln(SL.text);
end
else
writeln('Zuviele Moeglichkeiten: ',cap,#13#10);
finally
end;
end;
var
VariationenListe: TStringlist;
BEGIN
VariationenListe:= TStringlist.create;
try
ErzeugeVariationen('01',2,VariationenListe);
ErzeugeVariationen('010101010101010101',2,VariationenListe);
ErzeugeVariationen('0111110000',2,VariationenListe);
ErzeugeVariationen('12345',1,VariationenListe);
finally
VariationenListe.free;
end;
END.
Ausgabe leicht anders als bei gammatester, da die Zeichenfolge rückwärts erstellt wird.
Code:
0
1
00
10
01
11
0
1
00
10
01
11
0
1
00
10
01
11
1
2
3
4
5
11
21
31
41
51
12
22
32
42
52
13
23
33
43
53
14
24
34
44
54
15
25
35
45
55