>>27481>wird der code schneller, wenn du das assert weglässt? oder brauchts das? hab den automaten noch nicht 100% verstanden.
Das
assert
wird nur bei der Initialisierung ausgeführt, ist also irrelevant. Gebraucht wird es natürlich nicht, ich war bloß zu faul, mir zu überlegen, wie viele Tabellen ich genau brauche und habe einfach als Bounds-Check ein
assert
reingeschmissen, damit es knallt, wenn es zu wenige sind.
>hab den automaten noch nicht 100% verstanden.
Zuerst werden alle Zeichen (0 - 255) auf einen kleineren Bereich (0 - 31) gemappt, um die Zustandstabellen kleiner zu halten. Dabei gilt 1 = A/a, 2 = B/b, ... 26 = Z/z, 31 = Wortgrenze (Interpunktionszeichen, Leerzeichen und Stringende), und dann noch 0 für alles andere.
Es gibt mehrere Tabellen (
tables
), wobei jede Tabelle einem Zustand entspricht. Die ersten beiden sind reserviert für die Zustände „ungültiges Wort“
also alles, was nicht in der Liste ist, insbesondere Wörter der Länge > 4 (Tabelle 0) und „Wortanfang/Wortende“ (Tabelle 1). Von Tabelle 0 aus zeigt also alles wieder auf Tabelle 0
wenn das Präfix ungültig ist, ist alles was danach kommt auch ungültig, außer es ist ein Interpunktionszeichen oder Leerzeichen, in welchem Fall der Zustand auf Tabelle 1 zurückgesetzt wird. Die restlichen Tabellen entsprechen halt jeweils einem Präfix aus der Wortliste. Präfix + neues Zeichen = neuer Zustand und neuer Score. Alles startet von Tabelle 1.
Noch zu der Score-Berechnung: Ursprünglich war das mit dem Score so gedacht, dass in jedem Schritt einfach nur dazuaddiert wird, wobei der Addend in den meisten Fällen einfach 0 ist (außer am Ende eines erkannten Wortes). Dann fiel mir aber auf, dass bei HvL in der einen Zeile
=-10
stand und nicht
-=10
, wie ich erst dachte, und ich musste es noch mal aufbohren und
mask
reinfrickeln. Kann man sich als guter Informatiker aber denken, wie das funktioniert.