Milchtrinker: Vokabeln-Algorythmus

Hallo zusammen

Ich habe ein Problem, das für mich mehr mathematisch als programmiertechnisch unlösbar ist:
Es handelt sich um einen Online-Vokabeltrainer: Es wird das deutsche Wort gezeigt, man muss das Fremdwort eintippen und danach wird überprüft, ob es stimmt.

Man kann jetzt bei der Abfrage noch Optionen wählen:

Inhalte in Klammern ignorieren (IGNORE_BRACKETS)

Die Reihenfolge der Wortbedeutungen ignorieren (IGNORE_ORDER)

Es muss nur eine Wortbedeutung angegeben werden (ONE_ANSWER)

Gross-/Kleinschreibung ignorieren (IGNORE_CAPITAL)

Leerzeichen ignorieren (IGNORE_WHITESPACES)

Sonderzeichen ignorieren (IGNORE_SYMBOLS)

Ich habe nun eine Funktion compare(answer, input), die true zurückgeben soll, wenn das Wort unter Berücksichtigung der Optionen (siehe oben) stimmt.

Bis jetzt habe ich erst die Gross-/Kleinschreibung und die Leerzeichen hingebracht:

  
function compare(answer, input) {  
	if(IGNORE_WHITESPACES) {  
		answer = answer.replace(/\W/g, "");  
		input = input.replace(/\W/g, "");  
	}  
	if(IGNORE_CAPITAL) {  
		answer = answer.toLowerCase();  
		input = input.toLowerCase();  
	}  
	if(answer == input) {  
	    return true;  
	} else {  
	    return false;  
	}  
}  

Jetzt sollte aber z.B. bei IGNORE_BRACKETS die Klammern ignoriert, werden. Wenn aber trotzdem einen Inhalt in der Klammer angegeben wird, sollte dieser überprüft werden und trotzdem (obwohl eigentlich Inhalte in Klammern ignoriert werden) false zurückgeben.

Also:
richtige Lösung: ab(cd)ef(gh)ij
eingegebene Lösung: abef(ww)ij
=> false
Wenn "(ww)" nicht stehen würde, wäre es richtig!

Die Wortbedeutungen werden dann bei [.,/-] unterteilt. Diese Wortbedeutungen sollten aber nicht "klammerübergreifend" gesplittet werden.

Ich hoffe, dass jemand dieses ziemlich komplizierte Problem (oder wenigstens einen Teil davon) versteht.

Danke und Gruss

  1. Du schreibst von einem Wort. Gibts da tatsächlich Leerzeichen? Klingt eher nach mehreren Wörtern.
    Warum kann man die einmal ignorieren und dann wieder nicht? Ich würd halt alles so fordern wie es angegeben ist und aus diesem Grund das ganze nicht zu kompliziert eingeben.
    Ganze Sätze übersetzen und automatisch prüfen wird wirklich kompliziert.

    Was ich nicht verstehe ist das hier:

    Inhalte in Klammern ignorieren (IGNORE_BRACKETS)

    Die Reihenfolge der Wortbedeutungen ignorieren (IGNORE_ORDER)

    Es muss nur eine Wortbedeutung angegeben werden (ONE_ANSWER)

    Und das hier

    Sonderzeichen ignorieren (IGNORE_SYMBOLS)

    welche sind das und warum sollte man sie ignorieren?

    richtige Lösung: ab(cd)ef(gh)ij

    Ein richtiges Beispiel wär sinnvoll.
    Aber wie gesagt, ich würds im Rahmen halten, so viele Optionen durchschaut eh keiner.

    1. @@Encoder:

      nuqneH

      Du schreibst von einem Wort. Gibts da tatsächlich Leerzeichen? Klingt eher nach mehreren Wörtern.
      Warum kann man die einmal ignorieren und dann wieder nicht? Ich würd halt alles so fordern wie es angegeben ist und aus diesem Grund das ganze nicht zu kompliziert eingeben.

      Ein Wort (im Deutschen): Heimatstadt.

      Im Englischen sollte sowohl "hometown" als auch "home town" als richtig anerkannt werden.

      Qapla'

      --
      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
      (Mark Twain)
    2. Du schreibst von einem Wort. Gibts da tatsächlich Leerzeichen? Klingt eher nach mehreren Wörtern.
      Warum kann man die einmal ignorieren und dann wieder nicht? Ich würd halt alles so fordern wie es angegeben ist und aus diesem Grund das ganze nicht zu kompliziert eingeben.
      Ganze Sätze übersetzen und automatisch prüfen wird wirklich kompliziert.

      Das ganze ist so. Es wird z.B. in einem Französisch-Lehrmittel das Wort "die Schule" - "l'école (f.)" abgefragt.
      Jetzt sollte es einerseits keine Rolle spielen, ob man "l'école" oder "l' école" (einmal mit und das andere Mal ohne Leerzeichen) schreibt...
      Andererseits sollte man auch das Geschlecht angeben können. Ich kann die Inhalte in Klammern (in diesem Falle das Geschlecht) nicht einfach "ignorieren", denn wenn jemand trotzdem das Geschlecht angibt, sollte es dieses trotzdem überprüfen und die Eingabe "l'école (m.)" als falsch anzeigen.
      Zusätzlich sollte die Funktion auch "l'école (f)" also ohne Punkt akzeptieren.

      Was ich nicht verstehe ist das hier:

      Inhalte in Klammern ignorieren (IGNORE_BRACKETS)

      Das habe ich oben beschrieben mit dem école-Beispiel. Wenn es egal ist, ob man das Geschlecht angibt oder nicht. Es ist aber nur der richtige Inhalt in den Klammern (im Ecole-Beispiel: "l'école (f.)") oder gar keine Klammer erlaubt ("l'école"). Der falsche Inhalt in den Klammern soll "false" zurückgeben ("l'école (m.)").

      Die Reihenfolge der Wortbedeutungen ignorieren (IGNORE_ORDER)

      Zum Beispiel wenn ich mich das lateinische Wort "modo" abfragen möchte, welches mehrere deutsche Übersetzungen hat: eben, erst, gerade, bald, nur.
      Dort sollte die Reihenfolge dieser Wörter keine Rolle spielen:
      eben, gerade, erst, nur, bald = bald, gerade, erst, eben, nur

      Es muss nur eine Wortbedeutung angegeben werden (ONE_ANSWER)

      Vom obigen Beispiel: Es müssen nicht alle Bedeutungen vorhanden sein. Es genügt z.B. nur "eben" oder "bald".

      Und das hier

      Sonderzeichen ignorieren (IGNORE_SYMBOLS)

      welche sind das und warum sollte man sie ignorieren?

      z.B. Punkte, Kommas, Klammern, Ausrufezeichen, Fragezeichen etc.

      richtige Lösung: ab(cd)ef(gh)ij
      Ein richtiges Beispiel wär sinnvoll.
      Aber wie gesagt, ich würds im Rahmen halten, so viele Optionen durchschaut eh keiner.

      Diese Optionen sind standart schon so eingestellt, dass man sie eigentlich nicht verändern muss. Wenn jemand jetzt aber unbedingt die Geschlechter (-> école-Beispiel) abfragen möchte und er nur "l'école" nicht tolerieren möchte, dann kann er das Häckchen bei "Inhalte in Klammern ignorieren entfernen".

      Ich hoffe ich konnte einige Sachen klären

  2. das meiste scheint mir mit Regulären Ausdrücken lösbar, die kannst du eigentlich aus deinen Anforderungen generieren.

    Inhalte in Klammern ignorieren (IGNORE_BRACKETS)

    var regexstring = answer.replace(/\(\w\)/,".*");

    Die Reihenfolge der Wortbedeutungen ignorieren (IGNORE_ORDER)

    Die solltest du eh einzeln prüfen und nicht als Block scheint mir

    Es muss nur eine Wortbedeutung angegeben werden (ONE_ANSWER)

    Siehe oben

    Sonderzeichen ignorieren (IGNORE_SYMBOLS)

    var regexstring = answer.replace(/[^NICHTSONDERZEICHEN]/,".?");
    Und dann testest du eben gegen den erzeugten String. Wobei du ganz zu Anfang natürlich die Zeichen, die in regulären Ausdrücken eine Bedeutung haben escapen solltest. Ich wüsste nicht, dass JS dafür eine fertige Funktion hätte (wäre aber mal nett zu erstellen).

    --
    sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
  3. Hi,

    Es handelt sich um einen Online-Vokabeltrainer:

    Vokabel-Training, Lektion 1: Algorithmus - ganz ohne Ypsilon.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.