feat(trainer): V4.1 группа 3 — 20 генераторов (выражения + новые формулировки)

Третья волна плана 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) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-26 13:31:38 +03:00
parent 1868e6cb9b
commit e4b0747dac
+299
View File
@@ -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,