import type { Stage } from "../types" type Frac = { num: number; den: number } function randFrac(): Frac { const denoms = [2, 3, 4] const d = denoms[Math.floor(Math.random() * denoms.length)] const n = Math.floor(Math.random() * (d - 1)) + 1 return { num: n, den: d } } function fracLabel(f: Frac): string { return `${f.num}/${f.den}` } // Recognize which fraction is bigger const compares: { a: Frac; b: Frac; correct: "a" | "b" }[] = [] for (let i = 0; i < 8; i++) { let a = randFrac() let b = randFrac() while (a.num / a.den === b.num / b.den) { b = randFrac() } compares.push({ a, b, correct: a.num / a.den > b.num / b.den ? "a" : "b" }) } // Identify the fraction (label + visual) const labels = [ { frac: { num: 1, den: 2 }, label: "un medio" }, { frac: { num: 1, den: 3 }, label: "un tercio" }, { frac: { num: 2, den: 3 }, label: "dos tercios" }, { frac: { num: 1, den: 4 }, label: "un cuarto" }, { frac: { num: 3, den: 4 }, label: "tres cuartos" }, { frac: { num: 2, den: 4 }, label: "dos cuartos" }, ] const exercises: any[] = [] // Part 1: Compare fractions for (let i = 0; i < compares.length; i++) { const c = compares[i] const aVal = c.a.num / c.a.den const bVal = c.b.num / c.b.den exercises.push({ id: `fra9-frac-compare-${i}`, stage: 9, skillCode: `frac-compare-${i}`, type: "conciencia", prerequisites: i === 0 ? [] : [exercises[i - 1].id], content: { instruction: `¿Cuál es la fracción más grande?`, text: `${fracLabel(c.a)} vs ${fracLabel(c.b)}`, audioText: `${fracLabel(c.a)} o ${fracLabel(c.b)}, cuál es más grande`, emoji: "🥧", options: [ { label: fracLabel(c.a), correct: c.correct === "a", id: `a-${i}` }, { label: fracLabel(c.b), correct: c.correct === "b", id: `b-${i}` }, ].sort(() => Math.random() - 0.5), }, functionalContext: "Comparar fracciones con método Montessori (círculos de fracciones rojos).", errorType: "confusion-letra", }) } // Part 2: Identify fractions by name for (let i = 0; i < labels.length; i++) { const l = labels[i] const idx = compares.length + i exercises.push({ id: `fra9-frac-label-${i}`, stage: 9, skillCode: `frac-label-${i}`, prerequisites: idx === 0 ? [] : [exercises[idx - 1].id], type: "eleccion", content: { instruction: `¿Cuál es "${l.label}"?`, audioText: `${l.label}`, emoji: "🔵", options: [ { label: fracLabel(l.frac), correct: true, id: `c-${i}` }, { label: fracLabel(labels[(i + 1) % labels.length].frac), correct: false, id: `w1-${i}` }, { label: fracLabel(labels[(i + 2) % labels.length].frac), correct: false, id: `w2-${i}` }, ].sort(() => Math.random() - 0.5), }, functionalContext: "Identificar fracciones por nombre con método Montessori.", errorType: "confusion-letra", }) } // Part 3: Shade recognition (conciencia) const shades = [ { num: 1, den: 2, text: "Si dividís una pizza en 2 partes iguales y tomás 1, ¿qué fracción comiste?" }, { num: 1, den: 3, text: "Si dividís una pizza en 3 partes iguales y tomás 1, ¿qué fracción comiste?" }, { num: 2, den: 3, text: "Si dividís una pizza en 3 partes iguales y tomás 2, ¿qué fracción comiste?" }, { num: 1, den: 4, text: "Si dividís una pizza en 4 partes iguales y tomás 1, ¿qué fracción comiste?" }, { num: 3, den: 4, text: "Si dividís una pizza en 4 partes iguales y tomás 3, ¿qué fracción comiste?" }, { num: 2, den: 4, text: "Si dividís una pizza en 4 partes iguales y tomás 2, ¿qué fracción comiste?" }, { num: 0, den: 0, text: "" }, { num: 0, den: 0, text: "" }, { num: 0, den: 0, text: "" }, ] for (let i = 0; i < shades.length; i++) { if (!shades[i].text) continue const s = shades[i] const idx = compares.length + labels.length + i exercises.push({ id: `fra9-frac-shade-${i}`, stage: 9, skillCode: `frac-shade-${i}`, prerequisites: idx === 0 ? [] : [exercises[idx - 1].id], type: "conciencia", content: { instruction: s.text, audioText: s.text, emoji: "🍕", options: [ { label: `${s.num}/${s.den}`, correct: true, id: `c-${i}` }, { label: `${s.den}/${s.num}`, correct: false, id: `w1-${i}` }, { label: `${s.num + 1}/${s.den}`, correct: false, id: `w2-${i}` }, ].sort(() => Math.random() - 0.5), }, functionalContext: "Reconocer fracciones en contexto de partes de un entero (círculos Montessori).", errorType: "confusion-letra", }) } const stage: Stage = { id: 9, name: "Fracciones simples (1/2, 1/3, 1/4)", description: "Reconocer y comparar fracciones básicas con círculos de fracciones Montessori.", exercises, } export default stage