'use strict'; /* ════════════════════════════════════════════════════════════════════════ Генераторы задач тренажёра — ДАННЫЕ, не код. Таксономия: тема → навык. Приём «корень-вперёд»: выбираем целый корень/множители и коэффициенты, затем ВЫВОДИМ остальное так, чтобы ответ был целым, а задача — решаемой. Поэтому самопроверка движка (verifyRoot) всегда проходит. Шаг решения — { note(подробный текст), tex(одно равенство) }; tex рендерится в KaTeX (exprToLatex). Последний шаг «Проверка» подставляет корень — это и педагогика, и наглядная демонстрация того, как движок проверяет ответ. Виды задач: • solve (деф.) — уравнение lhs = rhs, ученик находит x. Показывается уравнение. • compute (kind:'compute') — вычислительная задача (проценты): на сцене — текстовый prompt из display, а lhs:'x' / rhs:<значение> служат ТОЛЬКО для проверки ответа подстановкой (latex уравнения не показывается). Темы (7 класс, алгебра): Уравнения → Пропорции → Проценты. Дальше (Уровень 1): текстовые задачи через LLM с той же подстановочной верификацией. ════════════════════════════════════════════════════════════════════════ */ (function (global) { // Классы по программе наших учебников (Алгебра/Геометрия 7–9). var TOPICS = [ { key: 'linear-eq', label: 'Уравнения', subject: 'algebra', grade: 7, order: 1 }, { key: 'proportions', label: 'Пропорции', subject: 'algebra', grade: 6, order: 2 }, { key: 'percents', label: 'Проценты', subject: 'algebra', grade: 6, order: 3 }, { key: 'simplify', label: 'Упрощение', subject: 'algebra', grade: 7, order: 4 }, { key: 'powers', label: 'Степени', subject: 'algebra', grade: 7, order: 5 }, { key: 'formulas', label: 'Формулы', subject: 'algebra', grade: 7, order: 6 }, { key: 'inequalities', label: 'Неравенства', subject: 'algebra', grade: 7, order: 7 }, { key: 'systems', label: 'Системы', subject: 'algebra', grade: 7, order: 8 }, { key: 'quadratic', label: 'Квадратные', subject: 'algebra', grade: 8, order: 9 }, { key: 'progressions', label: 'Прогрессии', subject: 'algebra', grade: 9, order: 10 }, { key: 'gcd-lcm', label: 'НОД и НОК', subject: 'algebra', grade: 5, order: 1.4 }, { key: 'fractions', label: 'Дроби', subject: 'algebra', grade: 5, order: 1.5 }, { key: 'decimals', label: 'Десятичные', subject: 'algebra', grade: 5, order: 1.6 }, { key: 'negatives', label: 'Отрицательные', subject: 'algebra', grade: 6, order: 1.7 }, { key: 'applied', label: 'Задачи', subject: 'algebra', grade: 7, order: 11 }, { key: 'g-angles', label: 'Углы', subject: 'geometry', grade: 7, order: 12 }, { key: 'g-pyth', label: 'Пифагор', subject: 'geometry', grade: 8, order: 13 }, { key: 'g-area', label: 'Площади', subject: 'geometry', grade: 8, order: 14 }, { key: 'g-poly', label: 'Многоугольники', subject: 'geometry', grade: 8, order: 15 }, { key: 'g-sim', label: 'Подобие', subject: 'geometry', grade: 8, order: 16 } ]; var GENERATORS = [ /* ═══ Тема: Уравнения ═══ */ /* ax + b = c */ { id: 'lin-basic', topic: 'linear-eq', order: 1, subject: 'algebra', grade: 7, title: 'ax + b = c', pick: { a: [2, 9], b: [1, 20], root: [-9, 9] }, require: 'root != 0', derive: { c: 'a*root + b', cmb: 'a*root' }, lhs: '{a}*x + {b}', rhs: '{c}', display: '{a}x + {b} = {c}', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Перед нами линейное уравнение. Наша цель — оставить x одного в левой части. Сначала уберём свободное число {b}: перенесём его вправо, поменяв знак.', tex: '{a}x = {c} - {b}' }, { note: 'Выполняем вычитание в правой части.', tex: '{a}x = {cmb}' }, { note: 'Осталось избавиться от множителя при x — делим обе части уравнения на {a}.', tex: 'x = {cmb} / {a}' }, { note: 'Получаем корень уравнения.', tex: 'x = {ans}' }, { note: 'Проверка: подставим найденное значение в исходное уравнение — левая часть должна совпасть с правой.', tex: '{a}*({ans}) + {b} = {c}' } ] }, /* a(x + b) = c */ { id: 'lin-paren', topic: 'linear-eq', order: 2, subject: 'algebra', grade: 7, title: 'a(x + b) = c', pick: { a: [2, 8], b: [1, 12], root: [-9, 9] }, require: 'root != 0', derive: { c: 'a*(root + b)', ca: 'root + b' }, lhs: '{a}*(x + {b})', rhs: '{c}', display: '{a}(x + {b}) = {c}', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Слева число {a} умножается на скобку. Самый короткий путь — разделить обе части уравнения на {a}, чтобы убрать этот множитель.', tex: 'x + {b} = {ca}' }, { note: 'Справа получилось целое число. Теперь переносим {b} вправо со сменой знака.', tex: 'x = {ca} - {b}' }, { note: 'Получаем корень уравнения.', tex: 'x = {ans}' }, { note: 'Проверка: подставляем корень в скобку исходного уравнения.', tex: '{a}*({ans} + {b}) = {c}' } ] }, /* ax + b = cx + d */ { id: 'lin-both-sides', topic: 'linear-eq', order: 3, subject: 'algebra', grade: 7, title: 'ax + b = cx + d', pick: { a: [3, 9], c: [1, 8], b: [1, 20], root: [-9, 9] }, constraint: 'c < a', require: 'root != 0', derive: { d: '(a - c)*root + b', amc: 'a - c', dmb: '(a - c)*root' }, lhs: '{a}*x + {b}', rhs: '{c}*x + {d}', display: '{a}x + {b} = {c}x + {d}', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Здесь x есть в обеих частях. Соберём все слагаемые с x слева, а числа — справа. Переносимые слагаемые меняют знак.', tex: '({a} - {c})x = {d} - {b}' }, { note: 'Приводим подобные: вычитаем коэффициенты при x и отдельно числа.', tex: '{amc}x = {dmb}' }, { note: 'Делим обе части на коэффициент при x, то есть на {amc}.', tex: 'x = {dmb} / {amc}' }, { note: 'Получаем корень уравнения.', tex: 'x = {ans}' }, { note: 'Проверка: подставим корень — обе части дадут одно и то же число.', tex: '{a}*({ans}) + {b} = {c}*({ans}) + {d}' } ] }, /* a(x + b) = c(x + d) */ { id: 'lin-paren-both', topic: 'linear-eq', order: 4, subject: 'algebra', grade: 7, title: 'a(x+b) = c(x+d)', pick: { a: [2, 6], c: [2, 6], b: [1, 10], root: [-6, 6] }, constraint: 'a != c', derive: { V: 'a*(root + b)', d: 'V/c - root', ab: 'a*b', cd: 'c*(V/c - root)', amc: 'a - c', diff: 'c*(V/c - root) - a*b' }, require: 'mod(V, c) == 0 && root != 0', lhs: '{a}*(x + {b})', rhs: '{c}*(x + {d})', display: '{a}(x + {b}) = {c}(x + {d})', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Скобки с двух сторон. Раскрываем их: умножаем множитель перед скобкой на каждое слагаемое внутри.', tex: '{a}x + {ab} = {c}x + {cd}' }, { note: 'Переносим слагаемые с x влево, числа — вправо, и приводим подобные.', tex: '{amc}x = {diff}' }, { note: 'Делим обе части на {amc}.', tex: 'x = {diff} / {amc}' }, { note: 'Получаем корень уравнения.', tex: 'x = {ans}' }, { note: 'Проверка: подставляем корень в обе скобки.', tex: '{a}*({ans} + {b}) = {c}*({ans} + {d})' } ] }, /* x/a + b = c */ { id: 'lin-frac-denom', topic: 'linear-eq', order: 5, subject: 'algebra', grade: 7, title: 'x/a + b = c', pick: { a: [2, 6], k: [-6, 6], b: [1, 12] }, require: 'k != 0', derive: { root: 'a*k', c: 'k + b', cmb: 'k' }, lhs: 'x/{a} + {b}', rhs: '{c}', display: 'x/{a} + {b} = {c}', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Слева — дробь x/{a} и число {b}. Сначала уберём свободное число: вычтем {b} из обеих частей.', tex: 'x/{a} = {cmb}' }, { note: 'Чтобы избавиться от знаменателя {a}, умножаем обе части уравнения на {a}.', tex: 'x = {cmb} * {a}' }, { note: 'Получаем корень уравнения.', tex: 'x = {ans}' }, { note: 'Проверка: подставляем корень в исходное уравнение.', tex: '{ans}/{a} + {b} = {c}' } ] }, /* (a·x)/b = c */ { id: 'lin-coef-frac', topic: 'linear-eq', order: 6, subject: 'algebra', grade: 7, title: 'ax/b = c', pick: { a: [2, 5], b: [2, 5], m: [-5, 5] }, require: 'm != 0', derive: { root: 'b*m', c: 'a*m', cb: 'a*m*b' }, lhs: '{a}*x/{b}', rhs: '{c}', display: '{a}x/{b} = {c}', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Слева дробь, в числителе — {a}x. Умножаем обе части уравнения на знаменатель {b}, чтобы избавиться от дроби.', tex: '{a}x = {cb}' }, { note: 'Теперь делим обе части на коэффициент {a}.', tex: 'x = {cb} / {a}' }, { note: 'Получаем корень уравнения.', tex: 'x = {ans}' }, { note: 'Проверка: подставляем корень в исходную дробь.', tex: '{a}*({ans})/{b} = {c}' } ] }, /* (ax + b)/c = d */ { id: 'lin-frac-eq', topic: 'linear-eq', order: 7, subject: 'algebra', grade: 7, title: '(ax + b)/c = d', pick: { a: [2, 6], b: [1, 12], c: [2, 6], root: [-6, 6] }, derive: { prod: 'a*root + b', d: '(a*root + b)/c', cd: 'a*root + b', cdmb: 'a*root' }, require: 'mod(a*root + b, c) == 0 && root != 0', lhs: '({a}*x + {b})/{c}', rhs: '{d}', display: '({a}x + {b})/{c} = {d}', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Вся левая часть делится на {c}. Умножаем обе части уравнения на {c}, чтобы убрать знаменатель.', tex: '{a}x + {b} = {cd}' }, { note: 'Переносим число {b} в правую часть со сменой знака.', tex: '{a}x = {cdmb}' }, { note: 'Делим обе части на {a}.', tex: 'x = {cdmb} / {a}' }, { note: 'Получаем корень уравнения.', tex: 'x = {ans}' }, { note: 'Проверка: подставляем корень в исходную дробь.', tex: '({a}*({ans}) + {b})/{c} = {d}' } ] }, /* ═══ Тема: Пропорции ═══ */ /* a/b = c/x */ { id: 'prop-x-right', topic: 'proportions', order: 1, subject: 'algebra', grade: 7, title: 'a/b = c/x', pick: { a: [2, 9], b: [2, 9], t: [2, 9] }, derive: { c: 'a*t', root: 'b*t', bc: 'b*a*t' }, lhs: '{a}/{b}', rhs: '{c}/x', display: '{a}/{b} = {c}/x', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Это пропорция — равенство двух отношений. По основному свойству пропорции произведение крайних членов равно произведению средних (умножаем «крест-накрест»).', tex: '{a}*x = {b} * {c}' }, { note: 'Считаем произведение в правой части.', tex: '{a}x = {bc}' }, { note: 'Делим обе части на {a}, чтобы найти x.', tex: 'x = {bc} / {a}' }, { note: 'Получаем корень.', tex: 'x = {ans}' }, { note: 'Проверка: при найденном x обе дроби равны.', tex: '{a}/{b} = {c}/{ans}' } ] }, /* x/a = b/c */ { id: 'prop-x-left', topic: 'proportions', order: 2, subject: 'algebra', grade: 7, title: 'x/a = b/c', pick: { a: [2, 9], c: [2, 9], s: [2, 9] }, derive: { b: 'c*s', root: 'a*s', ab: 'a*c*s' }, lhs: 'x/{a}', rhs: '{b}/{c}', display: 'x/{a} = {b}/{c}', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Перед нами пропорция. Перемножаем её члены крест-накрест: числитель левой дроби на знаменатель правой и наоборот.', tex: '{c}*x = {a} * {b}' }, { note: 'Считаем произведение в правой части.', tex: '{c}x = {ab}' }, { note: 'Делим обе части на {c}.', tex: 'x = {ab} / {c}' }, { note: 'Получаем корень.', tex: 'x = {ans}' }, { note: 'Проверка: обе дроби равны.', tex: '{ans}/{a} = {b}/{c}' } ] }, /* a/x = b/c */ { id: 'prop-x-denom', topic: 'proportions', order: 3, subject: 'algebra', grade: 7, title: 'a/x = b/c', pick: { b: [2, 9], c: [2, 9], s: [2, 9] }, derive: { a: 'b*s', root: 'c*s', ac: 'b*s*c' }, lhs: '{a}/x', rhs: '{b}/{c}', display: '{a}/x = {b}/{c}', answerVar: 'x', answer: 'root', integerAnswer: true, solution: [ { note: 'Пропорция, где неизвестное стоит в знаменателе. Перемножаем крест-накрест.', tex: '{b}*x = {a} * {c}' }, { note: 'Считаем произведение в правой части.', tex: '{b}x = {ac}' }, { note: 'Делим обе части на {b}.', tex: 'x = {ac} / {b}' }, { note: 'Получаем корень.', tex: 'x = {ans}' }, { note: 'Проверка: обе дроби равны.', tex: '{a}/{ans} = {b}/{c}' } ] }, /* ═══ Тема: Проценты (вычислительные задачи) ═══ */ /* p% от числа a */ { id: 'pct-of', topic: 'percents', order: 1, subject: 'algebra', grade: 7, kind: 'compute', title: 'p% от числа', pick: { pidx: [2, 10], abase: [1, 15] }, derive: { p: 'pidx*5', a: 'abase*20', val: 'pidx*abase' }, lhs: 'x', rhs: '{p}*{a}/100', display: 'Найдите {p}% от числа {a}', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Процент — это сотая доля числа. Чтобы найти {p}% от {a}, нужно умножить число на {p} и разделить на 100.', tex: 'x = {a}*{p}/100' }, { note: 'Выполняем умножение и деление — получаем ответ.', tex: 'x = {ans}' } ] }, /* сколько % составляет a от b */ { id: 'pct-what', topic: 'percents', order: 2, subject: 'algebra', grade: 7, kind: 'compute', title: 'Сколько процентов', pick: { pidx: [2, 10], bbase: [1, 8] }, derive: { p: 'pidx*5', b: 'bbase*20', a: 'pidx*bbase' }, lhs: 'x', rhs: '100*{a}/{b}', display: 'Сколько процентов составляет {a} от {b}?', answerVar: 'x', answer: 'p', integerAnswer: true, solution: [ { note: 'Чтобы узнать, какую часть {a} составляет от {b}, делим {a} на {b}. А чтобы перевести эту часть в проценты — умножаем результат на 100.', tex: 'x = {a}/{b}*100' }, { note: 'Считаем — ответ получается в процентах.', tex: 'x = {ans}' } ] }, /* p% числа равны a — найти число */ { id: 'pct-whole', topic: 'percents', order: 3, subject: 'algebra', grade: 7, kind: 'compute', title: 'Число по проценту', pick: { pidx: [2, 10], wbase: [1, 12] }, derive: { p: 'pidx*5', whole: 'wbase*20', a: 'pidx*wbase' }, lhs: 'x', rhs: '100*{a}/{p}', display: '{p}% числа равны {a}. Найдите это число.', answerVar: 'x', answer: 'whole', integerAnswer: true, solution: [ { note: 'Известно, что {p}% некоторого числа равны {a}. Значит само число во столько раз больше: умножаем {a} на 100 и делим на {p}.', tex: 'x = {a}*100/{p}' }, { note: 'Считаем — получаем искомое число.', tex: 'x = {ans}' } ] }, /* ═══ Тема: Упрощение выражений (проверка эквивалентностью) ═══ */ /* a·x + b·x → (a+b)x */ { id: 'simp-like', topic: 'simplify', order: 1, subject: 'algebra', grade: 7, kind: 'simplify', title: 'Привести подобные', pick: { a: [2, 9], b: [2, 9] }, derive: { s: 'a + b' }, srcExpr: '{a}*x + {b}*x', answerExpr: '{s}*x', answerVars: ['x'], display: 'Упростите: {a}x + {b}x', solution: [ { note: 'Оба слагаемых содержат x — это подобные слагаемые. Складываем их коэффициенты: {a} + {b} = {s}.', tex: '{a}x + {b}x = {s}x' } ] }, /* a(x + b) → ax + ab */ { id: 'simp-expand', topic: 'simplify', order: 2, subject: 'algebra', grade: 7, kind: 'simplify', title: 'Раскрыть скобки', pick: { a: [2, 9], b: [1, 9] }, derive: { ab: 'a*b' }, srcExpr: '{a}*(x + {b})', answerExpr: '{a}*x + {ab}', answerVars: ['x'], display: 'Раскройте скобки: {a}(x + {b})', solution: [ { note: 'Умножаем множитель {a} на каждое слагаемое внутри скобки.', tex: '{a}(x + {b}) = {a}x + {ab}' } ] }, /* ═══ Тема: Квадратные уравнения (несколько корней) ═══ */ /* x² + bx + c = 0 — разложение по Виета (два корня r1, r2) */ { id: 'quad-factored', topic: 'quadratic', order: 1, subject: 'algebra', grade: 8, kind: 'roots', title: 'x² + bx + c = 0', pick: { r1: [-7, 7], r2: [-7, 7] }, constraint: 'r1 != r2', derive: { b: '-(r1 + r2)', c: 'r1*r2' }, lhs: 'x^2 + {b}*x + {c}', rhs: '0', answerVar: 'x', answers: ['r1', 'r2'], integerAnswer: true, solution: [ { note: 'Квадратное уравнение приравнено к нулю. По теореме Виета ищем два числа: их сумма равна {r1}+{r2}, произведение — {c}. Это и есть корни. Раскладываем на множители:', tex: '(x - {r1})(x - {r2}) = 0' }, { note: 'Произведение равно нулю, когда обнуляется множитель. Первый корень:', tex: 'x = {r1}' }, { note: 'Второй корень:', tex: 'x = {r2}' } ] }, /* x² − a² = 0 — разность квадратов (корни ±a) */ { id: 'quad-diff', topic: 'quadratic', order: 2, subject: 'algebra', grade: 8, kind: 'roots', title: 'x² − a² = 0', pick: { a: [2, 9] }, derive: { a2: 'a*a' }, lhs: 'x^2 - {a2}', rhs: '0', answerVar: 'x', answers: ['a', '-a'], integerAnswer: true, solution: [ { note: 'Слева — разность квадратов: x² − {a2} = (x − {a})(x + {a}). Раскладываем:', tex: '(x - {a})(x + {a}) = 0' }, { note: 'Первый корень:', tex: 'x = {a}' }, { note: 'Второй корень:', tex: 'x = -{a}' } ] }, /* ═══ Тема: Степени ═══ */ /* вычислить aⁿ */ { id: 'pow-eval', topic: 'powers', order: 1, subject: 'algebra', grade: 8, kind: 'compute', title: 'Вычислить степень', pick: { a: [2, 6], n: [2, 3] }, derive: { val: 'a^n' }, lhs: 'x', rhs: '{a}^{n}', display: 'Вычислите {a} в степени {n}', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Степень — это повторное умножение основания на себя.', tex: 'x = {a}^{n}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* xᵃ · xᵇ = xᵃ⁺ᵇ */ { id: 'pow-mult', topic: 'powers', order: 2, subject: 'algebra', grade: 8, kind: 'simplify', title: 'Произведение степеней', pick: { a: [2, 5], b: [2, 5] }, derive: { s: 'a + b' }, srcExpr: 'x^{a}*x^{b}', answerExpr: 'x^{s}', answerVars: ['x'], display: 'Упростите: x^{a}·x^{b}', solution: [ { note: 'При умножении степеней с одинаковым основанием показатели складываются: {a} + {b} = {s}.', tex: 'x^{a}*x^{b} = x^{s}' } ] }, /* (xᵃ)ᵇ = xᵃᵇ */ { id: 'pow-pow', topic: 'powers', order: 3, subject: 'algebra', grade: 8, kind: 'simplify', title: 'Степень степени', pick: { a: [2, 4], b: [2, 3] }, derive: { ab: 'a*b' }, srcExpr: '(x^{a})^{b}', answerExpr: 'x^{ab}', answerVars: ['x'], display: 'Упростите: (x^{a})^{b}', solution: [ { note: 'При возведении степени в степень показатели перемножаются: {a}·{b} = {ab}.', tex: '(x^{a})^{b} = x^{ab}' } ] }, /* ═══ Тема: Формулы сокращённого умножения ═══ */ /* (x + a)² */ { id: 'sq-sum', topic: 'formulas', order: 1, subject: 'algebra', grade: 8, kind: 'simplify', title: 'Квадрат суммы', pick: { a: [1, 9] }, derive: { a2: 'a*a', a2x: '2*a' }, srcExpr: '(x + {a})^2', answerExpr: 'x^2 + {a2x}*x + {a2}', answerVars: ['x'], display: 'Раскройте: (x + {a})²', solution: [ { note: 'Квадрат суммы: (x + {a})² = x² + 2·{a}·x + {a}².', tex: '(x + {a})^2 = x^2 + {a2x}*x + {a2}' } ] }, /* (x − a)² */ { id: 'sq-diff', topic: 'formulas', order: 2, subject: 'algebra', grade: 8, kind: 'simplify', title: 'Квадрат разности', pick: { a: [1, 9] }, derive: { a2: 'a*a', a2x: '2*a' }, srcExpr: '(x - {a})^2', answerExpr: 'x^2 - {a2x}*x + {a2}', answerVars: ['x'], display: 'Раскройте: (x − {a})²', solution: [ { note: 'Квадрат разности: (x − {a})² = x² − 2·{a}·x + {a}².', tex: '(x - {a})^2 = x^2 - {a2x}*x + {a2}' } ] }, /* (x − a)(x + a) = x² − a² */ { id: 'diff-sq', topic: 'formulas', order: 3, subject: 'algebra', grade: 8, kind: 'simplify', title: 'Разность квадратов', pick: { a: [2, 9] }, derive: { a2: 'a*a' }, srcExpr: '(x - {a})*(x + {a})', answerExpr: 'x^2 - {a2}', answerVars: ['x'], display: 'Раскройте: (x − {a})(x + {a})', solution: [ { note: 'Произведение разности и суммы даёт разность квадратов: (x − {a})(x + {a}) = x² − {a}².', tex: '(x - {a})*(x + {a}) = x^2 - {a2}' } ] }, /* ═══ Тема: Линейные неравенства ═══ */ /* ax + b < c (a>0, знак сохраняется) */ { id: 'ineq-lt', topic: 'inequalities', order: 1, subject: 'algebra', grade: 8, kind: 'inequality', title: 'ax + b < c', pick: { a: [2, 6], b: [1, 15], root: [-8, 8] }, derive: { c: 'a*root + b', cmb: 'a*root' }, lhs: '{a}*x + {b}', rhs: '{c}', dispOp: '<', relOp: '<', bound: 'root', answerVar: 'x', solution: [ { note: 'Переносим свободный член {b} вправо:', tex: '{a}x < {cmb}' }, { note: 'Делим обе части на {a} — число положительное, знак неравенства не меняется:', tex: 'x < {root}' } ] }, /* ax + b ≥ c (a>0) */ { id: 'ineq-ge', topic: 'inequalities', order: 2, subject: 'algebra', grade: 8, kind: 'inequality', title: 'ax + b ≥ c', pick: { a: [2, 6], b: [1, 15], root: [-8, 8] }, derive: { c: 'a*root + b', cmb: 'a*root' }, lhs: '{a}*x + {b}', rhs: '{c}', dispOp: '>=', relOp: '>=', bound: 'root', answerVar: 'x', solution: [ { note: 'Переносим {b} вправо:', tex: '{a}x >= {cmb}' }, { note: 'Делим на {a} (положительное) — знак сохраняется:', tex: 'x >= {root}' } ] }, /* −ax + b < c (коэффициент отрицательный → знак МЕНЯЕТСЯ) */ { id: 'ineq-flip', topic: 'inequalities', order: 3, subject: 'algebra', grade: 8, kind: 'inequality', title: '−ax + b < c (смена знака)', pick: { a: [2, 6], b: [1, 15], root: [-8, 8] }, derive: { c: 'b - a*root', cmb: '-a*root' }, lhs: '-{a}*x + {b}', rhs: '{c}', dispOp: '<', relOp: '>', bound: 'root', answerVar: 'x', solution: [ { note: 'Переносим {b} вправо:', tex: '-{a}x < {cmb}' }, { note: 'Делим на отрицательное число (−{a}) — знак неравенства МЕНЯЕТСЯ на противоположный:', tex: 'x > {root}' } ] }, /* ═══ Тема: Прогрессии (9 класс) ═══ */ /* n-й член арифметической прогрессии */ { id: 'prog-arith-term', topic: 'progressions', order: 1, subject: 'algebra', grade: 9, kind: 'compute', title: 'n-й член арифм. прогрессии', pick: { a: [-10, 20], d: [-8, 8], n: [3, 12] }, require: 'd != 0', derive: { val: 'a + (n - 1)*d' }, lhs: 'x', rhs: '{a} + ({n} - 1)*{d}', display: 'Арифметическая прогрессия: a₁ = {a}, d = {d}. Найдите {n}-й член.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Формула n-го члена арифметической прогрессии: aₙ = a₁ + (n − 1)·d. Подставляем:', tex: 'x = {a} + ({n} - 1)*{d}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* n-й член геометрической прогрессии */ { id: 'prog-geom-term', topic: 'progressions', order: 2, subject: 'algebra', grade: 9, kind: 'compute', title: 'n-й член геом. прогрессии', pick: { b: [1, 5], q: [2, 3], n: [2, 4] }, derive: { val: 'b * q^(n - 1)' }, lhs: 'x', rhs: '{b} * {q}^({n} - 1)', display: 'Геометрическая прогрессия: b₁ = {b}, q = {q}. Найдите {n}-й член.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Формула n-го члена геометрической прогрессии: bₙ = b₁·q^(n−1). Подставляем:', tex: 'x = {b} * {q}^({n} - 1)' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* ═══ Тема: Углы (геометрия, 7 класс) ═══ */ /* третий угол треугольника */ { id: 'ang-triangle', topic: 'g-angles', order: 1, subject: 'geometry', grade: 7, kind: 'compute', title: 'Третий угол треугольника', pick: { a: [20, 80], b: [20, 80] }, derive: { val: '180 - a - b' }, require: 'val >= 15 && val <= 150', lhs: 'x', rhs: '180 - {a} - {b}', display: 'В треугольнике два угла равны {a}° и {b}°. Найдите третий угол (в градусах).', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Сумма углов треугольника равна 180°. Значит третий угол:', tex: 'x = 180 - {a} - {b}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* смежный угол */ { id: 'ang-adjacent', topic: 'g-angles', order: 2, subject: 'geometry', grade: 7, kind: 'compute', title: 'Смежный угол', pick: { a: [25, 155] }, derive: { val: '180 - a' }, lhs: 'x', rhs: '180 - {a}', display: 'Один из смежных углов равен {a}°. Найдите другой смежный с ним угол.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Сумма смежных углов равна 180°. Значит:', tex: 'x = 180 - {a}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* внешний угол треугольника */ { id: 'ang-exterior', topic: 'g-angles', order: 3, subject: 'geometry', grade: 7, kind: 'compute', title: 'Внешний угол треугольника', pick: { a: [20, 80], b: [20, 80] }, derive: { val: 'a + b' }, require: 'val <= 160', lhs: 'x', rhs: '{a} + {b}', display: 'Внешний угол треугольника равен сумме двух не смежных с ним внутренних углов. Эти углы равны {a}° и {b}°. Найдите внешний угол.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Внешний угол треугольника равен сумме двух не смежных с ним внутренних углов:', tex: 'x = {a} + {b}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* ═══ Тема: Теорема Пифагора (геометрия, 8 класс) ═══ */ /* гипотенуза по катетам (пифагорова тройка m,n) */ { id: 'pyth-hyp', topic: 'g-pyth', order: 1, subject: 'geometry', grade: 8, kind: 'compute', title: 'Гипотенуза (Пифагор)', pick: { m: [2, 5], n: [1, 4] }, constraint: 'm > n', derive: { a: 'm*m - n*n', b: '2*m*n', c: 'm*m + n*n' }, lhs: 'x', rhs: 'sqrt({a}^2 + {b}^2)', display: 'Катеты прямоугольного треугольника равны {a} и {b}. Найдите гипотенузу.', answerVar: 'x', answer: 'c', integerAnswer: true, solution: [ { note: 'По теореме Пифагора c² = a² + b², значит c = √(a² + b²):', tex: 'x = sqrt({a}^2 + {b}^2)' }, { note: 'Считаем (выходит целое — это пифагорова тройка):', tex: 'x = {ans}' } ] }, /* катет по гипотенузе и катету */ { id: 'pyth-leg', topic: 'g-pyth', order: 2, subject: 'geometry', grade: 8, kind: 'compute', title: 'Катет (Пифагор)', pick: { m: [2, 5], n: [1, 4] }, constraint: 'm > n', derive: { a: 'm*m - n*n', b: '2*m*n', c: 'm*m + n*n' }, lhs: 'x', rhs: 'sqrt({c}^2 - {a}^2)', display: 'Гипотенуза прямоугольного треугольника {c}, один катет {a}. Найдите второй катет.', answerVar: 'x', answer: 'b', integerAnswer: true, solution: [ { note: 'По теореме Пифагора b² = c² − a², значит b = √(c² − a²):', tex: 'x = sqrt({c}^2 - {a}^2)' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* ═══ Тема: Площади (геометрия, 8 класс) ═══ */ /* площадь прямоугольника */ { id: 'area-rect', topic: 'g-area', order: 1, subject: 'geometry', grade: 8, kind: 'compute', title: 'Площадь прямоугольника', pick: { a: [2, 16], b: [2, 16] }, derive: { val: 'a*b' }, lhs: 'x', rhs: '{a}*{b}', display: 'Стороны прямоугольника {a} и {b}. Найдите его площадь.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Площадь прямоугольника — произведение его сторон:', tex: 'x = {a}*{b}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* площадь треугольника */ { id: 'area-triangle', topic: 'g-area', order: 2, subject: 'geometry', grade: 8, kind: 'compute', title: 'Площадь треугольника', pick: { a: [2, 16], h: [2, 16] }, require: 'mod(a*h, 2) == 0', derive: { val: 'a*h/2' }, lhs: 'x', rhs: '{a}*{h}/2', display: 'Основание треугольника {a}, высота к нему {h}. Найдите площадь.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Площадь треугольника — половина произведения основания на высоту:', tex: 'x = {a}*{h}/2' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* площадь квадрата */ { id: 'area-square', topic: 'g-area', order: 3, subject: 'geometry', grade: 8, kind: 'compute', title: 'Площадь квадрата', pick: { a: [2, 20] }, derive: { val: 'a*a' }, lhs: 'x', rhs: '{a}^2', display: 'Сторона квадрата {a}. Найдите его площадь.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Площадь квадрата — сторона, возведённая в квадрат:', tex: 'x = {a}^2' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* ═══ Тема: Системы 2 линейных уравнений (7 класс) ═══ kind:'system' — ответ ПАРА (x; y). «Корень-вперёд»: берём решение (sx, sy) и коэффициенты, выводим правые части c1/c2 так, что система имеет ровно это решение (определитель ≠ 0). Движок рисует \begin{cases}, проверяет подстановкой. */ /* система с положительными коэффициентами */ { id: 'sys-2x2', topic: 'systems', order: 1, subject: 'algebra', grade: 7, kind: 'system', title: 'Система 2×2', pick: { a1: [1, 4], b1: [1, 4], a2: [1, 4], b2: [1, 4], sx: [-6, 6], sy: [-6, 6] }, constraint: 'a1*b2 - a2*b1 != 0', derive: { c1: 'a1*sx + b1*sy', c2: 'a2*sx + b2*sy' }, eqs: [{ lhs: '{a1}*x + {b1}*y', rhs: '{c1}' }, { lhs: '{a2}*x + {b2}*y', rhs: '{c2}' }], answers: { x: 'sx', y: 'sy' }, answerVars: ['x', 'y'], integerAnswer: true, solution: [ { note: 'Исключите одну переменную: умножьте уравнения так, чтобы коэффициенты при x (или y) совпали, и сложите/вычтите — найдёте одну переменную.', tex: '' }, { note: 'Подставьте найденное в любое уравнение. Решение системы: x = {sx}, y = {sy}.', tex: '' } ] }, /* система с отрицательными коэффициентами (сложнее) */ { id: 'sys-2x2-neg', topic: 'systems', order: 2, subject: 'algebra', grade: 8, kind: 'system', title: 'Система (с отрицательными)', pick: { a1: [-4, 4], b1: [-4, 4], a2: [-4, 4], b2: [-4, 4], sx: [-7, 7], sy: [-7, 7] }, constraint: 'a1 != 0 && b1 != 0 && a2 != 0 && b2 != 0 && a1*b2 - a2*b1 != 0', derive: { c1: 'a1*sx + b1*sy', c2: 'a2*sx + b2*sy' }, eqs: [{ lhs: '{a1}*x + {b1}*y', rhs: '{c1}' }, { lhs: '{a2}*x + {b2}*y', rhs: '{c2}' }], answers: { x: 'sx', y: 'sy' }, answerVars: ['x', 'y'], integerAnswer: true, solution: [ { note: 'Будьте внимательны со знаками. Исключите переменную методом сложения, найдите одну, подставьте во второе уравнение.', tex: '' }, { note: 'Решение системы: x = {sx}, y = {sy}.', tex: '' } ] }, /* ═══ Тема: Задачи (текстовые, параметрические — 7 класс) ═══ kind:'compute' — условие в display, lhs:'x'/rhs:<формула> для проверки. */ /* путь = скорость × время */ { id: 'app-move-dist', topic: 'applied', order: 1, subject: 'algebra', grade: 7, kind: 'compute', title: 'Путь (движение)', pick: { v: [10, 90], t: [2, 9] }, derive: { val: 'v*t' }, lhs: 'x', rhs: '{v}*{t}', display: 'Автомобиль ехал {t} ч со скоростью {v} км/ч. Какой путь он проехал (в км)?', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Путь равен произведению скорости на время:', tex: 'x = {v}*{t}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* время = путь / скорость */ { id: 'app-move-time', topic: 'applied', order: 2, subject: 'algebra', grade: 7, kind: 'compute', title: 'Время (движение)', pick: { v: [10, 90], t: [2, 9] }, derive: { S: 'v*t', val: 't' }, lhs: 'x', rhs: '{S}/{v}', display: 'Расстояние между городами {S} км. Автомобиль едет со скоростью {v} км/ч. За сколько часов он доедет?', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Время равно пути, делённому на скорость:', tex: 'x = {S}/{v}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* скорость = путь / время */ { id: 'app-move-speed', topic: 'applied', order: 3, subject: 'algebra', grade: 7, kind: 'compute', title: 'Скорость (движение)', pick: { v: [10, 90], t: [2, 9] }, derive: { S: 'v*t', val: 'v' }, lhs: 'x', rhs: '{S}/{t}', display: 'Поезд прошёл {S} км за {t} ч. Найдите его среднюю скорость (км/ч).', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Скорость равна пути, делённому на время:', tex: 'x = {S}/{t}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* содержание вещества в сплаве (проценты) */ { id: 'app-alloy', topic: 'applied', order: 4, subject: 'algebra', grade: 7, kind: 'compute', title: 'Сплав (проценты)', pick: { mfac: [1, 9], pidx: [1, 9] }, derive: { m: 'mfac*10', p: 'pidx*10', val: 'mfac*pidx' }, lhs: 'x', rhs: '{m}*{p}/100', display: 'Сплав массой {m} кг содержит {p}% меди. Сколько килограммов меди в сплаве?', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Масса меди = масса сплава × процент ÷ 100:', tex: 'x = {m}*{p}/100' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* цена со скидкой */ { id: 'app-discount', topic: 'applied', order: 5, subject: 'algebra', grade: 7, kind: 'compute', title: 'Цена со скидкой', pick: { pbase: [5, 30], didx: [1, 5] }, derive: { price: 'pbase*10', d: 'didx*10', val: 'pbase*(10 - didx)' }, lhs: 'x', rhs: '{price}*(100 - {d})/100', display: 'Товар стоил {price} руб. Скидка {d}%. Сколько он стоит после скидки (в рублях)?', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Новая цена = старая × (100 − скидка) ÷ 100:', tex: 'x = {price}*(100 - {d})/100' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* ═══ Площади (дополнение к g-area): трапеция, параллелограмм, ромб ═══ */ /* площадь трапеции */ { id: 'area-trapezoid', topic: 'g-area', order: 4, subject: 'geometry', grade: 8, kind: 'compute', title: 'Площадь трапеции', pick: { a: [2, 14], b: [2, 14], h: [2, 12] }, require: 'mod((a + b)*h, 2) == 0', derive: { val: '(a + b)*h/2' }, lhs: 'x', rhs: '({a} + {b})*{h}/2', display: 'Основания трапеции {a} и {b}, высота {h}. Найдите площадь.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Площадь трапеции — полусумма оснований на высоту:', tex: 'x = ({a} + {b})*{h}/2' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* площадь параллелограмма */ { id: 'area-parallelogram', topic: 'g-area', order: 5, subject: 'geometry', grade: 8, kind: 'compute', title: 'Площадь параллелограмма', pick: { a: [2, 16], h: [2, 14] }, derive: { val: 'a*h' }, lhs: 'x', rhs: '{a}*{h}', display: 'Сторона параллелограмма {a}, высота к ней {h}. Найдите площадь.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Площадь параллелограмма — сторона на высоту к ней:', tex: 'x = {a}*{h}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* площадь ромба по диагоналям */ { id: 'area-rhombus', topic: 'g-area', order: 6, subject: 'geometry', grade: 8, kind: 'compute', title: 'Площадь ромба', pick: { d1: [2, 16], d2: [2, 16] }, require: 'mod(d1*d2, 2) == 0', derive: { val: 'd1*d2/2' }, lhs: 'x', rhs: '{d1}*{d2}/2', display: 'Диагонали ромба {d1} и {d2}. Найдите площадь.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Площадь ромба — половина произведения диагоналей:', tex: 'x = {d1}*{d2}/2' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* ═══ Тема: Многоугольники (геометрия, 8 класс) ═══ */ /* сумма углов выпуклого n-угольника */ { id: 'poly-angles-sum', topic: 'g-poly', order: 1, subject: 'geometry', grade: 8, kind: 'compute', title: 'Сумма углов многоугольника', pick: { n: [3, 12] }, derive: { val: '180*(n - 2)' }, lhs: 'x', rhs: '180*({n} - 2)', display: 'Найдите сумму углов выпуклого {n}-угольника (в градусах).', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Сумма углов выпуклого n-угольника равна 180°·(n − 2):', tex: 'x = 180*({n} - 2)' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* угол правильного n-угольника */ { id: 'poly-regular-angle', topic: 'g-poly', order: 2, subject: 'geometry', grade: 8, kind: 'compute', title: 'Угол правильного многоугольника', pick: { n: [3, 20] }, require: 'mod(180*(n - 2), n) == 0', derive: { val: '180*(n - 2)/n' }, lhs: 'x', rhs: '180*({n} - 2)/{n}', display: 'Найдите величину угла правильного {n}-угольника (в градусах).', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Угол правильного n-угольника = 180°·(n − 2) ÷ n:', tex: 'x = 180*({n} - 2)/{n}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* ═══ Тема: Подобие (геометрия, 8 класс) ═══ */ /* сходственная сторона по коэффициенту подобия */ { id: 'sim-side', topic: 'g-sim', order: 1, subject: 'geometry', grade: 8, kind: 'compute', title: 'Сторона по коэффициенту', pick: { a: [2, 15], k: [2, 5] }, derive: { val: 'a*k' }, lhs: 'x', rhs: '{a}*{k}', display: 'Треугольники подобны с коэффициентом {k}. Сторона первого равна {a}. Найдите сходственную сторону второго.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Сходственные стороны подобных фигур пропорциональны коэффициенту подобия:', tex: 'x = {a}*{k}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* периметр подобной фигуры */ { id: 'sim-perimeter', topic: 'g-sim', order: 2, subject: 'geometry', grade: 8, kind: 'compute', title: 'Периметр подобной фигуры', pick: { p: [5, 30], k: [2, 5] }, derive: { val: 'p*k' }, lhs: 'x', rhs: '{p}*{k}', display: 'Фигуры подобны с коэффициентом {k}. Периметр первой равен {p}. Найдите периметр второй.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Периметры подобных фигур относятся как коэффициент подобия:', tex: 'x = {p}*{k}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* ═══ Тема: Дроби (5–6 класс) ═══ kind:'compute'; ответ может быть дробным — ученик вводит «3/4» (SimExpr посчитает). */ /* часть от числа (целый ответ: число кратно знаменателю) */ { id: 'frac-of-number', topic: 'fractions', order: 1, subject: 'algebra', grade: 5, kind: 'compute', title: 'Часть от числа', pick: { n: [2, 6], a: [1, 5], mfac: [2, 9] }, require: 'a < n', derive: { m: 'n*mfac', val: 'mfac*a' }, lhs: 'x', rhs: '{m}*{a}/{n}', display: 'Найдите {a}/{n} от числа {m}.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Чтобы найти часть от числа, умножаем число на числитель и делим на знаменатель:', tex: 'x = {m}*{a}/{n}' }, { note: 'Считаем:', tex: 'x = {ans}' } ] }, /* сложение дробей с одинаковым знаменателем (ответ — дробь) */ { id: 'frac-add-same', topic: 'fractions', order: 2, subject: 'algebra', grade: 5, kind: 'compute', title: 'Сложение дробей', pick: { n: [3, 9], a: [1, 6], b: [1, 6] }, require: 'a + b < 2*n', derive: { val: '(a + b)/n' }, lhs: 'x', rhs: '({a} + {b})/{n}', display: 'Вычислите {a}/{n} + {b}/{n}. Ответ запишите дробью (например 3/4) или числом.', answerVar: 'x', answer: 'val', solution: [ { note: 'При одинаковом знаменателе складываем числители, знаменатель оставляем:', tex: 'x = ({a} + {b})/{n}' }, { note: 'Получаем значение:', tex: 'x = {ans}' } ] }, /* ═══ Тема: НОД и НОК (5–6 класс) ═══ Числа строим как g·m и g·k (общий множитель g) → НОД ≥ g, не тривиален. gcd/lcm — функции SimExpr (алгоритм Евклида), считаются и проверяются движком. */ /* наибольший общий делитель */ { id: 'gcd-pair', topic: 'gcd-lcm', order: 1, subject: 'algebra', grade: 5, kind: 'compute', title: 'НОД двух чисел', pick: { g: [2, 9], m: [2, 8], k: [2, 8] }, constraint: 'm != k', derive: { a: 'g*m', b: 'g*k', val: 'gcd(a, b)' }, lhs: 'x', rhs: 'gcd({a}, {b})', display: 'Найдите наибольший общий делитель (НОД) чисел {a} и {b}.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Разложите числа на простые множители; НОД — произведение общих множителей в наименьших степенях (или алгоритм Евклида).', tex: '' }, { note: 'Получаем:', tex: 'x = {ans}' } ] }, /* наименьшее общее кратное */ { id: 'lcm-pair', topic: 'gcd-lcm', order: 2, subject: 'algebra', grade: 6, kind: 'compute', title: 'НОК двух чисел', pick: { g: [2, 6], m: [2, 7], k: [2, 7] }, constraint: 'm != k', derive: { a: 'g*m', b: 'g*k', val: 'lcm(a, b)' }, lhs: 'x', rhs: 'lcm({a}, {b})', display: 'Найдите наименьшее общее кратное (НОК) чисел {a} и {b}.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'НОК = произведение чисел, делённое на их НОД: НОК(a, b) = a·b ÷ НОД(a, b).', tex: '' }, { note: 'Получаем:', tex: 'x = {ans}' } ] }, /* ═══ Тема: Десятичные дроби (5 класс) ═══ Строим через десятые/сотые (целые ÷10, ÷100) → ответ печатается чисто. */ /* сложение десятичных */ { id: 'dec-add', topic: 'decimals', order: 1, subject: 'algebra', grade: 5, kind: 'compute', title: 'Сложение десятичных', pick: { a: [1, 9], b: [1, 9] }, derive: { da: 'a/10', db: 'b/10', val: '(a + b)/10' }, lhs: 'x', rhs: '({a} + {b})/10', display: 'Вычислите {da} + {db}.', answerVar: 'x', answer: 'val', solution: [ { note: 'Складываем десятичные дроби поразрядно (запятая под запятой):', tex: 'x = {da} + {db}' }, { note: 'Получаем:', tex: 'x = {ans}' } ] }, /* вычитание десятичных */ { id: 'dec-sub', topic: 'decimals', order: 2, subject: 'algebra', grade: 5, kind: 'compute', title: 'Вычитание десятичных', pick: { a: [2, 9], b: [1, 8] }, constraint: 'a > b', derive: { da: 'a/10', db: 'b/10', val: '(a - b)/10' }, lhs: 'x', rhs: '({a} - {b})/10', display: 'Вычислите {da} − {db}.', answerVar: 'x', answer: 'val', solution: [ { note: 'Вычитаем десятичные дроби поразрядно:', tex: 'x = {da} - {db}' }, { note: 'Получаем:', tex: 'x = {ans}' } ] }, /* умножение десятичных */ { id: 'dec-mult', topic: 'decimals', order: 3, subject: 'algebra', grade: 5, kind: 'compute', title: 'Умножение десятичных', pick: { a: [1, 9], b: [1, 9] }, derive: { da: 'a/10', db: 'b/10', val: '(a*b)/100' }, lhs: 'x', rhs: '({a}*{b})/100', display: 'Вычислите {da} · {db}.', answerVar: 'x', answer: 'val', solution: [ { note: 'Перемножаем без запятых как целые, затем отделяем 2 знака после запятой (по сумме знаков у множителей):', tex: 'x = {da} * {db}' }, { note: 'Получаем:', tex: 'x = {ans}' } ] }, /* ═══ Тема: Отрицательные числа (6 класс) ═══ Словесные формулировки — без двусмысленных операторов в условии. */ /* сумма с отрицательными */ { id: 'neg-add', topic: 'negatives', order: 1, subject: 'algebra', grade: 6, kind: 'compute', title: 'Сумма (отрицательные)', pick: { a: [-12, 12], b: [-12, 12] }, constraint: 'a != 0 && b != 0 && (a < 0 || b < 0)', derive: { val: 'a + b' }, lhs: 'x', rhs: '{a} + {b}', display: 'Найдите сумму чисел {a} и {b}.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Складываем с учётом знаков: при одинаковых знаках складываем модули; при разных — из большего модуля вычитаем меньший и ставим знак большего:', tex: 'x = {a} + {b}' }, { note: 'Получаем:', tex: 'x = {ans}' } ] }, /* разность с отрицательными */ { id: 'neg-sub', topic: 'negatives', order: 2, subject: 'algebra', grade: 6, kind: 'compute', title: 'Разность (отрицательные)', pick: { a: [-12, 12], b: [-12, 12] }, constraint: 'a != 0 && b != 0 && (a < 0 || b < 0)', derive: { val: 'a - b' }, lhs: 'x', rhs: '{a} - ({b})', display: 'Из числа {a} вычтите {b}.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Вычесть число — значит прибавить ему противоположное:', tex: 'x = {a} - ({b})' }, { note: 'Получаем:', tex: 'x = {ans}' } ] }, /* произведение с отрицательными */ { id: 'neg-mult', topic: 'negatives', order: 3, subject: 'algebra', grade: 6, kind: 'compute', title: 'Произведение (отрицательные)', pick: { a: [-9, 9], b: [-9, 9] }, constraint: 'a != 0 && b != 0 && (a < 0 || b < 0)', derive: { val: 'a*b' }, lhs: 'x', rhs: '{a}*{b}', display: 'Найдите произведение чисел {a} и {b}.', answerVar: 'x', answer: 'val', integerAnswer: true, solution: [ { note: 'Перемножаем модули; знак минус — если множители разных знаков, плюс — если одинаковых:', tex: 'x = {a}*{b}' }, { note: 'Получаем:', tex: 'x = {ans}' } ] } ]; // Структурная сложность генератора (1 — простейшая форма, 3 — больше действий / // скобки / дроби / переменная в обеих частях). Определяет, какой ВАРИАНТ внутри // темы даётся на выбранном уровне сложности (не просто масштаб чисел). var LEVELS = { // Уравнения: ax+b=c → скобки/обе части/дроби → (ax+b)/c=d 'lin-basic': 1, 'lin-paren': 2, 'lin-both-sides': 2, 'lin-frac-denom': 2, 'lin-coef-frac': 2, 'lin-paren-both': 3, 'lin-frac-eq': 3, // Пропорции 'prop-x-right': 1, 'prop-x-left': 1, 'prop-x-denom': 2, // Проценты 'pct-of': 1, 'pct-what': 2, 'pct-whole': 2, // Упрощение 'simp-like': 1, 'simp-expand': 2, // Степени 'pow-eval': 1, 'pow-mult': 2, 'pow-pow': 3, // Формулы сокр. умножения 'sq-sum': 2, 'sq-diff': 2, 'diff-sq': 3, // Неравенства (смена знака — сложнее) 'ineq-lt': 1, 'ineq-ge': 1, 'ineq-flip': 3, // Системы 2 уравнений 'sys-2x2': 2, 'sys-2x2-neg': 3, // Задачи (текстовые) 'app-move-dist': 1, 'app-move-speed': 1, 'app-move-time': 2, 'app-alloy': 2, 'app-discount': 2, // Квадратные 'quad-diff': 2, 'quad-factored': 3, // Прогрессии 'prog-arith-term': 2, 'prog-geom-term': 3, // Геометрия — Углы 'ang-adjacent': 1, 'ang-triangle': 2, 'ang-exterior': 2, // Геометрия — Пифагор 'pyth-hyp': 2, 'pyth-leg': 3, // Геометрия — Площади 'area-square': 1, 'area-rect': 1, 'area-triangle': 2, 'area-parallelogram': 2, 'area-trapezoid': 3, 'area-rhombus': 2, // Геометрия — Многоугольники / Подобие 'poly-angles-sum': 1, 'poly-regular-angle': 2, 'sim-side': 1, 'sim-perimeter': 2, // НОД/НОК / Дроби / Десятичные / Отрицательные 'gcd-pair': 1, 'lcm-pair': 2, 'frac-of-number': 1, 'frac-add-same': 2, 'dec-add': 1, 'dec-sub': 1, 'dec-mult': 2, 'neg-add': 1, 'neg-sub': 2, 'neg-mult': 2 }; GENERATORS.forEach(function (g) { g.level = LEVELS[g.id] || 1; }); function get(id) { for (var i = 0; i < GENERATORS.length; i++) if (GENERATORS[i].id === id) return GENERATORS[i]; return null; } function byTopic(key) { return GENERATORS.filter(function (g) { return g.topic === key; }) .sort(function (a, b) { return (a.order || 0) - (b.order || 0); }); } global.TrainerGenerators = { list: function () { return GENERATORS.slice(); }, topics: function () { return TOPICS.slice(); }, byTopic: byTopic, get: get, GENERATORS: GENERATORS, TOPICS: TOPICS }; })(typeof window !== 'undefined' ? window : globalThis);