Entwickler-Ecke
Algorithmen, Optimierung und Assembler - ermittlung von allen Kombinationen
Mario Elßner - Sa 07.12.13 15:37
Titel: ermittlung von allen Kombinationen
Hallöle,
Zufallsgeneratoren gibt es ja viele aber wie kann ich aus den Buchstaben W,A,S,D mit einer zeichenlänge von 3 alle möglichen kombinationen ausgeben ohne sie doppelt zu haben?
Bin noch recht frisch und noch am lernen und wäre über Hilfe dankbar.
Danke im voraus
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am So 08.12.2013 um 17:21
Mario Elßner - Sa 07.12.13 18:27
So, habe mal etwas rumgebastelt soweit funzt das auch mit nur einem kleinen problemchen.
Die Ausgabe erfolgt über eine Listbox allerdings wird in jede nur 1 buchstabe gesetzt.
Folgendes ich habe nur die Buchstaben WASD zur Verfügung un daraus sollen mögliche kombinationen erzeugt werden mit einer länge von 3zeichen doppelte sollten in der listbox nicht eingetragen werden.
Jetzt erstellt allerdings mein script immer nur 1 zeichen in jede zeile und ist daher nach 3 zeilen fertig..
Man wo habsch da was vergessen??? kann mir d einer helfen....
Hier der Code:
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: 27:
| procedure TForm1.Button2Click(Sender: TObject); var sLen: Integer; i: Integer; zahl: String; exists: Boolean; pool : String;
begin
sLen := 3; Randomize; pool := 'WASD'; Listbox1.Clear;
repeat zahl := ''; zahl := pool[Random(Length(pool))+1]; exists := false; for i := 0 to ListBox1.Count - 1 do begin If zahl = ListBox1.Items.Strings[i] then exists := true; end; If not exists then ListBox1.Items.Add(zahl); until ListBox1.Count = sLen;
end; |
Danke für die Hilfe...
Delete - Sa 07.12.13 19:19
Die erste Aufgabe beim Programmieren besteht darin, das Problem sorgfältig zu analysieren. Die Betonung liegt dabei auf sorgfältig, wie du an der Fettschreibung vielleicht schon vermutet hast. Okay, dann mal los:
Du hast also einen String mit den vier Zeichen WASD. Okay. Daraus möchtest du alle möglichen dreistelligen Kombinationen ermitteln und anzeigen lassen. Da es sich dabei nicht um die Resultate irgend eines Zufalls handelt, wird auch kein Random benötigt, sondern solide Rechenarbeit. Im Folgenden werde ich die Zeichenposition im Pool-String, wie du ihn nennst, mit 1,2,3 und 4 bezeichnen.
1. Kombination: 1,1,1
2. Kombination: 1,1,2
3. Kombination: 1,1,3
4. Kombination: 1,1,4
5. Kombination: 2,1,1
6. Kombination: 2,1,2
7. Kombination: 2,1,3
8. Kombination: 2,1,4
9. Kombination: 3,1,1
...
So würde die Reihe beginnen, ohne die Bedingung, doppelte Zeichen im Zielstring zu vermeiden. Jetzt versuche erst einmal, das programmtechnisch umzusetzen. Wenn du das erledigt hast, überlegst du, wie du es anstellen mußt, daß keine doppelten Zeichen erscheinen.
Übrigens funzt dein Code eben nicht soweit, denn er macht nicht annähernd das, was du damit beabsichtigt hattest. Ach ja, hätte ich fast vergessen: Lerne Grundlagen, am besten mit einem guten Delphi-Einsteiger-Tutorial.
Horst_H - So 08.12.13 17:10
Hallo,
Zitat: |
1. Kombination: 1,1,1
2. Kombination: 1,1,2
3. Kombination: 1,1,3
4. Kombination: 1,1,4
5. Kombination: 2,1,1
6. Kombination: 2,1,2 |
Halte ich für nicht für logisch, eher:
Zitat: |
1. Kombination: 1,1,1
2. Kombination: 1,1,2
3. Kombination: 1,1,3
4. Kombination: 1,1,4
5. Kombination: 1,2,1
6. Kombination: 1,2,2 |
Was gesucht wird ist in etwa:
http://www.entwickler-ecke.de/viewtopic.php?t=74423&postorder=asc&start=40
mit
Delphi-Quelltext
1: 2: 3: 4:
| const KombLaenge =3 ; KL_1 = KombLaenge-1; n = KombLaenge+1; |
und in Init
Nun ja, nicht wirklich hilfreich...
Gruß Horst
Mathematiker - So 08.12.13 18:47
Hallo,
hathor hat folgendes geschrieben : |
Ist unser Mathematiker nicht da? |
Doch, ich bin schon da, nur ständig gebe ich komische Geräusche von mir: nies, hust, hatschi, krrrr ... Blöde Erkältung! :evil:
Wenn er aus 4 verschiedenen Buchstaben alle Zusammenstellungen von 3 Elementen sucht, die Buchstaben mehrfach auftreten können und die Reihenfolge wichtig ist, so sind es Variationen mit Wiederholungen. Bei n Elementen und k Ausgewählten gibt es dann n hoch k mögliche. An jeder der k Stellen können n verschiedene Buchstaben stehen.
Bei einer Länge von 3; die vier Buchstaben stehen im Feld Buchstabe: Array[1..4] of char; geht es wohl noch mit 3 Schleifen (ungetestet!):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure Variation; var i,j,k : integer; s : string; begin for i:=1 to 4 do begin for j:=1 to 4 do begin for k:=1 to 4 do begin s:=buchstabe[i]+buchstabe[i]+buchstabe[k]; end; end; end; end; |
Werden die Wörter länger, wird man wohl anders herangehen müssen.
Sucht
Mario Elßner tatsächlich Kombinationen, d.h. die Reihenfolge ist uninteressant, dann geht es so nicht.
Beste Grüße und Hatschi!!!!!
Mathematiker
Hoffentlich erzähle ich, hatschi, keinen Unsinn, nies.
Delete - So 08.12.13 18:56
Ja, die Infektionsgefahr kann man auch berechnen - vielleicht so: Anzahl Kontakt-Personen * Anzahl Kontakt-Personen...
Auch hier gilt die Regel: Von NICHTS kommt NICHTS.
GUTE BESSERUNG!
Übrigens:
Hier gibt es die Lösung in DELPHI...
http://www.swissdelphicenter.ch/de/showcode.php?id=1032
Definition: Permutation
A permutation is an arrangement of n objects, arranged in groups of size r
without repetition where order is important.
P(n,r) = n! / (n-r)!
Example: Find all 3-letter permutations of the letters "WASD"
n = WASD
r = 3
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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| program Tip1032; {$APPTYPE CONSOLE}
uses SysUtils;
var R, Slen: Integer;
procedure P(var A: string; B: string); var J: Word; C, D: string; begin if Length(B) = SLen - R then begin Writeln(' {' + A + '} '); end else for J := 1 to Length(B) do begin C := B; D := A + C[J]; Delete(C, J, 1); P(D, C); end; end;
var Q, S, S2: string; begin S := ' '; S2 := ' '; Writeln(''); Writeln(''); Write('P(N,R) N=? : '); S:= 'WASD'; SLen := Length(S); Write('P(N,R) R=? : '); S2:='3'; R := StrToInt(S2); Writeln(''); Q := ''; P(Q, S); Readln; end. |
Alternativ:
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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| procedure TForm1.Button1Click(Sender: TObject); var R, Slen: Integer;
procedure P(var A: string; B: string); var J: Word; C, D: string; begin if Length(B) = SLen - R then begin Memo1.lines.add(A); end else for J := 1 to Length(B) do begin C := B; D := A + C[J]; Delete(C, J, 1); P(D, C); end; end;
var Q, S, S2: string; begin S := ' '; S2 := ' '; S:= 'WASD'; SLen := Length(S); S2:='3'; R := StrToInt(S2); Q := ''; P(Q, S); end; |
Ergebnis:
WAS
WAD
WSA
WSD
WDA
WDS
AWS
AWD
ASW
ASD
ADW
ADS
SWA
SWD
SAW
SAD
SDW
SDA
DWA
DWS
DAW
DAS
DSW
DSA
Falls z.B. SDA und DSA als doppelt gelten, müsste man sie noch heraus filtern...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!