Autor Beitrag
Die Brotmafia
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Win XP Suse Linux 9.3
Delphi 7 Enterprise, Delphi 2005
BeitragVerfasst: Di 04.03.08 16:17 
Also, ich arbeite gerade an einem kleinen Projekt welches ih mir in den Kopf gesetzt habe. Wer schon mal Prison Break gesehen hat: Es gibt da diesen Typen welcher Origami-Figuren bastelt und dabei geheime Nachrichten verschickt. Dies funktioniert folgendermaßen:

Er schreibt eine bestimmte Zahl, z.B. 565. Ihr alle habt ein Handy. An diesen Tasten wiederum steht jede Zahl für 3-4 Buchstaben. Jede der Zahlen steht also für einen der Buchstaben, welchen weis ich nicht. Für 5 käme also beispielsweise j, k oder l in Frage, für 6 käme m, n oder o in Frage wie ihr ja einfach an eurer Handy-Tastatur ablesen könnt.

In diesem Fall könnte man aus 565 die Kombination "lol" oder etliche andere kombinationen welche keinen Sinn ergeben formulieren. Ich will nun, dass mir Delphi alle möglichen Kombinationen in eine Memo-Box schreibt.

Ich will ein Programm schreiben, welches mir zu einer bestimmten Zahlenkombination (beliebig viele Zahlen) alle damit bildbaren möglichkeiten in ein Memo schreibt. Ich will also z.b. für 565 jede einzelne der Kombinationen angezeigt bekommen, was ziemlich viele sein könnten (weis jemand wie man die Anzahl der Möglichkeiten da ausrechnet? Mathe?)...

In den ersten Minuten bin ich jetzt soweit gekommen:
ausblenden volle Höhe 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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function Berechne(): string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.Berechne(): string;
var Zahl: integer; Buchstabe: string;
begin
 Zahl:=strtoint(Form1.Edit1.Text);
 if Zahl <= 1 then begin
  Buchstabe:='a';
  end
 else
 if Zahl > 1 then begin
  Buchstabe:='b';
  end;
 Result:=Buchstabe;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo1.Lines.Add(Berechne);
end;

end.


Und habe jetzt keine Ahnung wies weitergehen soll. Die Function ist nur als Beispiel gedacht. Was ich im Prinzp tun muss:

Als erstes die Zahlenkombination (z.b. 5678) welche in der Edit-Box steht in einzelne Zahlen aufsplitten, sodass ich die integerzahlen 5 6 7 8 habe und eben nicht alle zusammen. Weis jemand wie das gehen könnte?

Als zweites sollte man dann alle möglichkeiten in die Memo-Box schreiben, ich hab keinen Plan wie ich das ganze (auch auf theoretischer Ebene) umsetzen kann, dass Delphi die jeweiligen Buchstaben in allen möglichen Kombinationen aufschreibt...

Nochmal Beispiel wer es nicht verstanden hat: Ich gebe als Zahl nur 5 ein. Dann wird im Memo angezeigt: j k l jeder Buchstabe in einer einzelnen Zeile. Das sind die möglichen "kombinationen". Gebe ich als Zahlen 5 und 6 ein will ich alle möglichen Kombinationen aus beiden Zahlen, beispielsweise jm, jn, jo, km, kn, ko usw....

Falls ihr das Prinzip noch nicht verstanden habt fragt bitte nochmal nach. Ich bin für alle Tipps dankbar!

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Mi 05.03.08 09:44 
user profile iconDie Brotmafia hat folgendes geschrieben:


Falls ihr das Prinzip noch nicht verstanden habt fragt bitte nochmal nach. Ich bin für alle Tipps dankbar!


Die Lösung schreit einfach nach Rekursion.

Hier die Lösung, ohne Kommentar, das Verstehen des Codes ist zum selbsterarbeiten, irgendwas musst du ja auch selbst machen ;)

ausblenden volle Höhe 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:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
unit prison;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type AInt = Array of Integer;

type TTaste = record
  typen : Array of Char;
  Items : Integer;
end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    tastenfeld : Array[2..9] of TTaste;
    function decode(text:String): AInt;
    procedure Init;
    procedure rekursiv2(liste: AInt; tiefe: Integer; str: String);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.rekursiv2(liste:AInt;tiefe:Integer;str:String);
var temp : String;
    i, aktitem : Integer;
begin
  aktitem := 0;
  if tiefe < length(liste)-1 then
  begin
    while aktitem < tastenfeld[liste[tiefe]].Items do
    begin
      temp := str + tastenfeld[liste[tiefe]].typen[aktitem];
      rekursiv2(liste,tiefe+1,temp);
      inc(aktitem);
    end;
  end
  else
  begin
    for I := 1 to tastenfeld[liste[tiefe]].Items do
    begin
      temp := str + tastenfeld[liste[tiefe]].typen[i-1];
      memo1.Lines.Add(temp);
    end;
  end;
end;

function TForm1.decode(text:String):AInt;
var
  i: Integer;
  rueckgabe : AInt;
begin
  setlength(rueckgabe,length(text));
  for i := 1 to length(text) do
    rueckgabe[i-1] := StrToInt(text[i]);
  result := rueckgabe;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Init;
end;

procedure TForm1.Init;
begin
  setlength(tastenfeld[2].typen,3);
  setlength(tastenfeld[3].typen,3);
  setlength(tastenfeld[4].typen,3);
  setlength(tastenfeld[5].typen,3);
  setlength(tastenfeld[6].typen,3);
  setlength(tastenfeld[7].typen,4);
  setlength(tastenfeld[8].typen,3);
  setlength(tastenfeld[9].typen,4);
  tastenfeld[2].typen[0] := 'A';
  tastenfeld[2].typen[1] := 'B';
  tastenfeld[2].typen[2] := 'C';
  tastenfeld[3].typen[0] := 'D';
  tastenfeld[3].typen[1] := 'E';
  tastenfeld[3].typen[2] := 'F';
  tastenfeld[4].typen[0] := 'G';
  tastenfeld[4].typen[1] := 'H';
  tastenfeld[4].typen[2] := 'I';
  tastenfeld[5].typen[0] := 'J';
  tastenfeld[5].typen[1] := 'K';
  tastenfeld[5].typen[2] := 'L';
  tastenfeld[6].typen[0] := 'M';
  tastenfeld[6].typen[1] := 'N';
  tastenfeld[6].typen[2] := 'O';
  tastenfeld[7].typen[0] := 'P';
  tastenfeld[7].typen[1] := 'Q';
  tastenfeld[7].typen[2] := 'R';
  tastenfeld[7].typen[3] := 'S';
  tastenfeld[8].typen[0] := 'T';
  tastenfeld[8].typen[1] := 'U';
  tastenfeld[8].typen[2] := 'V';
  tastenfeld[9].typen[0] := 'W';
  tastenfeld[9].typen[1] := 'X';
  tastenfeld[9].typen[2] := 'Y';
  tastenfeld[9].typen[3] := 'Z';
  tastenfeld[2].Items := length(tastenfeld[2].typen);
  tastenfeld[3].Items := length(tastenfeld[3].typen);
  tastenfeld[4].Items := length(tastenfeld[4].typen);
  tastenfeld[5].Items := length(tastenfeld[5].typen);
  tastenfeld[6].Items := length(tastenfeld[6].typen);
  tastenfeld[7].Items := length(tastenfeld[7].typen);
  tastenfeld[8].Items := length(tastenfeld[8].typen);
  tastenfeld[9].Items := length(tastenfeld[9].typen);
end;

procedure TForm1.Button1Click(Sender: TObject);
var Liste : AInt;
begin
  memo1.clear;
  Liste := decode(Edit1.Text);
  rekursiv2(Liste,0,'');
  Label1.Caption := 'Gefundene Kombinationen :'+IntToStr(memo1.Lines.Count);
end;

end.


was an Komponenten gebraucht wird geht aus dem Code hervor, dann einfach in das Edit1 die Kombination eintragen, zB. 23456 oder so und den Button drücken. Die Ziffern müssen zwischen 2 und 9 liegen, es werden nur die normalen Buchstaben verwendet.

_________________
mfg. Joel
Die Brotmafia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Win XP Suse Linux 9.3
Delphi 7 Enterprise, Delphi 2005
BeitragVerfasst: Mi 05.03.08 16:54 
Woah, das ist Hammer! Ihr seid echt super! Als erstes mache ich jetzt ein Tutorial was ein array ist usw... um das ganze zu verstehen. Wenn ich es erstmal kapiert habe werde ich das Programm erweitern:

Man sollte die Ergebnisse mit einer Wortliste (in txt Datei oder was auch immer) abgleichen können und die Wörter welche es auch wirklich gibt abgleichen sodass man auf einige wenige sinvolle Ergebnisse kommen kann. Danke für eure Hilfe, :-)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 05.03.08 17:09 
user profile iconDie Brotmafia hat folgendes geschrieben:
Woah, das ist Hammer! Ihr seid echt super! Als erstes mache ich jetzt ein Tutorial was ein array ist usw... um das ganze zu verstehen.
www.christian-stelzm...oaded/#_Toc180058868

user profile iconDie Brotmafia hat folgendes geschrieben:
Man sollte die Ergebnisse mit einer Wortliste (in txt Datei oder was auch immer) abgleichen können und die Wörter welche es auch wirklich gibt abgleichen sodass man auf einige wenige sinvolle Ergebnisse kommen kann. Danke für eure Hilfe, :-)
Für Fragen dazu dann bitte jeweils ein neues Topic erstellen :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".