Autor Beitrag
bfelix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61

WIN 2000 Prof., Win XP Prof., Win 7 Starter und Prof., SuSe Linux 11.3,
Delphi 7 Pers.
BeitragVerfasst: Di 22.03.11 17:00 
Hallo Community,
ich würde gerne einen Algorithmus machen, der alle Buchstaben Kombinationen aus einem bestimmten Vorratsstring mit einer bestimmten Länge findet. Mein Ansatz:
1. Length(vorrat)^(Anzahl Buchstaben-1) mal die Zeichen von vorrat hintereinanderschreiben in TStrings: (dabei hoch eine eigene Funktion zur Potenz, vorrat der Vorratsstring und laenge die Länge der Ausgabestrings)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for i:=0 to hoch(Length(vorrat,laenge-1)) do begin
  for j:=1 to Length(vorrat) do begin
    strs.Items.Add(vorrat[j]);
  end;
end;


2. Weiter fällt mir leider nichts ein...

Kann mir irgendwer wenigstens einen Ansatz geben?

Danke im Vorraus,
BFelix
Chrischuh
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 124
Erhaltene Danke: 1

Win 7
Turbo Delphi
BeitragVerfasst: Di 22.03.11 17:17 
Hi,

meinst du mit deiner Beschreibung Anagramme? Was soll dein Algorithmus können? Könntest du ein Beispiel für einen Vorratsstring geben? Und was der Algorithmus daraus machen soll?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 22.03.11 17:25 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function MaxKombinations(Len: integer; const Chars: string): Int64;
var
  Factor            : Int64;
begin
  Result := 0;
  Factor := 1;
  while Len > 0 do
  begin
    dec(Len);
    Result := Result + Factor;
    Factor := Factor * Length(Chars);
  end;
end;

function BruteForce(Nb: Int64; Chars: string): string;
begin
  Result := '';
  while Nb > Length(Chars) do
  begin
    dec(Nb);
    Result := Chars[Nb mod Length(Chars) + 1] + Result;
    Nb := Nb div Length(Chars);
  end;
  if Nb > 0 then
    Result := Chars[Nb] + Result;
end;

Aufruf mit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
MaxChars := MaxKombinations(MinLen, Chars);
  while (length(s) <= Maxlen) and (not Terminate) do
  begin
    s := BruteForce(MaxChars, Chars);
bfelix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61

WIN 2000 Prof., Win XP Prof., Win 7 Starter und Prof., SuSe Linux 11.3,
Delphi 7 Pers.
BeitragVerfasst: Di 22.03.11 17:43 
Könntest du mir mal kurz beschreiben was genau der Code macht und was die Parameter bedeuten??

Danke,
BFelix
bfelix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 61

WIN 2000 Prof., Win XP Prof., Win 7 Starter und Prof., SuSe Linux 11.3,
Delphi 7 Pers.
BeitragVerfasst: Di 22.03.11 17:56 
Gut, ich habe jetzt noch einen Ansatz:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
for i:=1 to Length(vorrat) do begin
  for j:=1 to Length(vorrat) do begin
    for u:=1 to Length(vorrat) do begin
      for m:=1 to Length(vorrat) do begin
        erg:='';
        erg:=erg+vorrat[i];
        erg:=erg+vorrat[j];
        erg:=erg+vorrat[u];
        erg:=erg+vorrat[m];
        erg1.Add(erg);
      end;
    end;
  end;
end;

Dabei ist erg ein String und erg1 eine Stringliste für das Ergebnis
Es bibt dann ja eine Liste mit allen Kombinationen mit 4 Buchstaben aus.
Aber wie kann ich das so in einer Schleife verpacken, dass es alle Kombinationen mit der Länge x ausgibt??

Danke,
BFelix
Chrischuh
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 124
Erhaltene Danke: 1

Win 7
Turbo Delphi
BeitragVerfasst: Di 22.03.11 18:55 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Kombinationen(Vorrat: string; laenge: Integer; Zwischenspeicher: string; Liste: TStrings);
var i:integer;s:string;
begin
   dec(laenge);
   for i := 1 to length(vorrat) do
   begin
     s:=Zwischenspeicher + Vorrat[i];
     if laenge>0 then Kombinationen(vorrat,laenge, s, liste) else
     liste.Add(s);

   end;

end;


Das ist die Prozedur. Hoffe das ist so richtig.
So ist der Aufruf:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.Clear;
Kombinationen(edit1.Text,4,'',Memo1.Lines);
end;


bzw

ausblenden Delphi-Quelltext
1:
Kombinationen(Vorratsstring,Maximale_länge,'',Ziel_TStrings);					


Hoffe das ist das was du suchst.

Es wird jedes mögliche zeichen an den Anfang gesetzt. Und dann wird die Funktion einfach solange erneut aufgerufen, bis die strings lang genug sind.