waffensachkunde
Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.
/ app src shared hartnaeckig.ts
| 1 | /** |
| 2 | * Hartnäckige Fragen – die, die immer wieder danebengehen. |
| 3 | * |
| 4 | * **Der Anlass.** Die vollständige Fehlerhistorie liegt seit jeher in |
| 5 | * `antwort_log`, aber keine einzige Abfrage wertete sie je Frage aus: |
| 6 | * `letzteAntwortKarte` liest nur die **letzte** Antwort, und der Filter „Nur |
| 7 | * Fehler“ hängt genau daran. Eine Frage, die über Wochen viermal durchfiel und |
| 8 | * gestern zufällig saß, verschwand damit aus jeder Liste — obwohl sie das |
| 9 | * Gegenteil von gekonnt ist. |
| 10 | * |
| 11 | * Bei 575 Fragen entscheiden erfahrungsgemäß zehn bis dreißig solcher Fragen |
| 12 | * über die letzten Prozentpunkte. Die eigene Messnotiz zur |
| 13 | * Ratewahrscheinlichkeit belegt das Problem von der anderen Seite: Der dort |
| 14 | * nachgestellte Rater bekam eine Frage an 53 von 61 Tagen vorgelegt — „die |
| 15 | * Frage entkommt nicht“. FSRS wiederholt stur; benannt hat den Knoten |
| 16 | * niemand. |
| 17 | * |
| 18 | * **Was das hier nicht ist.** Keine Kennzahl und keine Prognose, sondern eine |
| 19 | * Auszählung: So oft ging diese Frage daneben, an so vielen verschiedenen |
| 20 | * Tagen. Beides steht im Protokoll und wird nur addiert. |
| 21 | * |
| 22 | * **Warum verschiedene Tage zählen und nicht bloß Fehlschläge.** Eine Frage, |
| 23 | * die in einer Sitzung dreimal danebenging, ist nicht hartnäckig, sondern |
| 24 | * gerade neu: Die Wiedereinreihung legt sie in derselben Sitzung noch zweimal |
| 25 | * vor (`useSitzung`, `MAX_WIEDEREINREIHUNGEN`). Erst wenn sie an mehreren |
| 26 | * **Tagen** durchfällt, hat sie sich dem Behalten wirklich entzogen. |
| 27 | */ |
| 28 | |
| 29 | /** Ab so vielen Tagen mit Fehlantwort gilt eine Frage als hartnäckig. */ |
| 30 | export const HARTNAECKIG_AB_TAGEN = 3; |
| 31 | |
| 32 | /** Eine hartnäckige Frage mit ihrer Bilanz. */ |
| 33 | export interface HartnaeckigeFrage { |
| 34 | readonly frageId: string; |
| 35 | /** Wie oft die Frage insgesamt danebenging. */ |
| 36 | readonly fehlschlaege: number; |
| 37 | /** An wie vielen verschiedenen Tagen sie danebenging. */ |
| 38 | readonly tage: number; |
| 39 | /** Zeitpunkt des letzten Fehlschlags, ISO. */ |
| 40 | readonly zuletzt: string; |
| 41 | /** |
| 42 | * Die am häufigsten gewählte falsche Antwort, falls es eine gibt. |
| 43 | * |
| 44 | * Aus der Spalte `antwort_log.auswahl`, die bis 0.22.0 zwar geschrieben, |
| 45 | * aber von keiner Abfrage gelesen wurde. Sie unterscheidet zwei didaktisch |
| 46 | * verschiedene Fälle: Wer immer wieder **denselben** falschen Buchstaben |
| 47 | * wählt, verwechselt zwei Dinge; wer streut, weiß es schlicht nicht. Das |
| 48 | * eine ist mit einem Merksatz zu heilen, das andere nicht. |
| 49 | */ |
| 50 | readonly haeufigsteFehlwahl?: string; |
| 51 | } |
| 52 | |
| 53 | /** „4-mal an 3 Tagen danebengegangen“ – der Satz zur Bilanz. */ |
| 54 | export function hartnaeckigText(frage: HartnaeckigeFrage): string { |
| 55 | const fehl = frage.fehlschlaege === 1 ? 'einmal' : `${String(frage.fehlschlaege)}-mal`; |
| 56 | const tage = frage.tage === 1 ? 'an einem Tag' : `an ${String(frage.tage)} Tagen`; |
| 57 | return `${fehl} ${tage} danebengegangen`; |
| 58 | } |