Alle buchstaben miteinander verknüpfen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

ach, kommt schon!

Das Board ist doch dazu da, dass man dem anderen hilft. Die Smileys waren ja auch nur dekoration. :?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Zuletzt geändert von Sicro am 01.08.2007 16:25, insgesamt 2-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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:
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Zuletzt geändert von Sicro am 04.08.2007 16:11, insgesamt 5-mal geändert.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

@DerProgger: Danke, ich werde mir den Code heute oder morgen mal anschauen. :allright:
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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:
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Antworten