Deutsch
Forum

Frage der Woche!

 
- Seite 1 -



Frank
Abbing
Vielleicht ist so ein Thread mal nett. Jemand stellt eine Programmier-Aufgabe und der Rest versucht, eine kurze und gute Lösung zu finden...
Die beste Lösung könnte zu den Code-Snippets gepackt werden.

Meine Aufgabe für heute ist:

Finde eine kurze und schnelle Lösung um festzustellen, ob ein Directory leer ist oder nicht!
 
25.08.2008  
 



 
- Seite 2 -



Frank
Abbing
Hehe, Dieter hat auch meine API-Methode gepostet. Schnell und kurz. Die ShlWapi ist ein Feuerwerk an nützlichen und auch unerwarteten Funktionen!
Jetzt darf gerne jemand Anderes eine Aufgabe posten.
 
26.08.2008  
 



Deine ja?

Sortiere moeglichst performant 200 reelle Zufallszahlen mit 8 stelliger Genauigkeit nach rnd()*1000 (xprofan 11) natuerlich, also wie es ein Mensch tun wuerde.
 
26.08.2008  
 




Jörg
Sellmeyer

KompilierenMarkierenSeparieren
Randomize
Declare s$
Window 0,0 - 400,%maxy
Var h& = Create("ListBox",%hwnd,1,1,10,200,%maxy - 80)

WhileLoop 200

    AddString(h&,Format$("00#." + MkStr$("#",8),Rnd() * 1000))

Wend

While 1

    WaitInput
    Locate 1,29
    s$ = Format$("00#." + MkStr$("#",8),Rnd() * 1000)
    DeleteString(h&,Rnd(GetCount(h&)))
    AddString(h&,s$)
    SelectString(H&,-1,s$)
    Print s$

Wend

 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
26.08.2008  
 



Ich gebs ja zu, war eine bloede Idee! Der naechste bitte...
 
26.08.2008  
 




Jörg
Sellmeyer
So, weiter gehts:

Es sollen aus einer Zahl die einzelnen Dezimalwerte ermittelt werden. Ich stelle hier als Start mal die Methode mit Strings hin. Das Ganze soll aber mathematisch werden. Eine Art TestBit mit 4bit.
Also, die Zahl soll in jedem "Bit" vier Zustände repräsentieren (0,1,2,3) und achtstellig sein.
KompilierenMarkierenSeparieren
Proc ErmittleZahl

    Parameters Zahl$,l%
    Return Mid$(Zahl$,l%,1)

EndProc

Var a% = 33120113
Declare Tick&
Print a%
Set("FastMode",1)
Tick& = &GetTickCount

WhileLoop 8

    Print "Zahl",&Loop,"ist eine",ErmittleZahl(a%,&Loop)
    ErmittleZahl(a%,&Loop)

Wend


Wie gesagt, keine Stringlösungen, sondern rein mathematisch und mit nicht mehr als diesen 8 Schleifendurchläufen.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
28.08.2008  
 




Frank
Abbing
Wieso lässt du das 1000 mal durchlaufen?
Übrigens ist deines doch eine Stringlösung, oder? MID$ ist nunmal eine Stringfunktion...
 
28.08.2008  
 




Jörg
Sellmeyer
Das mit der 1000er-Schleife hatte ich vergessen rauszunehmen.

Frank Abbing
Übrigens ist deines doch eine Stringlösung, oder?


Jörg Sellmeyer
Ich stelle hier als Start mal die Methode mit Strings hin. Das Ganze soll aber mathematisch werden.


Also: Hast Du eine mathematische Lösung?
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
28.08.2008  
 




Sebastian
Sprenger
Gehts jetzt wirklich um 2 Bits pro Ziffer und 8 Ziffern pro Zahl oder einfach um einen Mid$-Ersatz? Naja wie auch immer:
KompilierenMarkierenSeparieren
Proc ErmittleZahl

    Parameters Zahl&, pos%
    Declare len%
    Dec pos%
    Case pos% < 0: Return ""

    IfNot Zahl&

        Case pos%: Return ""
        Return 0

    ElseIf Zahl& < 0

        CaseNot pos%: Return "-"
        Dec pos%
        Zahl& = Abs(Zahl&)

    EndIf

    len% = Lg(Zahl&) / Lg(10)
    Case pos% > len%: Return ""
    Return Int((Zahl& / 10 ^ (len% - pos%)) Mod 10)

EndProc

Alte Prozedur ErmittleZahl einfach ersetzen...
 
Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32
Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM
Windows Me, 1.8 Ghz, 256 MB RAM
28.08.2008  
 




Frank
Abbing
Hm, sowas vielleicht?
KompilierenMarkierenSeparieren
Declare a&,b&,x&
a&=33120113
x&=100
Print a&
Print

WhileLoop 8

    x&=1

    Whileloop 8-(&loop-1)

        x&=x&*10

    EndWhile

    a&=a&-(Int(a&/x&)*x&)
    b&=a&/(x&/10)
    Print b&

Wend

WaitInput
End
 
28.08.2008  
 




Jörg
Sellmeyer
Ich poste mal meine Lösung. Die braucht für 1000 Durchgänge ~1500 - ~2000 ms (deshalb auch die 1000er Schleife)
Die Stringlösung brauch nur ~1000 - 1500ms. Eure benötigen ~2800 - ~3500ms
Ich dachte, mathematisch könnte es noch schneller gehen. Die Idee dahinter ist: Ich möchte Strings per Sendmessage an ein anderes Programm übergeben. Die Strings bestehen aus bis zu 16 Zeichen (könnte man je acht Stellen über &wparam und &lparam schicken). Es sind immer nur vier unterschiedliche Zeichen, darum die Zahlen von 0-3 pro Dezimalstelle.
KompilierenMarkierenSeparieren
Set("Decimals",0)

Proc ErRechneZahl

    Parameters Zahl%,l%
    Sub Zahl%,(Zahl% Mod (10^l%)) / 10^l%
    Return (Zahl% Mod (10^l%)) / 10^(l% -1)
    um die Bedingung mit maximal 4 Zuständen zu erfüllen, müßte das hier zurückgegeben werden:
    Zahl% = (Zahl% Mod (10^l%)) / 10^(l% -1)
    Return If(Zahl% < 4,Zahl%,0)

EndProc

Var a% = 33120113
Declare Tick&
Print a%
Tick& = &GetTickCount

WhileLoop 1000

    Locate 13,1
    Print &Loop

    WhileLoop 8

        Print ErRechneZahl(a%,&Loop)

    Wend

Wend

Print &GetTickCount - Tick&
Waitinput

Die Zahlen werden rückwärts ausgegeben aber das spielt keine Rolle.

Das mit dem Lg(Zahl&), um die Anzahl der Stellen rauszubekommen, gefällt mir! Allerdings ist mir nicht klar, warum Du das noch durch Lg(10) teilst. Der ist doch 1 oder?
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
28.08.2008  
 




Frank
Abbing
Ok, hab meine Routine noch verbessert. Sollte jetzt deutlich schneller arbeiten:
KompilierenMarkierenSeparieren
Declare a&,b&,x&
a&=33120113
x&=100
Print a&
Print

WhileLoop 8

    x&=10^(8-(&loop-1))
    a&=a&-(Int(a&/x&)*x&)
    b&=a&/(x&/10)
    Print b&

Wend

WaitInput
End
 
29.08.2008  
 




Sebastian
Sprenger
Jörg Sellmeyer
warum Du das noch durch Lg(10) teilst. Der ist doch 1 oder?

Echt, ist er das?
*ausprobier*
Ja, er ist. Gut zu wissen. Man kann ja den Logarithmus zu einer bestimmten Basis (in meinem Fall 10) errechnen, aber wenn die Lg-Funktion bei 10 sowieso 1 ausgibt, kann's ja weggelassen werden.
 
Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32
Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM
Windows Me, 1.8 Ghz, 256 MB RAM
29.08.2008  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

25.505 Betrachtungen

Unbenanntvor 0 min.
p.specht22.05.2013
mene06.12.2012
Peter Max Müller11.12.2011
Jens Tiburski29.12.2010
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie