Gleichung gesucht.

  • Hallo lieber AutoIt´ler

    Ich suche ein Programm das Folgender masen arbeit..

    es zählt von 1 bis 11111111111. Aber NICHT NORMAL!

    Es soll NUR alle zahlen die eine 0 und eine 1 enthalten in eine Datei via FileWirteLine Speichern.

    Ich habe es zwar schon hinbekommen doch mein Programm braucht ewig um auf die Zahl 12x1 zu kommen.

    Darum bitte ich euch mir ggf. eine schnellere möglichkeit zu zeigen.

    Am besten oder StringRegExp oder vergleichbaren.

    Erlaubt:
    - StringLen
    - StringLeft
    - StringMid
    - StringRight
    - StringSplit

    .. sollte mir was einfallen ergänze ich..

    Vielen Dank schonmal...

    (ich weiß ich habe eine nicht sehr schöne rechtschreibung.. aber das ist hier nicht das Problem...)

    Lg Benman

  • Ja Aber dennoch brauch er wenn ich das so mache ewig um bis zur end zahl zu kommen.

    Greatz

  • Autoit ist nunmal sehr sehr langsam - vielleicht kann man was mit Asselbmer machen, nur davon hab ich überhaupt keine Ahnung - viel schneller wirst du es so nicht hinbekommen, allein eine For-Schleife die bis zu der von dir genannten Zahl zählt würde ewig zum Durchlaufen brauchen - auch wenn sie an sich nichts ausführt

  • evtl hilfts... so soll´s am schluss aussehen

    man kann es auch mit + und - machen
    + = 1
    - = 0

    Kann man da nicht ne Gleichung aufstellen <_<?

    Greatz

  • nen mir ma Funktionen X(
    dann guck ich was ich machen kann..

    Sonst würde ich das so probieren (Ausschnitt)

    [autoit]


    $last_zahl = 11111111111
    For $i = 1 to $last_zahl
    If StringLeft($i, 2) > 11 Then
    ;bsp $i = 120 dann wird es zu $i = 1000
    EndIf
    Next

    [/autoit]

    Aber ob es hilft :huh:

    Greatz

    • Offizieller Beitrag

    Meinst Du so:

    Spoiler anzeigen
    [autoit]


    For $i = 0 To 2047
    ConsoleWrite(_Dec2Bin($i) & @CR)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Func _Dec2Bin($dec)
    If $dec > (2 ^ 31 - 1) Then Return SetError(1, 0, 0)
    Local $bin
    For $i = 31 To 0 Step -1
    $bin &= Number(BitAND($dec, 2 ^ $i) = 2 ^ $i)
    Next
    Return StringRegExpReplace($bin, '(\A0+)(\d+)', '$2')
    EndFunc ;==>_Dec2Bin

    [/autoit]
  • Bitte sehr!

    Spoiler anzeigen
    [autoit]


    #include <String.au3>
    $zahlen = ""
    $zahl = 2047

    [/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $len = StringLen(Integer2Binary($zahl, 0))

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $zahl
    $zahlen &= Integer2Binary($i, $len) & @CRLF
    Next
    ConsoleWrite("Laufzeit: " & Round(TimerDiff($t), 2) & " ms." & @CRLF)
    $hFile = FileOpen("Zählen.txt", 2)
    FileWrite($hFile, $zahlen)
    FileClose($hFile)
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func Integer2Binary($int, $stellen = 11)
    Local $bin, $null
    If Not IsFloat($int) And Not IsString($int) And $int >= 0 Then
    While $int >0
    $bin &= Mod($int, 2)
    $int = Floor($int / 2)
    WEnd
    SetError(0)
    For $i = 1 To $stellen - StringLen($bin)
    $null &= 0
    Next
    Return($null & _StringReverse($bin))
    Else
    SetError(1)
    Return "Error"
    EndIf
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (4. Oktober 2010 um 23:13)

  • Nein da er nur bis 2047 Zählt und jede Zahl speichert.. aber es soll nur zahlen speichern die KEINE andere zahlen auser 1 und 0 enthalten und das bis 11111111111 :S

    Greatz

    @EDIT


    UEZ you´r best!

    Vielen Vielen Dank :thumbup: .. jetz muss ich´s nur noch verstehen :D :S

    Aber das schaffe ich auch noch

    --------------------------

    Noch eine bitte :/

    Jetz brauche ich noch ein Programm welches

    eine eingabe von mir z.B.
    12454 3972 12

    Von der kleinsten bis zur Größten möglichkeit "errechnet" und wieder speichert! Aber die eingabe muss variabel sein... :love: :rofl:

    Danke im Vorraus

  • Oscar ich habe deins Gestartet und das kam bei raus.. (Verdammt XD habe $i für den Rückgabewert gehalten...)

    So Funktioniert zwar ABER!
    nicht wie es soll... wäre immernoch sehr viel arbeit für mich...

    [Spoiler]

    und bei UZE genau so wie ich es wollte.

  • Zitat

    funktioniert nicht wie es soll... wäre immernoch sehr viel arbeit für mich...

    glatt gelogen, wenn dir schon jemand "den Arm aus der Sonne legt", könntest du wenigstens soviel Anstand besitzen, und in der Hilfe nachschauen, mit welchem Befehl du die führenden Nullen hinzufügst....
    Die "Arbeit" hat sich Oscar gemacht, wobei man bemerken sollte, dass er im Gegensatz zu dir in der Lage ist, die Forensuche zu benutzen um bereits abgehandelte Themen zu finden

    Und eins kann ich dir sicher versprechen, ein Spruch wie

    Zitat

    Jetz brauche ich noch ein Programm welches.....

    ist nicht gerade geeignet, Leute die ihre Freizeit opfern um DEINE Arbeit machen, weiter zu motivieren...denn..."Nur selbst fressen macht fett!"
    Will meinen, schreib doch selbst mal ein Script, die "Arbeit" ist ja in Form der Funktion schon gemacht!

    • Offizieller Beitrag

    Um die führenden Nullen zu erhalten muss man gar nichts hinzufügen, sondern etwas weglöschen. ;)
    Ich hatte die Funktion damals so geschrieben, weil ich die führenden Nullen nicht brauchte.
    So wäre es gekürzt:

    Spoiler anzeigen
    [autoit]


    For $i = 0 To 2047
    ConsoleWrite(_Dec2Bin($i) & @CR)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Func _Dec2Bin($dec)
    Local $bin
    For $i = 10 To 0 Step -1
    $bin &= Number(BitAND($dec, 2 ^ $i) = 2 ^ $i)
    Next
    Return $bin
    EndFunc ;==>_Dec2Bin

    [/autoit]
  • @Großvater,
    jedenfalls ist es nicht langsamer, wie in AutoIt eigentlich aufgrund des zusätzlichen Befehls zu erwarten!

    Spoiler anzeigen
    [autoit]


    $t = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    $b=2^16 ;anzahl tests
    For $p = 1 To $b ;outer loop
    $bin = ""
    $dec = 2 ^ 31 - 1
    For $i = 10 To 0 Step -1 ;inner loop
    ;$bin &= Number(BitAND($dec, 2 ^ $i) = 2 ^ $i) ;beide gleich schnell...
    $bin &= Number(BitAND($dec, BitShift(1, -$i)) > 0)
    Next
    Next
    $m = TimerDiff($t)
    MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @LF & '$m' & @LF & @LF & 'Return:' & @LF & $m) ;### Debug MSGBOX

    [/autoit]
  • jedenfalls ist es nicht langsamer, wie in AutoIt eigentlich aufgrund des zusätzlichen Befehls zu erwarten!

    Und was lernen wir daraus?

    • Die Performanzkrone gebührt:[autoit]$bin &= Number(BitAND($dec, 2^$i) > 0)[/autoit]
    • Es wäre vielleicht nicht schlecht, wenn es neben den/anstelle der Bit-Funktionen (auch) Operatoren gäbe. (Zumindest dann, wenn 2^n nicht bereits intern als Shift optimiert wird.)

    ;)

  • Das mit der "Optimierung" ist bei einem Interpreter immer so eine Sache...Ich jedenfalls habe in AutoIt die Erfahrung gemacht, dass jeder eingesparte Befehl Performance bringt.
    Daher ist es um so wichtiger, die "inner loops" so klein wie möglich zu machen. Aber ich denke, im vorliegenden Fall kommts auf 100 oder 200 Takte mehr oder weniger nicht an^^

  • Frage steht noch immer..

    Greatz