Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kombination der Groß-Klein Buchstaben (https://www.delphipraxis.net/112370-kombination-der-gross-klein-buchstaben.html)

gizzy 19. Apr 2008 20:39


Kombination der Groß-Klein Buchstaben
 
Unter Unix sind ja namen wie "Datei" und "DatEi" unterschiedlich.
Wie kann ich also per algorhytmus alle Kombination heraus finden?
Heißt für: "aaa" gibt es die Möglichkeiten => "Aaa", "aAa", "aaA", "aAA", "AAA", "AAa", "AaA", "aaa".

Mir gehen langsam die Ideen aus..

das hatte ich bisher, bringt mir aber nur einen Teilen der möglichkeiten und dann noch doppelt:
Delphi-Quellcode:
name:= 'aaa';
  For i:=1 to Length(name) do begin
    Sub:= Copy(name,i,1);
    dahinter:= Copy(name, i+1,Length(name)-i+1);
    davor:= Copy(name, 1, i-1);
    chars[i-1]:= sub;
    charsend[i-1]:=dahinter;
    charsbegin[i-1]:= davor;
  end;
  For i:=0 to Length(name)-1 do begin
    SetLength(triesup,Length(triesup)+1);
    triesup[i]:= charsbegin[i] + AnsiLowerCase(chars[i]) + charsend[i];
  end;
  For i:=0 to Length(name)-1 do begin
    SetLength(triesdown,Length(triesdown)+1);
    triesdown[i]:= charsbegin[i] + AnsiUpperCase(chars[i]) + charsend[i];
  end;
Vielleicht gibt ja schon eine Lösung, habe leider über die Suchfunktion nichts gefunden.
Kann ja sein das einer von euch eine Idee hat.

Viele Grüße!

Fussball-Robby 19. Apr 2008 20:41

Re: Kombination der Groß-Klein Buchstaben
 
Wozu willst du denn alle Möglichkeiten auflisten?

DeddyH 19. Apr 2008 20:49

Re: Kombination der Groß-Klein Buchstaben
 
Würde mich auch mal interessieren, zumal das sehr schnell sehr viele Möglichkeiten (schlimmstenfalls 2^Stringlänge) werden.

CalganX 19. Apr 2008 21:07

Re: Kombination der Groß-Klein Buchstaben
 
Hier im Forum suchenPermutation
Letztlich geht es darum. Man könnte z.B. alle binären Permutationen der Länge n generieren und dann als Maske für die Groß- und Kleinschreibung des Strings verwenden. Nur so als Idee.

gizzy 19. Apr 2008 21:33

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Zitat von CalganX
Hier im Forum suchenPermutation
Letztlich geht es darum. Man könnte z.B. alle binären Permutationen der Länge n generieren und dann als Maske für die Groß- und Kleinschreibung des Strings verwenden. Nur so als Idee.

Danke schonmal! Aber könntest du vielleicht einwenig nähr darauf eingehen. Permutation ist ja ehr das Anzeigen jeder Kombination.
Test
esTt
setT
sTet
usw..


Ich möchte das gerne haben, da bei einer Regestrierung von einem Account jede Kombination gewählt werden kann. Allerdings möchte ich (da es von extern kommt) innerhalb meines Programmes, alle Möglichkeiten auflisten und somit auf bestimmte Dateien hinweisen. Dies ist leider mit "AniLowerCase" oä nicht möglich. *Ist ein wenig kompliziert das zu erklären*. Wird also ein Name eingegeben möchte ich in einem Array alle anderen Kombination ausschließen.



//Hinzugefügt:

Zitat:

Zitat von DeddyH
Würde mich auch mal interessieren, zumal das sehr schnell sehr viele Möglichkeiten (schlimmstenfalls 2^Stringlänge) werden.

Nein, nur Stringlänge^2.
:drunken:

Fussball-Robby 19. Apr 2008 21:35

Re: Kombination der Groß-Klein Buchstaben
 
Ich verstehe das ehrlich gesagt nicht so ganz. Erklär das nochmal genau, da gibts bestimmt eine bessere Möglichkeit, als alle Möglichkeiten aufzulisten.

gizzy 19. Apr 2008 21:47

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Zitat von Fussball-Robby
Ich verstehe das ehrlich gesagt nicht so ganz. Erklär das nochmal genau, da gibts bestimmt eine bessere Möglichkeit, als alle Möglichkeiten aufzulisten.

Das ist eine "dumme" esterne Datenbank an der ich nicht rumschrauben kann. Und die brauch nunmal alle Möglichkeiten.
Beispiel Online Spiel:
Du kannst dir einen Nicknamen erstellen.
Jetzt könnte sich aber einer "Admin" nennen und somit die anderen Spieler "reinlegen".
Das Spiel Speichert für jeden Nicknamen auf den Server eine Datei.
Es soll weiterhin möglich sein, seinen Nicknamen einmal "Player" zu wählen und ein anderes mal "player".
Nun gibt es eine Blacklist von Namen, die man nicht nehmen darf.
Wäre ja doof wenn dann einer ankommt und sich "AdMin" nennt.
Auf das Datenvolumen kommt es nicht an..

//€dit:
Also ich möchte gerne Einträge für die Blacklist festlegen/vorschlagen.

Ich hoffe ich konnte es jetzt verständlich ausdrücken!

DeddyH 19. Apr 2008 21:53

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Zitat von gizzy
Es soll weiterhin möglich sein, seinen Nicknamen einmal "Player" zu wählen und ein anderes mal "player".

Sollen das dann 2 verschiedene Spieler sein?
Zitat:

Zitat von gizzy
Nun gibt es eine Blacklist von Namen, die man nicht nehmen darf.

Ist diese Liste case-sensitive?

gizzy 19. Apr 2008 21:55

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von gizzy
Es soll weiterhin möglich sein, seinen Nicknamen einmal "Player" zu wählen und ein anderes mal "player".

Sollen das dann 2 verschiedene Spieler sein?
Zitat:

Zitat von gizzy
Nun gibt es eine Blacklist von Namen, die man nicht nehmen darf.

Ist diese Liste case-sensitive?

Zu beiden ein: Ja!

DeddyH 19. Apr 2008 21:59

Re: Kombination der Groß-Klein Buchstaben
 
Wenn die Liste case-sensitive ist, macht der Satz
Zitat:

Wäre ja doof wenn dann einer ankommt und sich "AdMin" nennt.
in meinen Augen aber keinen Sinn.

Dax 19. Apr 2008 22:04

Re: Kombination der Groß-Klein Buchstaben
 
Delphi-Quellcode:
procedure PermuteCase(const s: string; list: TString; startIndex: Integer := 0);
var temp: string;
begin
  if startIndex > length(s) then exit;
  if startIndex = 0 then
  begin
    temp := lowercase(s);
    startIndex := 1;
  end
  else
    temp := s;
  list.Add(temp);
  PermuteCase(temp, list, startIndex + 1);
  temp[startIndex] := upper(temp[startIndex]);
  list.Add(temp);
  PermuteCase(temp, list, startIndex + 1);
end;
Womöglich stimmen nicht alle Aufrufe, aber das Prinzip müsste so richtig umgesetzt sein ;)

gizzy 19. Apr 2008 22:07

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Wenn die Liste case-sensitive ist, macht der Satz
Zitat:
Wäre ja doof wenn dann einer ankommt und sich "AdMin" nennt.
in meinen Augen aber keinen Sinn.

Wieso?

Blacklist:

Zitat:

Admin
admin
GameMaster
Gamemaster
Administrator
administrator
Trotzdem ist "ADMIN", "GameMastEr" und "aDministrator" noch möglich.

Sonst würde ja (wenn nicht Ccase-sensitive) die Angabe "admin" in der Blacklist alle Möglichkeiten auschließen (zb. "Admin", "ADMIN", usw.).

Leider kann ich die Blackliste auch nicht Beeinflussen, da es ein externes Programm ist, und ich sozusagen nur das Programm zur erweiterung jener schreiben möchte.

DeddyH 19. Apr 2008 22:17

Re: Kombination der Groß-Klein Buchstaben
 
AdMin ist aber auch möglich und das ist ja angeblich doof :gruebel:

gizzy 19. Apr 2008 22:29

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Zitat von DeddyH
AdMin ist aber auch möglich und das ist ja angeblich doof :gruebel:

Weil dann die Blackliste nicht erreicht hat was sie soll, nämlich alle admin möglichkeiten zu blocken! :-D

Ich hab jetzt das Beispiel von Dax mal abgewandelt. Es waren ein paar Syntax Fehler drin. Sah mir am Anfang stark nach ner Endlosschleife aus, aber jetzt bekomme ich eine Zugriffverletzung für meine Stringlist (fals dies mit TStrings gemeint war).

Delphi-Quellcode:
procedure PermuteCase(const s: string; list: TStringList; startIndex: Integer = 0);
var
temp,charf: String;

begin
  if startIndex > length(s) then exit;
  if startIndex = 0 then
  begin
    temp := lowercase(s);
    startIndex := 1;
  end
  else
    temp := s;
  list.Add(temp);
  //PermuteCase(temp, list, startIndex + 1);
  charf:= uppercase(temp[startIndex]);
  temp[startIndex] := charf[1];
  list.Add(temp);
  PermuteCase(temp, list, startIndex + 1);
end;

DeddyH 19. Apr 2008 22:32

Re: Kombination der Groß-Klein Buchstaben
 
Jetzt bin ich völlig verwirrt. Sollen nun alle Groß-/Kleinschreibungskombinationen der Blacklist geblockt werden?

gizzy 19. Apr 2008 22:34

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Zitat von DeddyH
Jetzt bin ich völlig verwirrt. Sollen nun alle Groß-/Kleinschreibungskombinationen der Blacklist geblockt werden?

Na klar, wo wäre den sonst der Sinn der Blacklist :cheer:

DeddyH 19. Apr 2008 22:36

Re: Kombination der Groß-Klein Buchstaben
 
Dann mach doch Deine Blacklist komplett in Kleinschreibung, wandele den Usernamen auch mit AnsiLowerCase um und schau mit IndexOf nach, ob dieser in der Blacklist enthalten ist.

freak4fun 19. Apr 2008 22:39

Re: Kombination der Groß-Klein Buchstaben
 
Ich denke eine vernünftige Erklärung von Seiten des Threaderstellers wäre sinnvoller als das rumgerate hier. :roll:

Also wenn sich jemand "Player" nennt soll sich keiner "pLayer", "plAyer" usw. nennen dürfen? Dann kannst du deine "Blacklist" mit "player" füllen und alle anderen Nicks in Kleinbuchstaben umwandeln und dann prüfen. ;)

MfG
fR34k

DeddyH 19. Apr 2008 22:40

Re: Kombination der Groß-Klein Buchstaben
 
Genau das hab ich ja gesagt.

freak4fun 19. Apr 2008 22:41

Re: Kombination der Groß-Klein Buchstaben
 
Kein roter Kasten! :p

gizzy 19. Apr 2008 22:47

Re: Kombination der Groß-Klein Buchstaben
 
Die Blackliste ist von einen externen Prgramm! Da kann ich nichts ändern, das ist ja das Problem. Der wird immer Case-Sensitive prüfen, deswegen muss ich mich anpassen. Sonst hätte ich das ja schon längst getan.
Aber das habe ich bereits geschrieben.

DeddyH 19. Apr 2008 22:50

Re: Kombination der Groß-Klein Buchstaben
 
Wer prüft denn nun? Du oder das externe Programm? Erklär den Sachverhalt doch mal so, dass wir auch genau wissen, worum es geht.

grenzgaenger 19. Apr 2008 23:20

Re: Kombination der Groß-Klein Buchstaben
 
Sag mal, weshalb nimmst du nicht das CaseSensitiv heraus? Dann hast dein Problem ohne Aufwand erledigt.

<HTH> GG

DeddyH 19. Apr 2008 23:28

Re: Kombination der Groß-Klein Buchstaben
 
Das geht ja angeblich nicht. Aber solange ich nicht genau weiß, wer wann was machen soll, beschäftige ich mich nicht mehr weiter damit :mrgreen:

gizzy 19. Apr 2008 23:34

Re: Kombination der Groß-Klein Buchstaben
 
Es Existiert ein Online Spiel.
Von diesem Spiel kann man einen Server aufsetzen. Dieser Server lädt eine Blockliste: "swearnames.txt". In dieser Datei ist 'untereinander' eine Liste der Namen, die nicht für eine Anmeldung genommen werden dürfen.
So sieht diese Liste aus:
Zitat:

GM
gm
Gm
gM
GM
Gamemaster
gamemaster
GameMaster
GAMEMASTER
Admin
admin
ADMIN
[...]
Wird ein solcher name gewählt (im Clienten) wird eine Fehlermeldung ausgegeben.
Für jeden Spieler wird eine Datei auf dem Server angelegt: "Spielername.cfg". Unterschiedliche Anmeldenamen sind jedoch auch hier: "Spieler" und "SPIELER". Somit ist sichergestellt das möglichst viele 'Accounts' existieren können.
Dieser Server ist schon compiled und kann nicht mehr geändert werden.
Nur Serverconfigs und die Blockliste können bearbeitet werden.

Mit meinem Programm möchte ich nur die oben genannte Blockliste verwalten.
Der Hacken an der Liste ist, dass diese auf Groß- und KleinSchrift achtet.
So ist von den Beispielen oben nicht Inbegriffen Bsp: "GAMEmaster" oder "AdmiN". Wenn ich jetzt einen neuen Begriff zu dieser Liste hinzufügen möchte, sollen alle Möglichkeiten ausgeschlossen werden diesen Namen zu verwenden. Bei "aaa" wären das, wie im ersten Beitrag schon angedeutet =>

Zitat:

Aaa
aAa
aaA
aAA
AAA
AAa
AaA
aaa
Dies würde bei Namen wie GameMaster recht lange dauern von Hand einzutippen. Und GameMaster ist nicht der einzige Name der geblockt werden soll.

grenzgaenger 19. Apr 2008 23:38

Re: Kombination der Groß-Klein Buchstaben
 
und weshalb verwaltest sie nicht caseinsensitv? lesen --> konvertieren --> neue blockwörter einfügen --> permutieren --> zurückspeichern.

wo liegt das problem? <HTH>

gizzy 19. Apr 2008 23:42

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Zitat von grenzgaenger
und weshalb verwaltest sie nicht caseinsensitv? lesen --> konvertieren --> neue blockwörter einfügen --> permutieren --> zurückspeichern.

wo liegt das problem? <HTH>

Naja, beim Permutieren :)

Hawkeye219 19. Apr 2008 23:44

Re: Kombination der Groß-Klein Buchstaben
 
Hi,

unabhängig vom Sinn und Zweck der Übung:

Delphi-Quellcode:
procedure PermuteCase (s: string; L: TStrings);
var
  SL   : TStringList;
  chars : array [Boolean] of string;
  i, j : Integer;
begin
  SL := TStringList.Create;
  SL.Sorted := True;
  SL.Duplicates := dupIgnore;
  SL.CaseSensitive := True;

  chars[False] := AnsiLowerCase(s);
  chars[True] := AnsiUpperCase(s);

  for i := 0 to Pred(1 shl Length(s)) do
    begin
      for j := 1 to Length(s) do
        s[j] := chars[Odd(i shr Pred(j))][j];
      SL.Add(s);
    end;

  L.Assign(SL);
  SL.Free;
end;
Gruß Hawkeye

gizzy 19. Apr 2008 23:51

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Zitat von Hawkeye219
Hi,

unabhängig vom Sinn und Zweck der Übung:

Gruß Hawkeye

Delphi-Quellcode:
procedure PermuteCase (s: string; L: TStrings);
var
  SL   : TStringList;
  chars : array [Boolean] of string;
  i, j : Integer;
begin
  SL := TStringList.Create;
  SL.Sorted := True;
  SL.Duplicates := dupIgnore;
  SL.CaseSensitive := True;

  chars[False] := AnsiLowerCase(s);
  chars[True] := AnsiUpperCase(s);

  for i := 0 to Pred(1 shl Length(s)) do
    begin
      for j := 1 to Length(s) do
        s[j] := chars[Odd(i shr Pred(j))][j];
      SL.Add(s);
    end;

  L.Assign(SL);
  SL.Free; //Abstrakter Fehler?!?!
end;
Aufruf:

Delphi-Quellcode:
moeglichkeiten:= TStrings.Create;
PermuteCase(txtname.Text, moeglichkeiten);

DeddyH 20. Apr 2008 00:00

Re: Kombination der Groß-Klein Buchstaben
 
Ich sehe noch ein ganz anderes Problem. Nehmen wir den Usernamen "Administrator" mal als Beispiel. Das ist ein String mit 13 Buchstaben, d.h. es gibt 2^13 mögliche Schreibweisen. Daraus folgt, dass die Blacklist nur dafür alleine 2^13 * (13 + 1) (bei UNIX-Schreibweise mit LF) oder gar 2^13 * (13 + 2) (bei Windows-Schreibweise mit CRLF) Bytes benötigt. Der Speicherbedarf je Username steigt potentiell mit der Stringlänge. Man darf sich fragen, ob da nicht evtl. ein Timeout oder ein OutOfMemory zu erwarten ist.

[edit] @gizzy: mach aus TStrings im Aufruf mal TStringlist. [/edit]

gizzy 20. Apr 2008 00:24

Re: Kombination der Groß-Klein Buchstaben
 
Zitat:

Zitat von DeddyH
Ich sehe noch ein ganz anderes Problem. Nehmen wir den Usernamen "Administrator" mal als Beispiel. Das ist ein String mit 13 Buchstaben, d.h. es gibt 2^13 mögliche Schreibweisen. Daraus folgt, dass die Blacklist nur dafür alleine 2^13 * (13 + 1) (bei UNIX-Schreibweise mit LF) oder gar 2^13 * (13 + 2) (bei Windows-Schreibweise mit CRLF) Bytes benötigt. Der Speicherbedarf je Username steigt potentiell mit der Stringlänge. Man darf sich fragen, ob da nicht evtl. ein Timeout oder ein OutOfMemory zu erwarten ist.

[edit] @gizzy: mach aus TStrings im Aufruf mal TStringlist. [/edit]

Nein, nicht ganz. Bei einen String mit 13 Buchstaben wären das 2^12. Sind gut 4000 Möglichkeiten. Allerdings sind nur namen bis zu 15 Buchstaben erlaubt. Also haut das hin.

Die Lösung klappt und funktionier wunderbar. Danke
Wäre vielleicht ein Vorschlag für die Code Lib, schon ne tolle Idee mit den Bits schieben :-)

DeddyH 20. Apr 2008 09:54

Re: Kombination der Groß-Klein Buchstaben
 
Wie kommst Du auf 2^12?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz