Null als Zerlegungszahl zulassen (z. B. 7 = 7 + 0)

This commit is contained in:
schmop 2026-05-31 16:12:02 +02:00
parent 3896a6cabb
commit 97cff09c4e
2 changed files with 6 additions and 9 deletions

View File

@ -6,8 +6,8 @@ describe('generateTask', () => {
for (let i = 0; i < 50; i++) {
const task = generateTask(target);
expect(task.target).toBe(target);
expect(task.given).toBeGreaterThanOrEqual(1);
expect(task.given).toBeLessThanOrEqual(target - 1);
expect(task.given).toBeGreaterThanOrEqual(0);
expect(task.given).toBeLessThanOrEqual(target);
expect(task.given + task.answer).toBe(target);
}
});

View File

@ -1,12 +1,9 @@
// Zahlzerlegungs-Aufgabengenerator.
//
// Eine Aufgabe für Zielzahl T besteht aus:
// given: vorgegebene Zerlegungszahl in [1..T-1]
// given: vorgegebene Zerlegungszahl in [0..T] (inkl. der trivialen 0/T-Zerlegung)
// answer: T - given (das Kind muss diese tippen)
// choices: 3 große Buttons (richtige Antwort + 2 Distraktoren), gemischt
//
// Für sehr kleine Zielzahlen (T=4) gibt es nur 3 mögliche Antworten gesamt,
// daher ggf. nur 2 oder 3 Choices.
export type Target = 4 | 5 | 6 | 7 | 8 | 9 | 10;
@ -35,9 +32,9 @@ function shuffle<T>(arr: T[]): T[] {
}
export function generateTask(target: Target, prev?: Task): Task {
// Mögliche given-Werte: 1..target-1.
// Mögliche given-Werte: 0..target (inkl. 0 und target selbst).
const candidates: number[] = [];
for (let i = 1; i < target; i++) candidates.push(i);
for (let i = 0; i <= target; i++) candidates.push(i);
// Vermeide identisches given wie zuletzt, wenn Auswahl groß genug.
const givenPool =
@ -49,7 +46,7 @@ export function generateTask(target: Target, prev?: Task): Task {
const answer = target - given;
// Distraktoren: alle möglichen Antworten außer der korrekten.
// Mögliche Antworten = 1..target-1 (gleicher Wertebereich).
// Mögliche Antworten = 0..target (gleicher Wertebereich).
const distractorPool = candidates.filter((n) => n !== answer);
const numDistractors = Math.min(DESIRED_CHOICES - 1, distractorPool.length);
const distractors = shuffle(distractorPool).slice(0, numDistractors);