Autor Beitrag
walter_b Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: So 13.07.08 12:37 
user profile iconJerk hat folgendes geschrieben:

Wäre evtl ein Script für das ganze besser?


Hm... wie meinst du?



@Hidden: Ich habe bisher noch nie mit Pointern gearbeitet. Habe jetzt ein wenig in der Hilfe nachgelesen, aber habe keine Ahnung, wie ich das ganze Umsetzen sollte. :?
Jerk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: So 13.07.08 12:52 
Na die ganze rekursion in ein Script auslagen, z.B. Python?!?
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 13.07.08 13:13 
Meine aktuelle Funktion schafft 365.000.000 Kombinationen von A..Z in 1 Sekunde, allerdings ohne jegliche Ausgabe und Stringumwandlung.

Ich poste sie später, muss noch optimieren.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Jerk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: So 13.07.08 13:32 
Richtig Langsam wird es erst wenn der String ausgegeben wird -.-

Wie messe ich die Zeit am besten um mal zu wissen wie schnell mein Code is?
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: So 13.07.08 14:08 
user profile iconJerk hat folgendes geschrieben:

Wie messe ich die Zeit am besten um mal zu wissen wie schnell mein Code is?


Dazu kannst du SecondsBetween und MillisecondsBetween verwenden.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 13.07.08 14:13 
Das ist ja noch ungenauer als GetTickCount:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  Start: Cardinal;
begin
  Start := GetTickCount;

  // Tue was

  ShowMessage(IntToStr(GetTickCount - Start) + ' ms');
end;

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: So 13.07.08 14:20 
user profile iconGTA-Place hat folgendes geschrieben:
Das ist ja noch ungenauer als GetTickCount:


warum nicht gleich QueryPerformanceCounter ^^ ich wusste nicht dass es sooo genau sein muss.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
walter_b Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: So 13.07.08 14:57 
user profile iconGTA-Place hat folgendes geschrieben:
Meine aktuelle Funktion schafft 365.000.000 Kombinationen von A..Z in 1 Sekunde, allerdings ohne jegliche Ausgabe und Stringumwandlung.

Ich poste sie später, muss noch optimieren.


Schon fertig optimiert? :wink: Klingt nämlich bisher sehr interessant, denn ich habe alleine mit inc(x) nur ungefähr 100'000'000 Kombinationen pro Sekunde erreicht, als ich einfach eine Zahl hochzählen liess, und dies auf einem Quad-Core. Deshalb nähme mich mal wunder, wie dein Skript aussieht. :) Aber lass dich nicht stressen ;)
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 13.07.08 16:21 
Unoptimiert:

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:
procedure Gen();
var
  X, Y, Len: Integer;
  Wort: Array[0..10] of Byte;
begin
  Len := 0;

  for X := 0 to 10 do
    Wort[X] := ord('A') - 1;

  for X := 0 to 100 do
  begin
    Y := 0;
    inc(Wort[0]);

    while Wort[Y] > Ord('Z') do
    begin
      inc(Wort[Y + 1]);
      Wort[Y] := ord('A');
      inc(Y);

      Len := max(Y, Len);
    end;
  end;
end;



EDIT: Optimiert, Stufe 1:

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:
procedure Gen();
var
  X, Y, Len: Integer;
  Wort: Array[0..10] of Char;
begin
  Len := 0;

  for X := 0 to 10 do
    Wort[X] := Chr(Ord('A') - 1);

  for X := 0 to 100 do
  begin
    Y := 0;
    inc(Wort[Y]);

    while Wort[Y] > 'Z' do
    begin
      inc(Wort[Y + 1]);
      Wort[Y] := 'A';
      inc(Y);

      Len := max(Y, Len);
    end;
  end;
end;


Resultat: 553.000.000 pro Sekunde + Umwandlung von Integer in String nicht mehr nötig.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)


Zuletzt bearbeitet von GTA-Place am So 13.07.08 17:07, insgesamt 1-mal bearbeitet
walter_b Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: So 13.07.08 16:52 
Hast du das ganze in einer Konsolenapplikation gemacht oder worin hast du diesen Code?

Aber sieht gut aus, vielen Dank schon mal!
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 13.07.08 16:53 
Läuft im Fenstermodus ^^

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
walter_b Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: So 13.07.08 16:57 
user profile iconGTA-Place hat folgendes geschrieben:
Läuft im Fenstermodus ^^


Sorry für die Noob-Frage, aber what the heaven ist Fenstermodus? :oops:
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 13.07.08 16:58 
Naja, mit Fenster halt ^^ GUI-Anwendnung, keine Konsole.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Jerk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: So 13.07.08 17:59 
533 Millionen oder haste ein zwei Nullen zuviel ???

Kannste den Code mal so hier reinpacken das jede einzelne Kombination ausgegeben wird?


Zuletzt bearbeitet von Jerk am So 13.07.08 18:07, insgesamt 1-mal bearbeitet
walter_b Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: So 13.07.08 18:07 
user profile iconGTA-Place hat folgendes geschrieben:


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:
procedure Gen();
var
  X, Y, Len: Integer;
  Wort: Array[0..10] of Char;
begin
  Len := 0;

  for X := 0 to 10 do
    Wort[X] := Chr(Ord('A') - 1);

  for X := 0 to 100 do
  begin
    Y := 0;
    inc(Wort[Y]);

    while Wort[Y] > 'Z' do
    begin
      inc(Wort[Y + 1]);
      Wort[Y] := 'A';
      inc(Y);

      Len := max(Y, Len);
    end;
  end;
end;




Ich würde da gerne mal ein bisschen nachfragen, falls ich darf :) Und zwar ist mir hier nicht alles ganz klar.


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:
procedure Gen();
var
  X, Y, Len: Integer;
  Wort: Array[0..10] of Char;     //Erstellt einen Array, welcher 11 Characters beinhaltet
begin
  Len := 0;

  for X := 0 to 10 do
    Wort[X] := Chr(Ord('A') - 1); //Wandelt in ASCII-Wert um, zieht 1 ab, und wieder zurück
                                  //A entspricht 65, wieso geht man hier auf 64 zurück? 64=@
  for X := 0 to 100 do            //Wieso muss dies genau 100 mal durchgeführt werden?
  begin
    Y := 0;
    inc(Wort[Y]);                 //Was geschieht, wenn man einen Array um 1 erhöht?

    while Wort[Y] > 'Z' do        //Wann ist ein Buchstaben grösser als der andere?
    begin
      inc(Wort[Y + 1]);
      Wort[Y] := 'A';             //Wieso wird die Position im Array zu A überschrieben?
      inc(Y);

      Len := max(Y, Len);         // Wofür wird überhaupt Len benötigt?
    end;
  end;
end;


Ich wäre dir sehr dankbar, wenn du meine angefügten Kommentare bestätigen/ beantworten könntest. :) vielen Dank.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 13.07.08 19:12 
user profile iconJerk hat folgendes geschrieben:
533 Millionen oder haste ein zwei Nullen zuviel ???

533 Millionen ohne Textausgabe.


ausblenden Delphi-Quelltext
1:
//A entspricht 65, wieso geht man hier auf 64 zurück? 64=@					

Weil gleich ein inc(); folgt. Wäre der Buchstabe jetzt schon A, dann würden wir immer mit B beginnen.

ausblenden Delphi-Quelltext
1:
//Wieso muss dies genau 100 mal durchgeführt werden?					

Du kannst es auch 1.000 oder 10.000 oder eben 533 Millionen mal ausführen. Je nachdem wie viele Kombinationen du haben willst :)

ausblenden Delphi-Quelltext
1:
//Was geschieht, wenn man einen Array um 1 erhöht?					

Nicht das Array wird erhöht, sondern ein einzelnes Item und in diesem Falle ein Char. inc(A) = B. Intern wird einfach der Ord-Wert um 1 erhöht.

ausblenden Delphi-Quelltext
1:
//Wann ist ein Buchstaben grösser als der andere?					

Wenn sein Ord()-Wert größer ist. Delphi rechnet das intern sowieso um.

ausblenden Delphi-Quelltext
1:
//Wieso wird die Position im Array zu A überschrieben?					

Um den Buchstaben wieder auf A zu setzen: nach Z folgt AA; AZ -> BA; ...

ausblenden Delphi-Quelltext
1:
// Wofür wird überhaupt Len benötigt?					

Falls wir die Werte ausgeben wollen


Einfach das for dem end; der Y-Schleife einfügen, dann haben wir die Ausgabe:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Tmp := '';  // Tmp = String

for X := Len downto 0  do
  Tmp := Tmp + Wort[X];

Form1.Memo1.Lines.Add(Tmp);

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Jerk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: So 13.07.08 19:39 
edit ich gebs auf, verdammter Stackoverflow bei zu langem Pw -.-
walter_b Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: So 13.07.08 19:55 
@GTA-Place: Cool, echt toll das Programm. Vielen Dank! :beer: :zustimm:
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 13.07.08 20:16 
Nochmal optimiert:

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:
procedure Gen();  
var  
  X, Y:  Integer;  
  Wort:  String;     // Direkt String
  fChar: PChar;
begin  
  SetLength(Wort, 1);         // String = 1 Zeichen lang
  fChar  := @Wort[1];         // Pointer auf den 1. Char --> schneller Zugriff
  fChar^ := Chr(Ord('A') - 1);

  for X := 0 to 100 do  
  begin  
    Y := 1;  
    inc(fChar^);  
 
    while Wort[Y] > 'Z' do  
    begin  
      inc(Y);

      if Y > Length(Wort) then
      begin
        SetLength(Wort, Y);     // Eventuell String verlängern
        Wort[Y] := 'A';
      end
      else
        inc(Wort[Y]);

      Wort[Y - 1] := 'A';
    end;  
  end;  
end;


Zwar nur noch 500 Millionen Kombinationen pro Sekunde, aber direkt als String. Du kannst mit Wort weiterarbeiten wie du willst.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 17.07.08 18:06 
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:
function Gen();
var
  X, Y:  Integer;
  Signs: Array of Char;
  Wort:  Array of PChar;
  Temp:  String;
begin
  Temp := 'abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  SetLength(Signs, Length(Temp) + 2);
  CopyMemory(@Signs[1], @Temp[1], Length(Signs));

  Signs[0] := #0;
  Signs[High(Signs)] := #0;

  SetLength(Wort, 1);
  Wort[0] := @Signs[0];

  for X := 0 to 1000 do
  begin
    Y := 0;
    inc(Wort[Y]);

    while Wort[Y]^ = #0 do
    begin
      Wort[Y] := @Signs[1];
      inc(Y);

      if Y > Length(Wort) - 1 then
      begin
        SetLength(Wort, Y + 1);
        Wort[Y] := @Signs[1];
      end
      else
        inc(Wort[Y]);
    end;
  end;
end;


In Temp die gewünschten Zeichen eintragen und 400.000.000 Kombinationen pro Sekunde bekommen.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)