![]() |
AW: Erstellung einer Funktion
Zitat:
Und: Aus meine Zeit, als es ums Programmierenlernen ging, war die Korrektheit der Ergebnisse nicht so wichtig. Unsere Programme wurden nicht mal kompiliert. Es ging darum zu lernen, wie man an eine Problemlösung herangeht. Und ein mögliches Ergebnis konnte durchaus auch sein: Die gestellte Aufgabe ist, unter vollständiger Beachtung der Vorgaben, nicht zu lösen. Als Informatiker muss man eben auch sowas erkennen können. Und auch das will gelernt sein. Und deshalb auch: Zitat:
|
AW: Erstellung einer Funktion
Zitat:
Mit const, also so
Delphi-Quellcode:
ist's natürlich auch schneller.
function LaengsteZiffernFolgeDerWelt( const s : string ) : string;
Bei etwa 80% pseudozufällig verteilten Ziffern sind beide gleich schnell. Bei mehr als 80% Ziffernanteil deine, bei weniger meine. Die Idee mit vorausschauender Prüfung ist schön. |
AW: Erstellung einer Funktion
Zitat:
Mein Verständnis war dass die Länge der längsten Ziffernfolge zurückgegeben werden soll. |
AW: Erstellung einer Funktion
Sehr schnelle Lösung zur Suche gelöscht.
Da dies nie gebraucht werden wird (siehe #55). Ich will ja keinen DP Platz verschwenden. |
AW: Erstellung einer Funktion
Zitat:
Und selbst wenn bezweifle ich dass die Geschwindigkeit eine Rolle spielt. Ansonsten gibt es hier etliche Ideen: ![]() |
AW: Erstellung einer Funktion
Hi
Ich meine, erstmal müsste man einen Testcase haben. Ich vermute, dass die Frage, was genau zurückgegeben werden soll, sich durch den Kontext der anderen Funktionen ergibt. Dann ist ja s[x] eigentlich ein Array-Zugriff. Da wäre die Frage ist er erlaubt, oder sollte der Student (m/w/d) lernen über Zeiger auf Strings zuzugreifen? Ich würde wahrscheinlich mit Copy und TryStrToInt (oder gehen auch Rationale Zahlen?) arbeiten. Tomy |
AW: Erstellung einer Funktion
Geht mal davon aus, dass bei Studierenden, die gerade erst Programmieren lernen, nur die einfachsten Wege beschritten werden sollen und nicht die abgefahrensten und performantesten.
Was hätten wir alle, nachdem wir so gerade mal 4 Wochen mit Pascal programmiert haben, wohl so an Lösungansätzen genutzt?
Delphi-Quellcode:
Mehr geben die momentanen Anforderungen einfach nicht her.
if
case while for repeat Selbst bei StrToInt, StrToIntDef, TryStrToInt ... hätte ich da (in Bezug auf den Lehrstand und die Anforderungen) schon meine Zweifel. Man könnte es aber auch mal mit Val und Copy versuchen ;-) Vermutlich wird an der Hochschule Pascal gelehrt (und die einzigen(?) Entwicklungsumgebungen dazu sind halt Delphi und Lazarus / FreePascal). So interessant, wie die "Fortgeschrittenen" Lösungsansätze auch sein mögen, sie dürften für den Beginn des Programmierenlernens doch eher eine leichte bis mittelstarke Überforderung darstellen bzw. eher für Verwirrung sorgen. |
AW: Erstellung einer Funktion
Zitat:
|
AW: Erstellung einer Funktion
Mich hat die Funktion "longestNumber" aus #42 interessiert.
Wegen des Kommentars Zitat:
Hierfür habe ich mit von ![]() Das ist eine UTF8-codierte Datei (ohne BOM), die ca. 12 Mio LF-terminierte Zeilen enthält. Die Dateigröße ist 1,563,600,457 Bytes. Die habe ich in einen AnsiString geladen, auf den ich die Funktionen aus #37, #42 und #47 losgelassen habe. Da die Funktionen mit Strings arbeiten, habe ich folgende Änderungen vorgenommen: Bei #37 Parameter auf const S:AnsiString und Result auf AnsiString geändert. Bei #42 dto und zusätzlich die lokalen Variablen "NumberStr" und "longNumStr" :auf AnsiString geändert. Bei #47 Parameter und das Result auf AnsiString geändert und die PChars auf PAnsiChar. Das Ergebnis:
Code:
#42 braucht 0 ms was deutlich schneller ist als #37 und #47, liefert aber ein anderes Ergebnis als die beiden anderen Funktionen, die wiederum identische Ergebnisse liefern.
Länge von S = 1563600457
Zeit: 2683 ms "0020120010067" LaengsteZiffernFolgeDerWelt (Michael II #37) Zeit: 0 ms "2986043" longestNumber (Delphi.Narium #42) Zeit: 2137 ms "0020120010067" LongestCipherSequence (Amateurprofi #47) Hat mich na klar interessiert warum die so schnell ist. Grund: die Variable "run" ist als Byte deklariert, was bei der Länge von S = 1563600457 ($5D32A649) bedeutet, dass nur die ersten $49 (73) Zeichen geprüft werden. Also habe ich die Deklaration von "run" auf Integer geändert. Ein erneuter Testlauf brachte dann
Code:
Jetzt liefern alle Funktion das gleiche Ergebnis aber #42 braucht 8 bis 9 mal so viel Zeit wie die beiden anderen Funktionen, was den Kommentar
Länge von S = 1563600457
Zeit: 2699 ms "0020120010067" LaengsteZiffernFolgeDerWelt (Michael II #37) Zeit: 21076 ms "0020120010067" longestNumber (Delphi.Narium #42) Zeit: 2262 ms "0020120010067" LongestCipherSequence (Amateurprofi #47) Zitat:
Die Testprozedur
Delphi-Quellcode:
PROCEDURE TMain.Test;
FUNCTION NStr(V:Cardinal; L:Integer):String; begin Result:=IntToStr(V); Result:=StringOfChar(#$2007,L-Length(Result))+Result; end; FUNCTION SStr(const S:AnsiString; L:Integer):String; begin Result:='"'+S+'"'+StringOfChar(#$2007,L-Length(S)); end; const F1='LaengsteZiffernFolgeDerWelt (Michael II #37)'; F2='longestNumber (Delphi.Narium #42)'; F3='LongestCipherSequence (Amateurprofi #47)'; var NL,SL,SLen:Integer; T0,T1,T2,T3:Cardinal; Size:Int64; Dsn:String; S,S1,S2,S3:AnsiString; Stream:TFileStream; begin Stream:=Nil; try try Dsn:=FilePath(BaseFilesPath,AllCountriesDsn,True); Stream:=TFileStream.Create(Dsn,fmOpenRead or fmShareExclusive); Size:=Stream.Size; if Size>MaxInt then raise Exception.Create('Datei kann nicht geladen werden, ist zu groß'); SetLength(S,Size); Stream.Read(S[1],Size); ShowMessage('Datei geladen. Test beginnt mit OK'); T0:=GetTickCount; // LaengsteZiffernFolgeDerWelt S1:=LaengsteZiffernFolgeDerWelt(S); T1:=GetTickCount; // longestNumber S2:=longestNumber(S); T2:=GetTickCount; // LongestCipherSequence S3:=LongestCipherSequence(S); T3:=GetTickCount; SLen:=Length(S); S:=''; Dec(T3,T2); Dec(T2,T1); Dec(T1,T0); NL:=Length(IntToStr(Max(Max(T1,T2),T3))); SL:=MaxIntValue([Length(S1),Length(S2),Length(S3)]); ShowMessage('Länge von S = '+IntToStr(SLen)+#13+ 'Zeit: '+NStr(T1,NL)+' ms '+SStr(S1,SL)+' '+F1+#13+ 'Zeit: '+NStr(T2,NL)+' ms '+SStr(S2,SL)+' '+F2+#13+ 'Zeit: '+NStr(T3,NL)+' ms '+SStr(S3,SL)+' '+F3); except on E:Exception do ShowMessage(E.Message); end; finally Stream.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz