From e4b0747dac650c0c93d39abc2f249c08280e7820 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 26 Jun 2026 13:31:38 +0300 Subject: [PATCH] =?UTF-8?q?feat(trainer):=20V4.1=20=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=BF=D0=BF=D0=B0=203=20=E2=80=94=2020=20=D0=B3=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20(=D0=B2?= =?UTF-8?q?=D1=8B=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20+=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=D1=83=D0=BB?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Третья волна плана v4 (упрощение/формулы/степени) + новые форматы условий. Все «корень-вперёд»; simplify проверяется эквивалентностью, compute — целым. Упрощение (simplify): simp-like-multivar (две буквы), simp-like-const (со числом), simp-sub-bracket (вычесть скобку — знаки), simp-distribute-combine (раскрыть+привести), simp-factor-common (вынести множитель), simp-factor-group (группировка), simp-eval-at (упростить и вычислить при x=x0). Формулы (formulas): diff-sq-factor (разложить разность квадратов, обратно), sq-trinom-factor (свернуть в квадрат), sq-sum-coef (квадрат суммы с коэф.), cube-sum (куб суммы), sum-cubes-factor (сумма кубов), fmt-blank-square (вставь число в тождество), fmt-fix-square (найди ошибку). Степени (powers): pow-div (частное), pow-product-base (степень произведения), pow-frac-combine (дробь степеней), pow-numeric-laws (произведение степеней числом), pow-standard-form (стандартный вид), pow-which-law (какой показатель). Новые ФОРМУЛИРОВКИ: вставь-пропуск, найди-ошибку, какой-закон, упрости-и-вычисли, разложить (обратные формулы) — разнообразие условий по запросу. Итого 116 генераторов. Смоук 26148 проверок (simplify: приём канон. answerExpr + отказ off-by-one; compute: целое+приём; все шаги→LaTeX); геометрия не задета (6968/0). Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/js/trainer/generators.js | 299 ++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) diff --git a/frontend/js/trainer/generators.js b/frontend/js/trainer/generators.js index ef72636..1e6b90a 100644 --- a/frontend/js/trainer/generators.js +++ b/frontend/js/trainer/generators.js @@ -1607,6 +1607,299 @@ { note: 'Сколько это процентов от закупочной цены — делим на {c} и умножаем на 100.', tex: 'x = 100 * ({s} - {c}) / {c}' }, { note: 'Считаем.', tex: 'x = {ans}' } ] + }, + + /* ═══════════════════════════════════════════════════════════════════════ + V4.1 — Группа 3: выражения (упрощение/формулы/степени) + новые формулировки + (вставь-пропуск, найди-ошибку, какой закон, упрости-и-вычисли). simplify — + проверка эквивалентностью (любая равная форма принимается); compute — целое. + ═══════════════════════════════════════════════════════════════════════ */ + + /* ── Упрощение ── */ + + /* привести подобные с двумя переменными */ + { + id: 'simp-like-multivar', topic: 'simplify', order: 3, subject: 'algebra', grade: 7, kind: 'simplify', + title: 'Подобные (две буквы)', + pick: { a: [2, 7], b: [2, 7], c: [1, 6], d: [1, 6] }, + derive: { sx: 'a + c', sy: 'b + d' }, + srcExpr: '{a}*x + {b}*y + {c}*x + {d}*y', answerExpr: '{sx}*x + {sy}*y', answerVars: ['x', 'y'], + display: 'Упростите: {a}x + {b}y + {c}x + {d}y', + solution: [ + { note: 'Группируем подобные: слагаемые с x и слагаемые с y отдельно.', tex: '({a} + {c})x + ({b} + {d})y' }, + { note: 'Складываем коэффициенты.', tex: '{sx}x + {sy}y' } + ] + }, + + /* привести подобные со свободным членом */ + { + id: 'simp-like-const', topic: 'simplify', order: 4, subject: 'algebra', grade: 7, kind: 'simplify', + title: 'Подобные с числом', + pick: { a: [2, 8], c: [1, 7], b: [1, 9], d: [1, 9] }, + derive: { sx: 'a + c', sc: 'b + d' }, + srcExpr: '{a}*x + {b} + {c}*x + {d}', answerExpr: '{sx}*x + {sc}', answerVars: ['x'], + display: 'Упростите: {a}x + {b} + {c}x + {d}', + solution: [ + { note: 'Складываем отдельно слагаемые с x и отдельно числа.', tex: '({a} + {c})x + ({b} + {d})' }, + { note: 'Получаем.', tex: '{sx}x + {sc}' } + ] + }, + + /* вычесть скобку (знаки) */ + { + id: 'simp-sub-bracket', topic: 'simplify', order: 5, subject: 'algebra', grade: 7, kind: 'simplify', + title: 'Вычесть скобку', + pick: { a: [4, 9], c: [1, 3], b: [5, 12], d: [1, 4] }, + constraint: 'c < a && d < b', + derive: { sx: 'a - c', sc: 'b - d' }, + srcExpr: '{a}*x + {b} - ({c}*x + {d})', answerExpr: '{sx}*x + {sc}', answerVars: ['x'], + display: 'Упростите: {a}x + {b} − ({c}x + {d})', + solution: [ + { note: 'Раскрываем скобку: знак «минус» перед ней меняет знаки ВСЕХ слагаемых внутри.', tex: '{a}x + {b} - {c}x - {d}' }, + { note: 'Приводим подобные.', tex: '{sx}x + {sc}' } + ] + }, + + /* раскрыть и привести */ + { + id: 'simp-distribute-combine', topic: 'simplify', order: 6, subject: 'algebra', grade: 7, kind: 'simplify', + title: 'Раскрыть и привести', + pick: { a: [2, 6], b: [1, 8], c: [1, 7] }, + derive: { ab: 'a*b', sx: 'a + c' }, + srcExpr: '{a}*(x + {b}) + {c}*x', answerExpr: '{sx}*x + {ab}', answerVars: ['x'], + display: 'Упростите: {a}(x + {b}) + {c}x', + solution: [ + { note: 'Раскрываем скобку — умножаем {a} на каждое слагаемое.', tex: '{a}x + {ab} + {c}x' }, + { note: 'Приводим подобные при x.', tex: '{sx}x + {ab}' } + ] + }, + + /* вынести общий множитель */ + { + id: 'simp-factor-common', topic: 'simplify', order: 7, subject: 'algebra', grade: 7, kind: 'simplify', + title: 'Вынести множитель', + pick: { a: [2, 6], c: [2, 7], d: [1, 8] }, + derive: { ac: 'a*c', ad: 'a*d' }, + srcExpr: '{ac}*x + {ad}', answerExpr: '{a}*({c}*x + {d})', answerVars: ['x'], + display: 'Вынесите общий множитель: {ac}x + {ad}', + solution: [ + { note: 'Оба слагаемых делятся на {a} — это общий множитель.', tex: '{ac}x + {ad}' }, + { note: 'Выносим {a} за скобку.', tex: '{a}*({c}x + {d})' } + ] + }, + + /* группировка */ + { + id: 'simp-factor-group', topic: 'simplify', order: 8, subject: 'algebra', grade: 8, kind: 'simplify', + title: 'Группировка', + pick: { a: [1, 7], b: [1, 7] }, + srcExpr: 'x*(x + {a}) + {b}*(x + {a})', answerExpr: '(x + {a})*(x + {b})', answerVars: ['x'], + display: 'Разложите на множители: x(x + {a}) + {b}(x + {a})', + solution: [ + { note: 'В обоих слагаемых есть общая скобка (x + {a}). Выносим её.', tex: '(x + {a})*(x + {b})' }, + { note: 'Это и есть разложение на множители.', tex: '(x + {a})(x + {b})' } + ] + }, + + /* упростить и вычислить при x = x0 */ + { + id: 'simp-eval-at', topic: 'simplify', order: 9, subject: 'algebra', grade: 7, kind: 'compute', + title: 'Упростить и вычислить', + pick: { a: [2, 7], b: [2, 7], x0: [1, 5] }, + derive: { s: 'a + b', val: '(a + b)*x0' }, + lhs: 'x', rhs: '({a} + {b})*{x0}', display: 'Упростите {a}x + {b}x и найдите значение при x = {x0}.', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Приводим подобные: {a}x + {b}x = {s}x.', tex: '{a}x + {b}x = {s}x' }, + { note: 'Подставляем x = {x0}.', tex: 'x = {s} * {x0}' }, + { note: 'Считаем.', tex: 'x = {ans}' } + ] + }, + + /* ── Формулы сокращённого умножения (обратные + расширенные) ── */ + + /* разложить разность квадратов (обратно) */ + { + id: 'diff-sq-factor', topic: 'formulas', order: 4, subject: 'algebra', grade: 8, kind: 'simplify', + title: 'Разложить разность квадратов', + pick: { a: [2, 9] }, + derive: { a2: 'a*a' }, + srcExpr: 'x^2 - {a2}', answerExpr: '(x - {a})*(x + {a})', answerVars: ['x'], + display: 'Разложите на множители: x² − {a2}', + solution: [ + { note: 'Это разность квадратов: x² − {a2} = x² − {a}². Применяем формулу a² − b² = (a − b)(a + b).', tex: 'x^2 - {a}^2' }, + { note: 'Получаем произведение.', tex: '(x - {a})*(x + {a})' } + ] + }, + + /* свернуть полный квадрат (обратно) */ + { + id: 'sq-trinom-factor', topic: 'formulas', order: 5, subject: 'algebra', grade: 8, kind: 'simplify', + title: 'Свернуть в квадрат', + pick: { a: [1, 9] }, + derive: { a2: 'a*a', a2x: '2*a' }, + srcExpr: 'x^2 + {a2x}*x + {a2}', answerExpr: '(x + {a})^2', answerVars: ['x'], + display: 'Разложите на множители: x² + {a2x}x + {a2}', + solution: [ + { note: 'Это полный квадрат: средний член {a2x}x = 2·{a}·x, свободный {a2} = {a}².', tex: 'x^2 + 2*{a}*x + {a}^2' }, + { note: 'Сворачиваем по формуле (x + {a})².', tex: '(x + {a})^2' } + ] + }, + + /* квадрат суммы с коэффициентом */ + { + id: 'sq-sum-coef', topic: 'formulas', order: 6, subject: 'algebra', grade: 8, kind: 'simplify', + title: 'Квадрат суммы (с коэф.)', + pick: { a: [1, 6], b: [2, 4] }, + derive: { b2: 'b*b', a2: 'a*a', mid: '2*a*b' }, + srcExpr: '({b}*x + {a})^2', answerExpr: '{b2}*x^2 + {mid}*x + {a2}', answerVars: ['x'], + display: 'Раскройте: ({b}x + {a})²', + solution: [ + { note: 'Формула квадрата суммы: (bx + a)² = (bx)² + 2·bx·a + a².', tex: '({b}x)^2 + 2*{b}*{a}*x + {a}^2' }, + { note: 'Считаем коэффициенты.', tex: '{b2}*x^2 + {mid}*x + {a2}' } + ] + }, + + /* куб суммы */ + { + id: 'cube-sum', topic: 'formulas', order: 7, subject: 'algebra', grade: 9, kind: 'simplify', + title: 'Куб суммы', + pick: { a: [1, 5] }, + derive: { c1: '3*a', c2: '3*a*a', c3: 'a*a*a' }, + srcExpr: '(x + {a})^3', answerExpr: 'x^3 + {c1}*x^2 + {c2}*x + {c3}', answerVars: ['x'], + display: 'Раскройте: (x + {a})³', + solution: [ + { note: 'Куб суммы: (x + a)³ = x³ + 3a·x² + 3a²·x + a³.', tex: 'x^3 + 3*{a}*x^2 + 3*{a}^2*x + {a}^3' }, + { note: 'Считаем коэффициенты.', tex: 'x^3 + {c1}*x^2 + {c2}*x + {c3}' } + ] + }, + + /* сумма кубов (разложение) */ + { + id: 'sum-cubes-factor', topic: 'formulas', order: 8, subject: 'algebra', grade: 9, kind: 'simplify', + title: 'Сумма кубов', + pick: { a: [2, 5] }, + derive: { a3: 'a*a*a', a2: 'a*a' }, + srcExpr: 'x^3 + {a3}', answerExpr: '(x + {a})*(x^2 - {a}*x + {a2})', answerVars: ['x'], + display: 'Разложите на множители: x³ + {a3}', + solution: [ + { note: 'Это сумма кубов: x³ + {a3} = x³ + {a}³. Формула a³ + b³ = (a + b)(a² − ab + b²).', tex: 'x^3 + {a}^3' }, + { note: 'Получаем произведение.', tex: '(x + {a})*(x^2 - {a}*x + {a2})' } + ] + }, + + /* вставь пропущенное число в тождестве */ + { + id: 'fmt-blank-square', topic: 'formulas', order: 9, subject: 'algebra', grade: 8, kind: 'compute', + title: 'Вставь число (тождество)', + pick: { a: [1, 9] }, + derive: { a2x: '2*a', val: 'a*a' }, + lhs: 'x', rhs: '{val}', display: 'Вставьте пропущенное число: (x + {a})² = x² + {a2x}x + ▢', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Квадрат суммы: (x + {a})² = x² + 2·{a}·x + {a}². Пропущен свободный член {a}².', tex: 'x = {a}^2' }, + { note: 'Считаем.', tex: 'x = {ans}' } + ] + }, + + /* найди ошибку: пропущенный средний член */ + { + id: 'fmt-fix-square', topic: 'formulas', order: 10, subject: 'algebra', grade: 8, kind: 'compute', + title: 'Найди ошибку', + pick: { a: [2, 9] }, + derive: { a2: 'a*a', val: '2*a' }, + lhs: 'x', rhs: '{val}', display: 'Ученик записал (x + {a})² = x² + {a2}. Это неверно: пропущен средний член. Чему равен коэффициент при x?', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'В формуле (x + {a})² есть средний член 2·{a}·x. Ученик его потерял.', tex: 'x = 2 * {a}' }, + { note: 'Считаем коэффициент.', tex: 'x = {ans}' } + ] + }, + + /* ── Степени ── */ + + /* частное степеней */ + { + id: 'pow-div', topic: 'powers', order: 4, subject: 'algebra', grade: 8, kind: 'simplify', + title: 'Частное степеней', + pick: { a: [5, 9], b: [1, 4] }, constraint: 'a > b', + derive: { d: 'a - b' }, + srcExpr: 'x^{a}/x^{b}', answerExpr: 'x^{d}', answerVars: ['x'], + display: 'Упростите: x^{a} / x^{b}', + solution: [ + { note: 'При делении степеней с одинаковым основанием показатели вычитаются: {a} − {b}.', tex: 'x^{a} / x^{b}' }, + { note: 'Получаем.', tex: 'x^{d}' } + ] + }, + + /* степень произведения */ + { + id: 'pow-product-base', topic: 'powers', order: 5, subject: 'algebra', grade: 8, kind: 'simplify', + title: 'Степень произведения', + pick: { a: [2, 4], n: [2, 3] }, + derive: { an: 'a^n' }, + srcExpr: '({a}*x)^{n}', answerExpr: '{an}*x^{n}', answerVars: ['x'], + display: 'Раскройте степень: ({a}x)^{n}', + solution: [ + { note: 'В степень возводится каждый множитель: ({a}x)^{n} = {a}^{n}·x^{n}.', tex: '{a}^{n}*x^{n}' }, + { note: 'Считаем {a}^{n}.', tex: '{an}*x^{n}' } + ] + }, + + /* дробь степеней (объединить и сократить) */ + { + id: 'pow-frac-combine', topic: 'powers', order: 6, subject: 'algebra', grade: 8, kind: 'simplify', + title: 'Дробь степеней', + pick: { a: [2, 5], b: [2, 5], c: [1, 4] }, require: 'a + b - c >= 1', + derive: { d: 'a + b - c' }, + srcExpr: '(x^{a}*x^{b})/x^{c}', answerExpr: 'x^{d}', answerVars: ['x'], + display: 'Упростите: (x^{a} · x^{b}) / x^{c}', + solution: [ + { note: 'В числителе складываем показатели: {a} + {b}.', tex: 'x^({a} + {b}) / x^{c}' }, + { note: 'При делении вычитаем показатель знаменателя: ({a} + {b}) − {c}.', tex: 'x^{d}' } + ] + }, + + /* степени одного основания — число */ + { + id: 'pow-numeric-laws', topic: 'powers', order: 7, subject: 'algebra', grade: 8, kind: 'compute', + title: 'Произведение степеней (число)', + pick: { b: [2, 3], a: [2, 3], c: [1, 2] }, + derive: { val: 'b^(a + c)' }, + lhs: 'x', rhs: '{b}^{a}*{b}^{c}', display: 'Вычислите {b}^{a} · {b}^{c} (запишите числом).', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'У одинакового основания показатели складываются: {a} + {c}.', tex: 'x = {b}^({a} + {c})' }, + { note: 'Считаем.', tex: 'x = {ans}' } + ] + }, + + /* стандартный вид числа */ + { + id: 'pow-standard-form', topic: 'powers', order: 8, subject: 'algebra', grade: 8, kind: 'compute', + title: 'Стандартный вид числа', + pick: { a: [2, 9], n: [2, 4] }, + derive: { val: 'a*10^n' }, + lhs: 'x', rhs: '{a}*10^{n}', display: 'Запишите число {a}·10^{n} в обычном виде.', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: '{a}·10^{n} — это {a} с {n} нулями.', tex: 'x = {a} * 10^{n}' }, + { note: 'Считаем.', tex: 'x = {ans}' } + ] + }, + + /* какой показатель (закон степеней) */ + { + id: 'pow-which-law', topic: 'powers', order: 9, subject: 'algebra', grade: 8, kind: 'compute', + title: 'Какой показатель', + pick: { a: [2, 6], b: [2, 6] }, + derive: { val: 'a + b' }, + lhs: 'x', rhs: '{a} + {b}', display: 'В какую степень нужно возвести x, чтобы x^{a} · x^{b} = x^▢ ?', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'При умножении степеней с одинаковым основанием показатели складываются.', tex: 'x = {a} + {b}' }, + { note: 'Считаем.', tex: 'x = {ans}' } + ] } ]; @@ -1658,6 +1951,12 @@ 'prop-direct-word': 1, 'prop-inverse-word': 2, 'prop-scale-map': 2, 'prop-compound': 3, 'prop-share-ratio': 2, 'pct-increase': 2, 'pct-decrease': 2, 'pct-change': 3, 'pct-simple-interest': 2, 'pct-compound-2y': 3, 'pct-restore-before': 3, 'app-meet': 2, 'app-overtake': 3, 'app-upstream': 2, 'app-work-joint': 3, 'app-mix-blend': 3, 'app-profit-pct': 3, + // V4.1 — Выражения (упрощение/формулы/степени) + 'simp-like-multivar': 2, 'simp-like-const': 2, 'simp-sub-bracket': 3, 'simp-distribute-combine': 3, + 'simp-factor-common': 2, 'simp-factor-group': 3, 'simp-eval-at': 2, + 'diff-sq-factor': 3, 'sq-trinom-factor': 3, 'sq-sum-coef': 3, 'cube-sum': 3, 'sum-cubes-factor': 3, + 'fmt-blank-square': 2, 'fmt-fix-square': 3, + 'pow-div': 2, 'pow-product-base': 2, 'pow-frac-combine': 3, 'pow-numeric-laws': 2, 'pow-standard-form': 2, 'pow-which-law': 2, // НОД/НОК / Дроби / Десятичные / Отрицательные 'gcd-pair': 1, 'lcm-pair': 2, 'frac-of-number': 1, 'frac-add-same': 2,