REM -------------------------- Anagramm - Finder ----------------------------------------------
DIM woerter$(9443) !Speichert die Wörter aus der Wörterliste
OPEN #2: NAME "C:\Users\Reinhard\Documents\Woerterliste.txt", ACCESS OUTIN !Ggf. Dateipfad ändern!
DO !Liest die Wörter aus der Wörterliste ein
   LET i = i + 1
   LINE INPUT #2, IF MISSING THEN EXIT DO: woerter$(i)
   IF REMAINDER(i, 10000) = 0 THEN !Nur zum Zeitvertreiben
      PRINT "-";
      IF REMAINDER(i, 100000) = 0 THEN PRINT i / 100000;
   END IF
LOOP UNTIL i = 9443
CLOSE #2
INPUT PROMPT "Bitte Anagramm eingeben (bei Umlauten bitte alles klein)!": a$ !Fordert zum Eingeben eines oder mehreren Anagrammen auf
MAT PRINT woerter$ !Zeigt die Wörter der Wörterliste an
DIM einzelne$(Vorkommen(a$, " ") + 1) !Speichert die einzelnen Anagramme in ein Array
LET einzelne$(1) = RTRIM$(LCASE$(a$(1:IndexOf(a$, " ", 1))))
FOR e = 2 TO Vorkommen(a$, " ") !Spaltet a$ in einzelne Wörter auf
   LET einzelne$(e) = RTRIM$(LCASE$(a$(IndexOf(a$, " ", e - 1) + 1:IndexOf(a$, " ", e))))
NEXT e
LET einzelne$(Vorkommen(a$, " ") + 1) = RTRIM$(LCASE$(a$(IndexOf(a$, " ", Vorkommen(a$, " ") + 1) + 1:LEN(a$))))
MAT PRINT einzelne$ !Zeigt die einzelnen Anagramme an
LET ab$ = a$
REM -------------------------- Der eigentliche Finde-Teil -------------------------------------
FOR f = 1 TO Vorkommen(ab$, " ") + 1 !Jedes Anagramm einzeln durchgehen
   LET a$ = einzelne$(f)
   FOR i = 1 TO 9443 !Für jedes Wort der Wörterliste
      IF LEN(woerter$(i)) = LEN(a$) THEN !Nur wenn die Länge des Wortes gleich der Länge des Anagrammes ist
         LET Uebereinstimmungen = 0 !Zählt die Übereinstimmungen des Wortes mit dem Anagramm
         FOR x = 1 TO LEN(woerter$(i)) !Jedes Zeichen einzeln
            IF Vorkommen(LCASE$(woerter$(i)), LCASE$(woerter$(i)(x:x))) = Vorkommen(LCASE$(a$), LCASE$(woerter$(i)(x:x))) THEN !Wenn das Zeichen in Wort und Anagramm gleich oft vorkommt...
               LET Uebereinstimmungen = Uebereinstimmungen + 1 !Eine Übereinstimmung mehr
            ELSE
               EXIT FOR !Spart Zeit, wenn das Programm die Schleife verlässt, sobald etwas nicht übereinstimmt
            END IF
         NEXT x
         IF Uebereinstimmungen = LEN(a$) THEN PRINT woerter$(i) !Wenn alles übereinstimmt, das Wort anzeigen
      END IF
   NEXT i
NEXT f

FUNCTION Vorkommen(s$, z$) !Zählt die Vorkommen des Zeichens z$ in der Zeichenkette s$
   LET V = 0
   FOR b = 1 TO LEN(s$)
      IF s$(b:b) = z$ THEN LET V = V + 1
   NEXT b
   LET Vorkommen = V
END FUNCTION

FUNCTION IndexOf(s$, z$, d) !Gibt die Stelle des d-ten Vorkommens des Zeichens z$ in der Zeichenkette s$ an
   LET io = 0
   LET xi = 0
   FOR c = 1 TO LEN(s$)
      IF s$(c:c) = z$ THEN
         LET xi = xi + 1
         LET io = c
         IF xi = d THEN EXIT FOR
      END IF
   NEXT c
   LET IndexOf = io
END FUNCTION

END
