Entwickler-Ecke
Sonstiges (Delphi) - Buchstabenkombinationen
-delphin- - Mo 16.05.05 14:57
Titel: Buchstabenkombinationen
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 buchstaben: array [1..26] of 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); for i:=0 to laenge do begin 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
Christian S.: Topic aus Multimedia / Spiele / Grafik verschoben am Mo 16.05.2005 um 15:11
F34r0fTh3D4rk - Mo 16.05.05 15:02
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..26] of 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; |
DarkHunter - Mo 16.05.05 15:07
Titel: Re: Buchstabenkombinationen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.bStartClick(Sender: TObject); const buchstaben: array [1..26] of 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.
welchen Sinn hat das bitte?
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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i:=0 to laenge do begin MAusgabe.Lines.Add(buchstaben[random(buchstaben.count)+1]); end; end;
end. |
Edit: Mist F34r war schneller :(
F34r0fTh3D4rk - Mo 16.05.05 15:08
oder man guckt sich meine variante an, die funktioniert und leicht verständlich ist 8)
DarkHunter - Mo 16.05.05 15:12
F34r0fTh3D4rk 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. - Mo 16.05.05 15:15
Die Funktion chr ist Euch aber schon bekannt, oder? ;-)
F34r0fTh3D4rk - Mo 16.05.05 15:16
ja aber geht ja auch ohne :D
Christian S. - Mo 16.05.05 15:19
F34r0fTh3D4rk 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. :-)
F34r0fTh3D4rk - 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- - 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:
Delphi-Quelltext
1: 2: 3: 4:
| If Buchstabe = IntToStr(17) then ; MAusgabe.Lines.Add(str); |
DarkHunter - 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:
Delphi-Quelltext 1: 2: 3: 4:
| If Buchstabe = IntToStr(17) then ; 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
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 ;)
-delphin- - Mo 16.05.05 16:30
des funktioniert aufgrund der " nicht^^ beim u gehts auch mit ' oben nicht
F34r0fTh3D4rk - Mo 16.05.05 18:31
Delphi-Quelltext
1: 2:
| if str[i - 1] = 'q' then Buchstabe := 'u'; |
-delphin- - Mo 16.05.05 18:36
geht nich ich hab folgendes wort erhalten:
wuxcgqkcsnk
qk :(
F34r0fTh3D4rk - Mo 16.05.05 19:05
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..26] of 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- - 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 - Mo 16.05.05 20:30
Titel: Re: Buchstabenkombinationen
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 [
http://www.michael-kreil.de]
-delphin- - 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 - 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 - 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
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:
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:
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 FillChar(map,SizeOf(Map),0); FillChar(Matrix,SizeOf(Matrix),0); for i:=1 to ACharN do begin map[AChar[i]]:=i; s:=UpperCase(AChar[i]); map[s[1]]:=i; end;
AssignFile(f,Filename); Reset(f);
while not eof(f) do begin 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 z4:=map[s[i]]; if z1>0 then inc(Matrix[z1,z2,z3,z4]); z1:=z2; z2:=z3; z3:=z4; end; end; CloseFile(f);
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:
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; z1:=map['#']; z2:=map['#']; z3:=map['#']; repeat sum:=random(Matrix[z1,z2,z3,ACharN]); z4:=1; for j:=ACharN downto 1 do if Matrix[z1,z2,z3,j]>sum then z4:=j; s:=s+AChar[z4]; z1:=z2; z2:=z3; z3:=z4; until AChar[z4]='#'; Synthese:=LeftStr(s,Length(s)-1); end; |
Das ganze benutzt man dann z.B. so:
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
Christian S.: Werbelink entfernt
F34r0fTh3D4rk - Di 17.05.05 16:56
ist aber leider kein 100% zufallsgenerator, das ist mehr so wie silben aneinanderreihen, aber sehr schönes prinzip 8)
viele namen sehen dann so aus
| Zitat: |
walter
ulrich
eva
christian
erich
till
agatha
will
adolf
rudolf
franziska
dagmar
sven
joachim
anna
|
oder leicht abgeändert, dann wird aus mathias schnell mal kathias :wink:
oder auch schön: eleopold, matthildegareta, bastiana, robertrudolfred, thorstefan
Das klingt wie SolDatenBankÜberFallSchirmTräger oder MoleKühlschrank
Micho - Di 17.05.05 17:30
F34r0fTh3D4rk hat folgendes geschrieben: |
| Das klingt wie SolDatenBankÜberFallSchirmTräger oder MoleKühlschrank |
Hehe. Also ein Wortspiel-Generator. :)
Ich glaube nicht, dass das am grundlegenden Prinzip liegt, sondern an der Größe der Vorlagendatei. Wenn man bei der Analyse nur wenige Namen vorgibt, können auch nur wenige typische Buchstabenkombinationen gefunden werden. Das schränkt dann natürlich auch die Auswahl bei der Synthese ein.
Wenn jemand eine größere Namen-Datei findet (also 1000+), kann man es ja damit nochmal probieren ... (Die Hacker unter uns haben bestimmt so eine Datei für Brute-Force-Angriffe)
Das Filtern von schon vorhandenen Namen, könnte man wie gesagt auch integrieren.
Zur Not initialisiert man die Matrix nicht mit Nullen, sondern mit Einsen. Dadurch werden auch mal andere Buchstaben reingeworfen.
Micho
Moderiert von
Christian S.: Link entfernt
F34r0fTh3D4rk - Di 17.05.05 20:00
stimmt man könnte die namenliste von sonner hacker seite nehmen, gute idee, die sind bestimmt lang :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!