Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
pzktupel
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 31.08.2020, 16:07 Titel: Spiegeln von Zeichen im String |
|
|
Hallo,
gibt es eigentlich einen Befehl, der die Zeichen in einem String spiegelt ?
Aus "Kette" wird "etteK" ,ohne den String mit MID zu zerpflücken.
Danke ! _________________ Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 31.08.2020, 19:16 Titel: |
|
|
In Omikron Basic gab es den Befehl MIRROR$; aber in FreeBASIC gibt es keinen solchen Befehl. Ich würde da aber nicht auf MID setzten, sondern auf direkte Stringindizierung (sollte wegen fehlender Sicherheitsprüfung schneller gehen). Ich habe mal zwei Ansätze dazu:
Code: | dim as string original = "Kette", spiegelung = original
dim as integer laenge = len(original)
' 1. Möglichkeit
for i as integer = 0 to laenge-1
spiegelung[i] = original[laenge-1-i]
next
print spiegelung
' 2. Möglichkeit
for i as integer = 0 to laenge\2-1
swap original[i], original[laenge-1-i]
next
print original |
(Im ersten Beispiel muss für 'spiegelung' unbedingt erst ein ausreichend langer String reserviert werden, ansonsten gibt es fehlerhafte Speicherzugriffe.) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 31.08.2020, 20:46 Titel: |
|
|
Das Ganze würde ich sinnvollerweise noch in eine Function packen, womit der gewünschte Befehl erschaffen wird:
Code: | ' Strings umkehren
' Hier der "Befehl"
Function OmicronMirror(s As String)As String
Dim tmp As String, i As Integer
tmp = ""
For i = Len(s) To 1 Step -1
tmp += Mid(s, i, 1)
Next
OmicronMirror = tmp
End Function
' Für etwas JUnit-ähnliches geeignet: Doppelter Aufruf muss wieder das Ursprüngliche geben
Assert(OmicronMirror(OmicronMirror("Dies ist ein Test.")) = "Dies ist ein Test.")
' Beispiele
ScreenRes 640, 480
Width 80, 30
Print OmicronMirror("Kette")
Print OmicronMirror("https://forum.qbasic.at/viewtopic.php?t=9040")
Sleep |
Für die Profis etwas: Unit-Testing implementieren (müsste ich bei FbEdit auch erst herausfinden, wie man dies aktiviert). _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 88
|
Verfasst am: 31.08.2020, 21:28 Titel: |
|
|
Es gibt aber auch noch...
Code: |
#include "crt.bi" '"crt\string.bi"
Dim As String s,r
s="Kette"
r=s
_strrev(r)
Print s
print r
Sleep
|
Ist dagegen etwas einzuwenden? |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 31.08.2020, 22:37 Titel: |
|
|
Wobei mich bei dreaels Funktion stört, dass der String ständig erweitert wird - das bedeutet, dass beim Zusammensetzen des Öfteren ein neuer Speicherbereich reserviert werden muss.
Nach C-Funktionen kann man natürlich auch immer Ausschau halten. Wir haben in der Referenz eine Übersicht, scheint aber unvollständig zu sein.
https://www.freebasic-portal.de/befehlsreferenz/funktionen-der-c-standard-library-622.html _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
pzktupel
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 01.09.2020, 06:27 Titel: |
|
|
Danke für die Antworten.
Das Spiegeln war eigentlich von temporärer Natur. Ich hatte dies mit MID geregelt, dachte aber es gäbe ein Befehl.
Es war ein mathematisches Problem, das besagte, finde das kleinste Bsp. , dass 13 aufeinanderfolgende Primzahlen auch Primzahlen in der Spiegelversion (emirp) sind. Es gibt nur eines mit 12 unterhalb 10 Mrd.
Ich presste dann alle Primzahlen bis 100 Mrd auf 12.5 GB RAM und wertete
auch dies aus. Es gab keinen mehr mit 12, nur paar mit 11.
Darüber hinaus werde ich dies nicht verfolgen.
Grüße gehen raus !
P.S. Ich nachhinein lösste ich es wie dreael, wobei U die Primzahl ist,
Code: | S=STR(U):L=LEN(S):T=""
FOR i=L TO 1 STEP -1
T=T+MID(S,i,1)
NEXT i
..
P=VALULNG(T) |
_________________ Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php |
|
Nach oben |
|
|
|