Hallo,
wie könnte ich es hinbekommen, eine buchstabenkombination in einem wort zu finden ?
ein beispiel
ich habe zwei string variablen
1) wort$="auto"
2) eingabe$="tau"
jetzt möcht ich überprüfen, ob die eingabe$ im string wort$ vorkommt; hier tut sie es, t ist im auto, a ist im auto, u ist im auto
ich möchte ein spiel schreiben, wo alle möglichen kombinationen erkannt werden; also alle möglichkeiten, wörter aus einem wort zu bilden(die die buchstaben enthalten)
z.B.
autobus = enthält z.b. auto, bus, tau, bau, sut etc...
soweit hatte ich es ja geschaft, nur wenn die variable wort$="autto" enthält ALSO DAS PROBLEM IST WENN BUCHSTABEN DOPPELT vorkommen, dann das richtige Wort
nicht mehr erkannt werden kann...
ich könnte natürlich das eingegebene wort mit einer langen liste vergleichen, aber das möchte ich aus performance gründen lieber nicht machen...
hat jemand einen nachvollziehbaren tipp ? für *newbies ;-)*
Gruß + Danke
Thomas
DIM a$[100]
DIM b$[100]
// feld$="auto" und word$="tau" läuft wenn feld$="autto" und word$="tau" gehts nicht ...
feld$="auto"
word$="tau"
LOADFONT "smalfont.png",0;SETFONT 0
z=0
FOR x=0 TO LEN(word$)-1
FOR i=0 TO LEN(feld$)-1
// wenn ein Buchstabe gefunden z +1
IF MID$(word$,x,1)=MID$(feld$,i,1)
INC z,1
ENDIF
NEXT
NEXT
IF z=LEN(word$)
PRINT "WORT IST VORHANDEN ",100,100
ELSE
PRINT "Wort nicht vorhanden ",100,100
ENDIF
SHOWSCREEN
KEYWAIT
annäherungsweise könntest du es mal so versuchen
hat allerdings noch die Schwachstelle, daß z.B. "tatu" auch gefunden würde, obwohl "t" in feld$ nur einmal vorkommt. Wenn du das auch noch abfangen willst, könntest du z.B. jeden gefunden Buchstaben aus feld$ anschließend herauslöschen.
feld$="auto"
word$="tau"
LOADFONT "smalfont.png",0;SETFONT 0
// erst mal davon ausgehen, daß alle Buchstaben aus word$ in feld$
// enthalten sind
gefunden = TRUE
FOR x = 0 TO LEN(word$)
// jetzt für jeden Buchstaben aus word$ prüfen, ob er in feld$ vorkommt
// wenn nicht, kann man die Suche abbrechen
IF INSTR(feld$, MID$(word$, x, 1)) = -1
gefunden = FALSE
BREAK
ENDIF
NEXT
IF gefunden
PRINT "WORT IST VORHANDEN ",100,100
ELSE
PRINT "Wort nicht vorhanden ",100,100
ENDIF
SHOWSCREEN
KEYWAIT
Quote from: Quentin on 2008-Nov-21
annäherungsweise könntest du es mal so versuchen
hat allerdings noch die Schwachstelle, daß z.B. "tatu" auch gefunden würde, obwohl "t" in feld$ nur einmal vorkommt. Wenn du das auch noch abfangen willst, könntest du z.B. jeden gefunden Buchstaben aus feld$ anschließend herauslöschen.
feld$="auto"
word$="tau"
LOADFONT "smalfont.png",0;SETFONT 0
// erst mal davon ausgehen, daß alle Buchstaben aus word$ in feld$
// enthalten sind
gefunden = TRUE
FOR x = 0 TO LEN(word$)
// jetzt für jeden Buchstaben aus word$ prüfen, ob er in feld$ vorkommt
// wenn nicht, kann man die Suche abbrechen
IF INSTR(feld$, MID$(word$, x, 1)) = -1
gefunden = FALSE
BREAK
ENDIF
NEXT
IF gefunden
PRINT "WORT IST VORHANDEN ",100,100
ELSE
PRINT "Wort nicht vorhanden ",100,100
ENDIF
SHOWSCREEN
KEYWAIT
Hi Quentin,
Danke für Deine Mühe...ja, die Sache mit dem löschen ging mir auch durch den Kopf..
ich glaube, Dein Beispiel inspiriert mich, mein Code zu kürzen ;-)
ich mache das alles viel zu kompliziert glaube ich, aber naja, lerne ja noch ;-)
ich hatte es gerade hinbekommen ;-)
hier meine lllllllaaaaaannnnnnnggggggeeeeeee Version, habe bis jetzt kein Fehler entdeckt ;-)
wen´s interessiert
danke nochmal+gruß thomas
LOADFONT "smalfont.png",0;SETFONT 0
ja=pruefe_wort("auto","tau")
IF ja=1
PRINT "WORT IST VORHANDEN ",100,100
ELSE
PRINT "Alle Buchstaben im Wort nicht vorhanden",100,100
ENDIF
SHOWSCREEN
KEYWAIT
// Prüfe ob das wort z.b. eingabe$="tau" in feld$="autobus" vorkommt"
// ------------------------------------------------------------- //
// --- PRUEFE_WORT ---
// ------------------------------------------------------------- //
FUNCTION pruefe_wort: feld$, eingabe$
// Diese Variablen sind als LOCAL definiert:
// feld$, eingabe$
FOR x=0 TO LEN(eingabe$)-1
FOR i=0 TO LEN(feld$)
buchstabe$=MID$(eingabe$,x,1)
such$=MID$(feld$,i,1)
IF such$=buchstabe$
anfang$=MID$(feld$,0,i)
ende$=MID$(feld$,i+1,LEN(feld$))
feld$=anfang$+ende$
z=z+1
i=LEN(feld$) //mittlere Schleife beenden
ENDIF
NEXT
NEXT
ende:
IF z=LEN(eingabe$)
state=1
ELSE
state=-1
ENDIF
RETURN state
ENDFUNCTION // PRUEFE_WORT
hehe, ja erst mal ist es ja wichtig, daß das Programm so arbeitet, wie es soll. Über Tunigmaßnahmen sollte man sich erst anschließend Gedanken machen.
Äh.... INSTR???
O_O jetzt hast du mir den Spass verdorben :D
Ich hab das beobachtet, und wollte gucken wer als erstes auf das InStr kommt :|
äh Bahnhof?
Stümmt,
Quentin nutzt doch INSTR :whistle:
Stimmt, das INSTR seh sogar ich bis hierher. ;)
Cheers
Hi,
jetzt war ich so stolz, das ich das hinbekommen habe und dann :puke: kommt mir kitty mit instr :'(
wäre natürlich am effektivsten gewesen; aber mit instr habe ich früher schon nicht gearbeitet, deshalb wohl
die macht der gewohnheit :whistle:
wäre das eigentlich irgendwie performancemäßig von bedeutung ?
*frag nur mal so interessehalber*
aber mein code läuft so erstmal 1a und jetzt nochmal mit instr habe ich nicht die muse....
falls jemand aus dem code ein 3 zeiler machen könnte, würde ich den natürlich nehmen :good:
übrigens wer AUFMERKSAM gelesen hat
--->
"Hi Quentin,
ich glaube, Dein Beispiel inspiriert mich, mein Code zu kürzen ;-)
ich mache das alles viel zu kompliziert glaube ich, aber naja, lerne ja noch ;-)"
Gruß Thomas
p.s. GLBASIC wird mir immer sympathischer ;-)
Quote from: BumbleBee on 2008-Nov-24
Stimmt, das INSTR seh sogar ich bis hierher. ;)
Cheers
Quentin ja, xverbatim nicht ;)
Deshalb Gernot -> Says -> INSTR :P
=D Bitte, bitte, bitte vergleich doch mal 10000 String mit Deiner, und dann mit INSTR und nimm die Zeiten:
start=GETTIMERALL()
Deine()
start2=GETTIMERALL()
Meine()
ende=GETTIMERALL()
PRINT "Deine "+(start2-start)+" Meine "+(ende-start2), 0,0
SHOWSCREEN
WaitForYawdrop()
Quote from: Kitty Hello on 2008-Nov-25
=D Bitte, bitte, bitte vergleich doch mal 10000 String mit Deiner, und dann mit INSTR und nimm die Zeiten:
start=GETTIMERALL()
Deine()
start2=GETTIMERALL()
Meine()
ende=GETTIMERALL()
PRINT "Deine "+(start2-start)+" Meine "+(ende-start2), 0,0
SHOWSCREEN
WaitForYawdrop()
jepp =D hast mich überzeugt .......
gruß tom