Seite 5 von 7

Verfasst: 31.07.2007 17:03
von PureBasic4.0
ach, kommt schon!

Das Board ist doch dazu da, dass man dem anderen hilft. Die Smileys waren ja auch nur dekoration. :?

Verfasst: 31.07.2007 23:59
von Sicro

Code: Alles auswählen

; -- beliebig anpassbar ----------------------------
#Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#PassLength = 3
; --------------------------------------------------

Define i.l, PassPos.l
Define OutputString.s{#PassLength}
Dim CharPos.l(#PassLength - 1)

For i = 0 To #PassLength - 1
  CharPos(i) = 1
Next

; -- Beispiel für andere Startzeichen --------------
; CharPos(0) = 3  ; <= setzt die erste Stelle auf "C"
; CharPos(1) = 2  ; <= setzt die zweite Stelle auf "B"
; --------------------------------------------------

Repeat
  OutputString = ""
  For i = 0 To #PassLength - 1
    OutputString + Mid(#Chars,CharPos(i),1)
  Next
  Debug OutputString
  
  PassPos = 0
  Repeat
    If CharPos(PassPos) < Len(#Chars)
      CharPos(PassPos) + 1
      Break
    ElseIf PassPos < #PassLength - 1
      PassPos + 1
    Else
      Break 2
    EndIf
  ForEver
    
  For i = 0 To PassPos - 1
    CharPos(i) = 1
  Next
ForEver
Ich denke, das bringt dich etwas weiter.

Edit: Code etwas verbessert

Mfg DerProgger

Verfasst: 01.08.2007 00:08
von Kiffi
PureBasic4.0 hat geschrieben:Ein neues Projekt möchte ich nicht anfangen, weil wenn dann eure antwort da
ist, weiß man nicht mehr, welche Variable, welche LinkedList für was gedacht
war...
in einem Projekt sinnvolle Kommentare und aussagekräftige Variablennamen
zu verwenden ist keine Schande. Dann ist die Chance auch grösser, selbst
nach längerer Auszeit sich schnell wieder in das Projekt einarbeiten zu
können.

Grüße ... Kiffi

Verfasst: 01.08.2007 19:03
von PureBasic4.0
@DerProgger: Habe den Code jetzt mal getestet. Das Problem ist aber ,dass die Länge des Strings variabel sein soll. Und da dein Code den String von vorne her aufbaut (nicht wie der Code von Stargate) kann ich ihn leider nicht benutzen. :cry:

@all: Ich bräuchte einen Code, bei dem die Länge des zu erstelllenden Strings variabel ist und in das man einfach wieder einsteigen kann, ohne, dass man wieder von vorne anfangen muss. :freak:

Verfasst: 02.08.2007 17:12
von Sicro
PureBasic4.0 hat geschrieben:Das Problem ist aber ,dass die Länge des Strings variabel sein soll.
Das kannst du doch ganz einfach erweitern, in dem du die Konstante "PassLength" in eine Variable umänderst, den gesamten Code in eine Prozedur packst, die Prozedur in einer Schleife aufrufst und bei jedem Schleifendurchlauf die PassLength-Variable - die als Parameter der Prozedur übergeben wird - immer um eins erhöhst.
PureBasic4.0 hat geschrieben: Und da dein Code den String von vorne her aufbaut (nicht wie der Code von Stargate) kann ich ihn leider nicht benutzen. :cry:
Auch dies hättest du einfach lösen können, in dem du die Zeile

Code: Alles auswählen

For i = 0 To #PassLength - 1
in

Code: Alles auswählen

For i = #PassLength - 1 To 0 Step -1
abgeändert hättest.

Mein Code war keine fertige Lösung... ;)

Mfg DerProgger

Verfasst: 02.08.2007 17:57
von PureBasic4.0
@DerProgger: Danke. So ungefähr habe ich den Code heute nacht auch umgeschrieben. Jetzt ist mein Problem, dass er sehr langsam ist. Stargate's Code war mit ca. 250000 Schleifendurchläufen/s ziemlich schnell. Dein Code schafft nur 80000 :cry: .

Ich habe jetzt diese Zeile:

Code: Alles auswählen

        OutputString$ + Mid(MyAlphabet$,CharPos(i),1)
durch diese:

Code: Alles auswählen

  OutputString$ + PeekS(@MyAlphabet$+CharPos(i),1)
ersetzt. Doch leider will das nicht so richtig funktionieren. Was mache ich falsch? Wie könnte man den Code performancemäßig noch aufbessern?

//edit: Habe Len(MyAlphabet$) entfernt und durch eine Variable ersetzt, die die Länge von MyAlphabet$ enthält.

Verfasst: 03.08.2007 17:29
von Sicro

Code: Alles auswählen

#MaxPassLength = 3
#Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#FirstChar = 'A'
#LastChar = '9'

Define *PassPointer = AllocateMemory((#MaxPassLength + 2) * SizeOf(Character))
Define *CharsPointer = AllocateMemory((Len(#Chars) + 1) * SizeOf(Character))
Define *CharsPos = AllocateMemory(#MaxPassLength)
Define *Pass.Character, *Chars.Character

Define PlacePos.l, i.l, z.l, Output.s, StringLength.l, StartTime.l

If Not *PassPointer Or Not *CharsPointer Or Not *CharsPos
  If *PassPointer:  FreeMemory(*PassPointer):  EndIf
  If *CharsPointer: FreeMemory(*CharsPointer): EndIf
  If *CharsPos:     FreeMemory(*CharsPos):     EndIf
  End
EndIf

PokeS(*CharsPointer,#Chars)

; ===================================
; Starte an beliebiger Zeichenfolge

; 1. Stelle: g
PokeB(*CharsPos + 2,32)
PokeC(*PassPointer + 2,'g')

; 2. Stelle: B
PokeB(*CharsPos + 1,1)
PokeC(*PassPointer + 1,'B')

; 3. Stelle: C
PokeB(*CharsPos,2)

; ====================================

;StartTime.l = ElapsedMilliseconds()

Repeat
  PlacePos = 0
  Repeat
    *Pass = *PassPointer + PlacePos
    If *Pass\c <> #LastChar
      PokeB(*CharsPos + PlacePos,PeekB(*CharsPos + PlacePos) + 1)
      *Chars = *CharsPointer + PeekB(*CharsPos + PlacePos) - 1
      *Pass\c = *Chars\c
      Break
    Else
      For i = 0 To PlacePos
        PokeB(*CharsPos + i,1)
        *Pass = *PassPointer + i
        *Pass\c = #FirstChar
      Next
     
      PlacePos + 1
     
      If PlacePos = #MaxPassLength
        Break 2
      EndIf
    EndIf
  ForEver
 
  ;Debug PeekS(*PassPointer)

  Output = ""
  StringLength = MemoryStringLength(*Pass)
  For z = StringLength - 1 To 0 Step -1
    *Pass = *PassPointer + z
    Output + Chr(*Pass\c)
  Next

  Debug Output
ForEver

;MessageRequester("RunTime",Str(ElapsedMilliseconds() - StartTime) + " ms")

FreeMemory(*PassPointer)
FreeMemory(*CharsPointer)
FreeMemory(*CharsPos)
Dieser Code ist ca. doppelt so schnell, wie mein letzter Code mit der Schleife-Methode und dem Umdrehen des Strings.

Das Umdrehen benötigt ziemlich viel Zeit, wie du merken wirst, wenn du den Code mal auskommentierst.

Es besteht zwar die Möglichkeit, den String bereits richtig rum zu bearbeiten, aber so muss der String jedesmal komplett um eine Stelle nach rechts verschoben werden, damit das nächste Zeichen vor diesem String gesetzt werden kann. Das habe ich nicht ausprobiert, aber das wird denk ich auch nicht schneller gehen.

Edit: Code etwas verbessert <)

Mfg DerProgger

Verfasst: 03.08.2007 18:12
von PureBasic4.0
@DerProgger: Danke, ich werde mir den Code heute oder morgen mal anschauen. :allright:

Verfasst: 04.08.2007 13:27
von PureBasic4.0
@DerProgger: Wie kann ich jetzt wieder nach einer Pause an genau derselben Stelle weitermachen, wo ich aufgehört habe? Habe schon versucht, #MaxPassLength, #FirstChar und #LastChar zu verändern, aber das Programm beginnt immer bei A und hört bei 9 auf (mit MaxPassLength = 1). Angenommen ich habe das Programm bei Ba7 beendet, den Fortschritt gespeichert und will jetzt weitermachen. Wie geht das? :freak:

Verfasst: 04.08.2007 16:23
von Sicro
Oh, das Beispiel zum Starten mit beliebiger Zeichenfolge habe ich vor lauter Optimieren total vergessen. :shock: :lol: Ich habe den obigen Code ergänzt.

#FirstChar und #LastChar müssen nur geändert werden, wenn du die Zeichenfolge bei #Chars änderst.

PS: 'A' = Asc("A")

Mfg DerProgger