Längstes Wort am schnellsten finden
Übersicht

fliegeBetreff: Längstes Wort am schnellsten finden |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also, ich und ein paar Freunde haben uns gefragt, welche denn die kleinste Zahl unter einer Million wäre, die aber, wenn man sie ausschreibt am meisten Buchstaben hat. Naja - also mal drangesetzt und mir was einfallen lassen. Jetzt würd ich nur gern wissen, ob man das noch irgendwie beschleunigen kann.
Das wäre dann der Code: Code: [AUSKLAPPEN] Graphics 800,600,32,2
SetBuffer BackBuffer() Global file = WriteFile("C:\Wette.txt") start = MilliSecs() For x =100000 To 999999 wort$ = Str(x) ;;Zahlen auseinander nehmen;; ht = Int(Mid(wort$,1,1)) Select ht Case 1 : htw$ = "ein" Case 2 : htw$ = "zwei" Case 3 : htw$ = "drei" Case 4 : htw$ = "vier" Case 5 : htw$ = "fünf" Case 6 : htw$ = "sechs" Case 7 : htw$ = "sieben" Case 8 : htw$ = "acht" Case 9 : htw$ = "neun" End Select zt = Int(Mid(wort$,2,1)) Select zt Case 0 : ztw$ = "" Case 1 : ztw$ = "zehn" Case 2 : ztw$ = "zwanzig" Case 3 : ztw$ = "dreißig" Case 4 : ztw$ = "vierzig" Case 5 : ztw$ = "fünfzig" Case 6 : ztw$ = "sechzig" Case 7 : ztw$ = "siebzig" Case 8 : ztw$ = "achtzig" Case 9 : ztw$ = "neunzig" End Select t = Int(Mid(wort$,3,1)) Select t Case 0 : tw$ = "" Case 1 : tw$ = "ein" Case 2 : tw$ = "zwei" Case 3 : tw$ = "drei" Case 4 : tw$ = "vier" Case 5 : tw$ = "fünf" Case 6 : tw$ = "sechs" Case 7 : tw$ = "sieben" Case 8 : tw$ = "acht" Case 9 : tw$ = "neun" End Select h = Int(Mid(wort$,4,1)) Select h Case 0 : hw$ = "" Case 1 : hw$ = "ein" Case 2 : hw$ = "zwei" Case 3 : hw$ = "drei" Case 4 : hw$ = "vier" Case 5 : hw$ = "fünf" Case 6 : hw$ = "sechs" Case 7 : hw$ = "sieben" Case 8 : hw$ = "acht" Case 9 : hw$ = "neun" End Select z = Int(Mid(wort$,5,1)) Select z Case 0 : zw$ = "" Case 1 : zw$ = "zehn" Case 2 : zw$ = "zwanzig" Case 3 : zw$ = "dreißig" Case 4 : zw$ = "vierzig" Case 5 : zw$ = "fünfzig" Case 6 : zw$ = "sechzig" Case 7 : zw$ = "siebzig" Case 8 : zw$ = "achtzig" Case 9 : zw$ = "neunzig" End Select e = Int(Mid(wort$,6,1)) Select e Case 0 : ew$ = "" Case 1 : ew$ = "eins" Case 2 : ew$ = "zwei" Case 3 : ew$ = "drei" Case 4 : ew$ = "vier" Case 5 : ew$ = "fünf" Case 6 : ew$ = "sechs" Case 7 : ew$ = "sieben" Case 8 : ew$ = "acht" Case 9 : ew$ = "neun" End Select ;;Endwort basteln;; endwort$ = htw$+"hundert" If zt = 1 Select t Case 1 : tw$ = "elf" : muh = 2 Case 2 : tw$ = "zwölf" : muh = 2 End Select EndIf If zt = 0 Then muh = 1 If muh = 0 Then endwort$ = endwort$ + tw$ + "und" + ztw$ + "tausend" ElseIf muh = 1 endwort$ = endwort$ + tw$ + ztw$ + "tausend" ElseIf muh = 2 endwort$ = endwort$ + tw$ + "tausend" EndIf muh = 0 If h > 0 Then endwort$ = endwort$ + hw$+"hundert" EndIf If z = 1 Select e Case 1 : ew$ = "elf" : muh = 1 Case 2 : ew$ = "zwölf" : muh = 1 End Select EndIf If z = 0 Then muh = 1 If muh = 0 Then endwort$ = endwort$ + ew$ + "und" + zw$ Else endwort$ = endwort$ + ew$ + zw$ EndIf duration = MilliSecs() - start ;;Mehr Buchstaben als das alte?;; newlen = Len(endwort$) If newlen > oldlen oldlen = newlen worthx = x worthw$ = endwort$ WriteLine file, "Neues Wort: " + worthw$ + "("+worthx+", "+oldlen+" Buchstaben). Nach "+duration/1000+" Sekunden." EndIf ;;Ende der Schleife;; Cls Locate 0,0 Print "x = " + x Print "Wort: "+wort$ Print worthx + "("+oldlen+" Buchstaben)" Print worthw$ Print "Rechne schon "+ duration +" Millisekunden." Print "Also: "+duration/1000+" Sekunden." Flip Next RuntimeError "Fertig! Habe "+duration/1000+" Sekunden rechnen müssen :(" CloseFile file Jou, dass das Programm die Datei 'Wette.txt' auf C:\ erstellt dient nur dazu, dass man die Wörter auch lesen kann ![]() Würd mich mal interessieren wie lang eure Rechner dafür brauchen (meiner hatte die Zahl nach 10505 Sekunden, also 2 Stunden und 55 Minuten.) Fliege |
||
Wer weiß was kommt.. ? |
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] If x Mod 5000 = 0 or x=999999 Then
Cls Locate 0,0 Print "x = " + x Print "Wort: "+wort$ Print worthx + "("+oldlen+" Buchstaben)" Print worthw$ Print "Rechne schon "+ duration +" Millisekunden." Print "Also: "+duration/1000+" Sekunden." Flip 0 EndIf sieben sekunden ![]() l8er, PSY |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Siebenhundertsiebenundzwanzigtausendsiebenhundertsiebenundzwanzig 727727
ist mein Tipp nach ein bisl überlegen. Dein Programm könntest du verschnellern, indem du die einzelnen Stellen auch einzeln betrachtest (oder höchstens zu zweit). So musst du bei der 100.000er stelle nur insgesamt 9 mal schauen, was am größten ist. Code: [AUSKLAPPEN] einhunderttausend
zweihunderttausend dreihunderttausend ... Ebenso bei den 10.000er und 1.000er. Ich habe dann 727, weil du ja die kleinste Zahl haben wolltest (dreizig, vierzig, und alle anderen hätten ebenso gepasst). und da die ersten 3 Stellen ein "Hunderter-Wort" ergeben, kann man sie genausogut für die letzten 3 verwenden. Und das Programm von Psy versteh ich überhaupt nicht. |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Anstatt mit Strings zu hantieren ist es mit Sicherheit schneller für jedes Wort sofort mit der Anzahl von Buchstaben zu rechnen
Dann ist es auch sinnvoller einzeln für die Einer, Zehner, Hunderter usw das längste Wort rauszusuchen. Und zusammen zufügen. |
||
[BB2D | BB3D | BB+]
|
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
SpionAtom hat Folgendes geschrieben: Und das Programm von Psy versteh ich überhaupt nicht. das ist kein eigenständiges programm. ich hab nur einen teil seines codes geändert und halt nur diesen ausschnitt geposted ![]() die geschwindigkeitsbremse bei fliege ist einzig und allein die gfx-ausgabe und flip 1 statt 0. mein code macht nix anderes, als halt nur alle 5000 checks eine grafikausgabe zu machen und nicht 1000000 mal ^^ l8er, psy (edit) ok, einzig und allein ist vllt übertrieben, sicherlich kann man den code von fliege noch verbessern (ausschliessen von werten, die erst gar nicht in frage kommen können, nur mit werten rechnen und nicht mit strings, und den string erst am schluss zusammensetzen, usw. aber 99% speedverlust hingen an der gfx ausgabe! |
||
fliege |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wow, hab grad bemerken müssen, dass das mein Rechner auch in knappen 11 secs hat.. Das das mit der Grafikausgabe so eine heftige Sache ist wusst ich gar nicht ![]() Danke auf jeden fall für die Hilfe, werd ich mir sicher für die nächsten Aufgaben merken ![]() Noch wie man einfach per Hand draufkommen kann: Man nimmt einfach ein Stück papier und schreibt 6 Spalten mit 0-9 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 ... Nun schaut man sich an, wie die Wörter heißen, dann kommt man drauf, das man bei der ersten Spalte immer 'hunderttausend' dranhängt, also lassen wir das mal weg, und schreiben neben die Zahlen die Anzahl der buchstaben: 0 (keine Buchstaben, weil nicht nullhunderttausend geschrieben wird) 1 (3, ein-hunderttausend) 2 (4, zwei-hunderttausend) ... Das macht man weiter, bis man alle Spalten durchhat. Dann einfach nur noch hergegangen und Spalte für Spalte nachgesehen, wo man am meisten Buchstaben stehen hat. Wenn 2 die gleichen Buchstaben haben, dann nimmt man die kleinere von beiden. So kommt man dann ziemlich zackig auf: Siebenhundertsiebenundzwanzigtausendsiebenhundertsiebenundzwanzig (727727, 65 Buchstaben) Wie gesagt, danke nochmal und einen schönen Tag noch ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group