Längstes Wort am schnellsten finden

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

fliege

Betreff: Längstes Wort am schnellsten finden

BeitragSa, Jan 19, 2008 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Razz
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

BeitragSa, Jan 19, 2008 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Rolling Eyes

l8er,
PSY

SpionAtom

BeitragSa, Jan 19, 2008 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Jan 19, 2008 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 19, 2008 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

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

BeitragSo, Jan 20, 2008 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Danke auf jeden fall für die Hilfe, werd ich mir sicher für die nächsten Aufgaben merken Smile

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 Smile

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group