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.
@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.

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.

Auch dies hättest du einfach lösen können, in dem du die Zeile
in
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

.
Ich habe jetzt diese Zeile:
durch diese:
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.

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?

Verfasst: 04.08.2007 16:23
von Sicro
Oh, das Beispiel zum Starten mit beliebiger Zeichenfolge habe ich vor lauter Optimieren total vergessen.

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