Autor Beitrag
-delphin-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mo 16.05.05 14:57 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.bStartClick(Sender: TObject);
const
  //Definieren der Buchstaben
  buchstaben: array [1..26of string =
    ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
var laenge,i: integer;
begin
  randomize;
  i := 0;
  i := i+1;
  ELaenge.Text:=IntToStr(laenge);
  //Schleife für zufälliges Aneinanderreihen von Buchstaben
  for i:=0 to laenge do
    begin
      //Problem: Was kommt in die Klammer?
      MAusgabe.Lines.Add(random(IntToStr(buchstaben)));
    end;
end;

end.


Also ich würde gerne ein prog machen, ähnlich den NameGen, das mir in einem Memofeld Buchstaben des Alphabets zufällig aneinander reiht. Vll könnte mal jemand über den Quelltext schauen. Ich bräuchte nämlich einen Befehl, den ich in die Klammer beim Memofeld eintragen kann, der dafür sorgt, dass der PC sich Zufallszahlen von 1-26 raussucht, die nach dem Array in Buchstaben umwandelt und so ein "Wort" in das Memofeld schreibt.
Danke (;


Moderiert von user profile iconChristian S.: Topic aus Multimedia / Spiele / Grafik verschoben am Mo 16.05.2005 um 15:11
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 16.05.05 15:02 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.bStartClick(Sender: TObject);  
const  
  buchstaben: array [1..26of string = ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');  
var 
  laenge, i: integer;  
  Buchstabe, str: string;
begin  
  randomize;  
  str := '';
  laenge := strtoint(ELaenge.text);
  for i := 1 to laenge do  
    begin  
      Buchstabe := buchstaben[random(26) + 1];
      str := str + Buchstabe;         
    end;  
  MAusgabe.Lines.Add(str);
end;


Zuletzt bearbeitet von F34r0fTh3D4rk am Mo 16.05.05 15:21, insgesamt 3-mal bearbeitet
DarkHunter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 477

Win XP
D3 Prof, D2005 PE
BeitragVerfasst: Mo 16.05.05 15:07 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.bStartClick(Sender: TObject);
const
  //Definieren der Buchstaben
  buchstaben: array [1..26of string =
    ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
var laenge,i: integer;
begin
  randomize;
  i := 0;

Soweit Gut, aber jetzt wird es merkwürdig.
ausblenden Delphi-Quelltext
1:
  i := i+1;					

welchen Sinn hat das bitte?
ausblenden Delphi-Quelltext
1:
  ELaenge.Text:=IntToStr(laenge);					

Was machst du da? Willst du die Länge aus dem Editfeld abfragen? Dann musst du das Umdrehen

Der Rest muss dann so aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  
//Schleife für zufälliges Aneinanderreihen von Buchstaben
  for i:=0 to laenge do
    begin
      MAusgabe.Lines.Add(buchstaben[random(buchstaben.count)+1]); // so muss das aussehen ;)
    end;
end;

end.


Edit: Mist F34r war schneller :(


Zuletzt bearbeitet von DarkHunter am Mo 16.05.05 15:10, insgesamt 1-mal bearbeitet
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 16.05.05 15:08 
oder man guckt sich meine variante an, die funktioniert und leicht verständlich ist 8)
DarkHunter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 477

Win XP
D3 Prof, D2005 PE
BeitragVerfasst: Mo 16.05.05 15:12 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
oder man guckt sich meine variante an, die eigentlich funktionieren müsste und leicht verständlich ist 8)


stimmt, ich habe mir nur seinen Quellcode angeschaut, deine ist wirklich besser. nur ich wollte seinen Code so gut es geht übernehmen, wobei mir gerade aufgefallen ist das
MAusgabe.Lines.Add() sinnlos ist, da es sonst jeder Buchstabe untereinader und nicht hintereinander gepackt wird.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 16.05.05 15:15 
Die Funktion chr ist Euch aber schon bekannt, oder? ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 16.05.05 15:16 
ja aber geht ja auch ohne :D
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 16.05.05 15:19 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
ja aber geht ja auch ohne :D
Klar, und ich komm' auch zu Fuß nach Moskau. :D Aber okay, soll jeder das benutzen, was ihm zusagt. :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 16.05.05 15:20 
ich bekomme mit chr nach einiger zeit immer son paar problemchen, weshalb ich denn immer ganz gerne strings als chars "tarne" :mrgreen:
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mo 16.05.05 15:56 
hm welchen namen hat denn der zweite buchstabe in meinem wort? also der erste heißt ja immer buchstabe als variable, aber wenn ich ihm z.b. sagen will, dass nach einem q ein u kommen muss, dann sieht das so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
If Buchstabe = IntToStr(17then
     //?? irgendwas muss nun mit buchstabe 21 kommen
     ;
  MAusgabe.Lines.Add(str);
DarkHunter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 477

Win XP
D3 Prof, D2005 PE
BeitragVerfasst: Mo 16.05.05 16:11 
Zitat:
hm welchen namen hat denn der zweite buchstabe in meinem wort? also der erste heißt ja immer buchstabe als variable, aber wenn ich ihm z.b. sagen will, dass nach einem q ein u kommen muss, dann sieht das so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
If Buchstabe = IntToStr(17then
     //?? irgendwas muss nun mit buchstabe 21 kommen
     ;
  MAusgabe.Lines.Add(str);


Das ist vom Quelltext erstmal nciht richtig
IntToStr(17) würde als Ergebniss "17" zurückliefern.
Die abfrage müsste lauten
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if buchstabe = 'q' then
begin
str := str + 'u';
end;


so müsste das gehen
oder du nimmst statt 'q'->'qu' in deiner list auf ;)


Zuletzt bearbeitet von DarkHunter am Mo 16.05.05 18:07, insgesamt 1-mal bearbeitet
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mo 16.05.05 16:30 
des funktioniert aufgrund der " nicht^^ beim u gehts auch mit ' oben nicht
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 16.05.05 18:31 
ausblenden Delphi-Quelltext
1:
2:
if str[i - 1] = 'q' then
  Buchstabe := 'u';
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mo 16.05.05 18:36 
geht nich ich hab folgendes wort erhalten:

wuxcgqkcsnk

qk :(
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 16.05.05 19:05 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.bStartClick(Sender: TObject);    
const    
  buchstaben: array [1..26of string = ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');    
var   
  laenge, i: integer;    
  Buchstabe, str: string;  
begin    
  randomize;    
  str := '';  
  laenge := strtoint(ELaenge.text);  
  for i := 1 to laenge do    
    begin    
      Buchstabe := buchstaben[random(26) + 1]; 
      if str[i - 1] = 'q' then
        Buchstabe := 'u'
      str := str + Buchstabe;           
    end;    
  MAusgabe.Lines.Add(str);  
end;


Hast du das auch so gemacht ?
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mo 16.05.05 19:16 
ich hab die reihenfolge etwas geändert, aber wenn ich deinen quelltext exakt so in mein prog kopiere startet er es zwar, sobald ich aber auf bstart klicke, kommt ein fehler und ich darf die sache zurücksetzen
Micho
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 16.05.05 20:30 
Hallö,

Mal ne Frage, soll das nur so Buchstabenwürfellei werden wie "CNBSHZAU", oder eher aussprechbare Wörter wie "Monagar"?

Man kann relativ leicht eine semantische Textanalyse und -synthese machen. Das hört sich wild an, ist aber eigentlich ganz einfach.

Hier ist mal ein synthetischer Zufallstext in deutsch:
"Am nähern folgt haberen an Champions nich«, sie Ei weist, dasser?«, sagte ihren Fran."
und in englisch:
"She sat too us faile, verythis be stable of they seculminese with name some, when its are of that litemaried togerisions"

(Vorlage für die Analyse waren Harry Potter in deutsch bzw. englisch.)

Wenn du sowas willst, kann ich den Code (in hübsch) mal posten ...

Grüße,
Micho

_________________
www.michael-kreil.de
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mo 16.05.05 20:58 
zuerst nur buchstabenwürfel, die wollte ich dann mit if then befehlen aussprechbar werden lassen..
kannst aber deins mal posten, alleine weil ich das mit dem satz nich verstehe oO
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 17.05.05 14:57 
dann würde ich meherere arrays machen, eins mit vokalen und ein mit konsonanten und vielleicht noch eins mit "ß" , "ä" , "ö" , "ü"
Micho
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 17.05.05 16:52 
Hallö,

Also das mit Zufalls-Buchstaben-Kombinationen, die man mit if-Abfragen auf Aussprechbarkeit testet, würde ich lassen. Das werden nachher Unmengen (50+) an if-Abfragen, wo dann keiner mehr durchschaut.

Alternativ kann ich einen kleinen Crashkurs über semantische Textanalyse und -synthese anbieten:

Als erstes braucht man einen Vorlagentext, der typische Wörter enthält. Als Beispiel habe ich eine Liste mit Vornamen genommen. Diesen Text analysiert man und zählt einfach nur aus, welche Buchstabenkombinationen darin vorkommen.

Dazu brauch man einige globale Variablen
ausblenden Delphi-Quelltext
1:
2:
const AChar:string='#abcdefghijklmnopqrstuvwxyzäöüß';
      ACharN=31;

In AChar werden die Buchstaben definiert, die man berücksichtigen möchte. Die Raute "#" braucht man als Marker ...

Außerdem benötigt man:
ausblenden Delphi-Quelltext
1:
2:
var Matrix:array[1..ACharN,1..ACharN,1..ACharN,1..ACharN] of longword;
    map:array[char] of byte;

Im 4-dimensionalen Feld Matrix soll gleich gezählt werden, welche Buchstaben-Vierer-Kombinationen wie oft auftreten.
map benötigt man, um zu einem Zeichen vom Typ Char den Index in AChar zu ermitteln.

Nun folgt die Analyse-Prozedur:
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:
procedure Analyse(Filename:string);
var f:textfile;
    s:string;
    i,sum,z1,z2,z3,z4:longword;
begin
   //Als erstes werden Matrix und map auf 0 gesetzt
   FillChar(map,SizeOf(Map),0);
   FillChar(Matrix,SizeOf(Matrix),0);
   //Um zu einem Zeichen vom Typ Char den Index in AChar zu ermitteln,
   //wird das Feld map initialisiert.
   for i:=1 to ACharN do begin
      map[AChar[i]]:=i;
      s:=UpperCase(AChar[i]);
      map[s[1]]:=i;
   end;

   //Ok, jetzt wird die Vorlagen-Datei geöffnet.
   AssignFile(f,Filename);
   Reset(f);

   while not eof(f) do begin
      //Die Zeilen werden einzeln eingelesen.
      //Jede Zeile sollte genau einen Namen enthalten.
      readln(f,s);
      s:=trim(s)+'#';
      z1:=map['#'];
      z2:=map['#'];
      z3:=map['#'];
      for i:=1 to length(s) do if map[s[i]]>0 then begin
         //Jeder Name wird Zeichen für Zeichen durchgegangen.
         //Dabei wird mitgezählt, welche Buchstabenkombinationen auftreten
         //Beim Namen "Klaus" merkt man sich, das nach "kla" ein u kommt
         //Und nach "lau" kam ein s
         //Und nach "aus" kam ein #, was so viel bedeutet, wie,
         //dass der Name zuende ist.
         z4:=map[s[i]];
         if z1>0 then inc(Matrix[z1,z2,z3,z4]);
         z1:=z2;
         z2:=z3;
         z3:=z4;
      end;
   end;
   CloseFile(f);

   //Hat man die Datei eingelesen, enthält nun die Matrix die Anzahl der
   //aufgetretenen Buchstabenkombinationen.
   //Für beispielsweise z1=map['k'], z2=map['l'], z3=map['a'], z4=map['u']
   //könnte Matrix[z1,z2,z3,z4] gleich 3 sein. D.h. dass die Kombination
   //"klau" insgesamt 3 mal aufgetreten ist.

   //Setzt man z1=map['k'], z2=map['l'], z3=map['a'] und geht mit einer
   //Schelife durch z4, könnten die Ergebnisse für Matrix[z1,z2,z3,z4] so aussehen:
   // 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 4, 1, 0, ...
   //Diese werden im folgenden aufaddiert, damit es dann so aussieht:
   // 0, 0, 0, 0, 1, 1, 1, 4, 4, 4, 6, 6, 6, 6, 6,10,11,11, ...

   for z1:=1 to ACharN do begin
      for z2:=1 to ACharN do begin
         for z3:=1 to ACharN do begin
            sum:=0;
            for z4:=1 to ACharN do begin
               sum:=sum+Matrix[z1,z2,z3,z4];
               Matrix[z1,z2,z3,z4]:=sum;
            end;
         end;
      end;
   end;
end;

Matrix enthält nun die Daten über die Buchstabenkombinationen und ist außerdem schon vorbereitet für die Textsynthese:

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 Synthese(Startwert:LongInt):string;
var s:string;
    j,sum,z1,z2,z3,z4:longword;
begin
   RandSeed:=StartWert;
   //Am Anfang brauch man wieder die 3 Marker:
   z1:=map['#'];
   z2:=map['#'];
   z3:=map['#'];
   repeat
      //Matrix[z1,z2,z3,ACharN] enthält die Anzahl, mit der die Kombination
      //z1,z2,z3 aufgetreten ist. Dass haben wir durch das Aufaddieren erreicht.
      sum:=random(Matrix[z1,z2,z3,ACharN]);
      //sum enthält nun einen Zufallswert zwischen 0 und dem Maximum Matrix[z1,z2,z3,ACharN]
      z4:=1;
      for j:=ACharN downto 1 do
         if Matrix[z1,z2,z3,j]>sum then z4:=j;
      //z4 ist nun dass vierte Zeichen, dass "typischer Weise" auf z1,z2 und z3 folgt.
      s:=s+AChar[z4];
      z1:=z2;
      z2:=z3;
      z3:=z4;
      //Wenn der Marker "#" erreicht ist, ist der Name zuende.
   until AChar[z4]='#';
   Synthese:=LeftStr(s,Length(s)-1);
end;

Das ganze benutzt man dann z.B. so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.BtnStartClick(Sender: TObject);
var i:integer;
begin
   Analyse('liste.txt');

   Randomize;

   for i:=1 to 20 do begin
      Memo1.Lines.Add(Synthese(random($1000000)));
   end;
end;


Da kommen dann so schöne Namen raus, wie:
leonik
hel
ele
klemen
doriana
antonika
jörn
hildegaret
danita
sieglinderied
anie
reinzenz
hulda
doria
olaniela

Noch einige Hinweise:
Um so mehr Namen in der Vorlage sind, um so "phantasievollere" Namen kommen raus. Es sollten daher mindestens 1000 Namen in der Liste sein.
Falls es einen sehr lange Namen stören, oder dass oftmals auch Namen generiert werden, die in der Vorlagenliste sind, kann man die durch Überprüfen wieder rausfiltern.

Grüße,
Micho

Moderiert von user profile iconChristian S.: Werbelink entfernt
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Micho am Di 17.05.05 17:55, insgesamt 1-mal bearbeitet