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++) { for (let i = 0; i < 50; i++) {
const task = generateTask(target); const task = generateTask(target);
expect(task.target).toBe(target); expect(task.target).toBe(target);
expect(task.given).toBeGreaterThanOrEqual(1); expect(task.given).toBeGreaterThanOrEqual(0);
expect(task.given).toBeLessThanOrEqual(target - 1); expect(task.given).toBeLessThanOrEqual(target);
expect(task.given + task.answer).toBe(target); expect(task.given + task.answer).toBe(target);
} }
}); });

View File

@ -1,12 +1,9 @@
// Zahlzerlegungs-Aufgabengenerator. // Zahlzerlegungs-Aufgabengenerator.
// //
// Eine Aufgabe für Zielzahl T besteht aus: // 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) // answer: T - given (das Kind muss diese tippen)
// choices: 3 große Buttons (richtige Antwort + 2 Distraktoren), gemischt // 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; 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 { 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[] = []; 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. // Vermeide identisches given wie zuletzt, wenn Auswahl groß genug.
const givenPool = const givenPool =
@ -49,7 +46,7 @@ export function generateTask(target: Target, prev?: Task): Task {
const answer = target - given; const answer = target - given;
// Distraktoren: alle möglichen Antworten außer der korrekten. // 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 distractorPool = candidates.filter((n) => n !== answer);
const numDistractors = Math.min(DESIRED_CHOICES - 1, distractorPool.length); const numDistractors = Math.min(DESIRED_CHOICES - 1, distractorPool.length);
const distractors = shuffle(distractorPool).slice(0, numDistractors); const distractors = shuffle(distractorPool).slice(0, numDistractors);