Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Erstellung einer Funktion (https://www.delphipraxis.net/208065-erstellung-einer-funktion.html)

Mo53 5. Jun 2021 16:04

AW: Erstellung einer Funktion
 
Ich benötige dafür copy und pos wahrscheinlich und müsste dann zwischen den copys vergleichen, welche davon größer ist, bin mir aber nicht sicher, stimmt das so ?

Delphi.Narium 5. Jun 2021 16:46

AW: Erstellung einer Funktion
 
Nö, das geht auch ohne Copy und Pos:

Du hast eine Stelle, an der Du momentan unter einer gewissen Bedingung Number hochzählst. Dort kannst Du das Zeichen, das zum Hochzählen führt, auch an einen String dranhängen. Damit wird ein String dann jeweils solange um eine Ziffer verlängert, wie auch Number hochgezählt wird.
Ist ein Zeichen keine Ziffer, speicherst Du Number in LongNum. Dort kannst Du analog auch einen String in 'ner weiteren Variabel speichern.

Am Ende gibst Du dann statt Number den dann längsten String zurück.

Du brauchst also nur zwei Stringvariabeln zusätzlich. Der Rest ist nur eine marginale Änderung der bisherigen Funktion. Zusätzliche Abfragen, zu den bisher implementierten, sind dazu nicht nötig.
Nur der intelligente Einsatz zusätzlicher begin und end sowie der Zuweisung zu Stringvariabeln. Die Funktion dürfte dadurch um grob ein Dutzend Zeilen länger werden ;-)

Mo53 5. Jun 2021 18:48

AW: Erstellung einer Funktion
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1490724)
Dort kannst Du das Zeichen, das zum Hochzählen führt, auch an einen String dranhängen.

Wie genau funktioniert das dranhängen, das habe ich nicht ganz verstanden.
:?:

Delphi.Narium 5. Jun 2021 18:51

AW: Erstellung einer Funktion
 
Delphi-Quellcode:
s := s + 'A';
oder
Delphi-Quellcode:
NumberString := NumberString + s[run];

Mo53 5. Jun 2021 20:36

AW: Erstellung einer Funktion
 
Ist dann mit 'A' die Zahl gemeint ?
Und wenn ich dann die zweite Variante nehme muss ich dann unten bei longestNumber := NumberString eintragen ? das funktioniert ja nicht da longestNumber vom Datentyp byte ist und NumberString ein string.

Sorry für die dummen Fragen, ich komme da einfach nicht weiter.:drunken:

Delphi.Narium 5. Jun 2021 21:11

AW: Erstellung einer Funktion
 
Nein, 'A ist als Beispiel für das Anhängen eines einzelnen Zeichens an einen String gedacht.

Delphi-Quellcode:
StringVariabel := StringVariabel + 'String';

oder
Delphi-Quellcode:
StringVariabel := StringVariabel + AndereStringVariabel;


Wenn der Rückgabewert von LongestNumber ein String sein soll, dann muss halt LongestNumber vom Typ String sein. Man ersetze byte durch string.

Michael II 6. Jun 2021 00:47

AW: Erstellung einer Funktion
 
Da der zu durchsuchende String beim Aufruf der Funktion vollständig bekannt ist: Verzichte möglichst auf "teure" Additionen von Strings: Es macht zum Beispiel genau 0 Sinn, wenn du jede auftretende Ziffernfolge aufaddierst, diese abspeicherst, nur um sie später wieder zu verwerfen, wenn du eine längere Folge gefunden hast. - Stringoperationen kosten viel, Integerops wenig.

Merke dir also nur Start und Länge der jeweils "maximalen" Folge und nicht den Zeichensalat.

Beispiel:
A0022DJIOE390220DJIWOEDJ390J3

An Position i=1 liest du A und tust nix.
An i=2 liest du 0. Du merkst dir start=2, dann liest du 0, 2, 2.
Bei i=6 liest du "D"; also keine Ziffer mehr. Du hast die erste Ziffernfolge gefunden: Laenge = i-start = 6-2 = 4. Du merkst dir die momentan längste Folge, indem du maxstart=start=2 und maxlaenge=laenge=4 speicherst.

Es folgen keine Ziffern bis und mit i=10. Du tust nix.
Bei i=11 liest du eine 3. Du merkst dir start=11. Bei i=17 "D" ist die Ziffernfolge zu Ende. Die Laenge = i-start beträgt Laenge=17-11 = 6. Laenge=6 ist grösser als die bisherige maxlaenge=4 => Du merkst dir maxstart=11 maxlaenge=6 usw.

Am Ende weisst du, dass eine längste Folge bei maxstart beginnt und maxlaenge lang ist.

Auf dem zehnjährigen 2,2GHz Prozessor i7-3620QM können so 1000 1Mio Zeichen lange Strings in 4,4 Sekunden durchsucht werden.

Delphi-Quellcode:
function LaengsteZiffernFolgeDerWelt( s : string ) : string;
var
  len_s,
  maxlaenge, maxstart, laenge, start, i: Integer;

begin
  start := 0;
  maxlaenge := 0;
  maxstart := 0;
  i := 1;
  len_s := length(s);
  while i <= len_s do
  begin
    if ( s[i] in ['0'..'9'] ) then
    begin
      if start = 0 then start := i
    end
    else
    begin
      if start > 0 then
      begin
        laenge := i-start;
        if laenge > maxlaenge then
        begin
          maxlaenge := laenge;
          maxstart := start;
        end;
        start := 0;
      end;
    end;
    inc(i);
  end;

  if start > 0 then // *
  begin
    laenge := i-start;
    if laenge > maxlaenge then
    begin
      maxlaenge := laenge;
      maxstart := start;
    end;
  end;

  if maxlaenge > 0 then Result := Copy( s, maxstart, maxlaenge )
  else Result := '';
end;
* Wenn s[length(s)] eine Ziffer ist, dann müssen wir noch prüfen, ob diese letzte Ziffernfolge in s die längste ist. Du könntest auch gleich nach dem "begin" der Funktion an s ein "Nichtzifferzeichen" anhängen. Also s := s+'A'; Dann kannst du auf diesen Check (if start > 0 then begin... end) verzichten. In den allermeisten Fällen wäre das sicher auch ok...

Amateurprofi 6. Jun 2021 04:35

AW: Erstellung einer Funktion
 
Oder so:
Delphi-Quellcode:
FUNCTION LongestCipherSequence(const S:String):Integer;
var N:Integer; P:PChar;
begin
   Result:=0;
   P:=PChar(S);
   if P<>Nil then
      repeat
         case P^ of
            #0       : Break;
            '0'..'9' : begin
                           N:=1;
                           Inc(P);
                           while P^ in ['0'..'9'] do begin
                              Inc(N);
                              Inc(P);
                           end;
                           if N>Result then Result:=N;
                        end;
            else       Inc(P);
         end;
      until False;
end;
Oder um Michaels Hinweis aufzugreifen:

Delphi-Quellcode:
FUNCTION LongestCipherSequence2(const S:String):Integer;
var P,PS:PChar;
begin
   Result:=0;
   P:=PChar(S);
   if P<>Nil then
      repeat
         case P^ of
            #0       : Break;
            '0'..'9' : begin
                           PS:=P;
                           Inc(P);
                           while P^ in ['0'..'9'] do Inc(P);
                           if P-PS>Result then Result:=P-PS;
                        end;
            else       Inc(P);
         end;
      until False;
end;
Delphi-Quellcode:
PROCEDURE TMain.Test;
const S='1A22B333C4444D55555E';
begin
   ShowMessage(IntToStr(LongestCipherSequence(S)));
   ShowMessage(IntToStr(LongestCipherSequence2(S)));
end;

Michael II 6. Jun 2021 09:51

AW: Erstellung einer Funktion
 
Zitat:

Zitat von Amateurprofi (Beitrag 1490743)
Oder so:

Nicht "oder so", sondern nur so wie Profi ;-).
Es gibt allerdings einen Unterschied: #37 liefert wie in #26 verlangt den String, #38 die Position.
Zeitlich bewegen wir uns im gleichen Rahmen. Profi nutzt aus, dass Strings Null-terminiert sind, muss aber die =#0 Abfrage bei jedem Zeichen ausführen, #37 "einmal" am Schluss *.

Mo53 6. Jun 2021 11:11

AW: Erstellung einer Funktion
 
Wirklich sehr Interessant, Vielen Dank für eure Mühe:-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr.
Seite 4 von 6   « Erste     234 56      

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