feat(trainer): A — углублённые пошаговые решения в 6 «тонких» темах

19 генераторов: добавлен шаг «правило/формула символьно → подстановка чисел →
вычисление», как у репетитора (было «формула → считаем», 2 строки).

- Площади (6): S = a·b → S = 8·5 → S = 40 (прямоуг./треуг./квадр./трапеция/
  параллелограмм/ромб; у ромба S = (d₁d₂)/2 с индексами).
- Степени (3): степень как произведение; складываем/перемножаем показатели отд. шагом.
- Формулы сокр. умножения (3): формула → раскрытие по членам → стандартный вид
  ((x+4)² → x²+2·4x+4² → x²+8x+16).
- Многоугольники (2): сумма углов через деление на (n−2) треугольника; угол правильного.
- Подобие (2): сторона/периметр через коэффициент k (символьно → числа).
- Десятичные (3): шаг с разрядами/целыми (0.4·0.5 → 20/100 → 0.2; X десятых).

Символьная строка использует букву темы (S/P), числовая — answerSym через x→symbol.
Смоук 11079 ассертов, 0 ошибок: self-check, чистые ответы, каждый шаг рендерит
LaTeX, нет остаточного x при answerSym, фигуры рендерятся. Итого 212 генераторов.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-29 22:09:41 +03:00
parent 26e89eb5b6
commit b0ac9e25bc
+58 -40
View File
@@ -344,8 +344,8 @@
lhs: 'x', rhs: '{a}^{n}', display: 'Вычислите {a} в степени {n}',
answerVar: 'x', answer: 'val', integerAnswer: true,
solution: [
{ note: 'Степень — это повторное умножение основания на себя.', tex: 'x = {a}^{n}' },
{ note: 'Считаем:', tex: 'x = {ans}' }
{ note: 'Степень {a}^{n} — это произведение {n} одинаковых множителей, равных {a}.', tex: 'x = {a}^{n}' },
{ note: 'Перемножаем основание само на себя.', tex: 'x = {ans}' }
]
},
@@ -358,8 +358,9 @@
srcExpr: 'x^{a}*x^{b}', answerExpr: 'x^{s}', answerVars: ['x'],
display: 'Упростите: x^{a}·x^{b}',
solution: [
{ note: 'Основание одинаковое (x) — при умножении степеней показатели складываются: {a} + {b} = {s}.', tex: 'x^{a} * x^{b}' },
{ note: 'Получаем:', tex: 'x^{s}' }
{ note: 'Основание одинаковое (x). При умножении степеней показатели складываются.', tex: 'x^{a} * x^{b}' },
{ note: 'Складываем показатели: {a} + {b} = {s}.', tex: 'x^({a} + {b})' },
{ note: 'Получаем степень.', tex: 'x^{s}' }
]
},
@@ -372,8 +373,9 @@
srcExpr: '(x^{a})^{b}', answerExpr: 'x^{ab}', answerVars: ['x'],
display: 'Упростите: (x^{a})^{b}',
solution: [
{ note: 'При возведении степени в степень показатели перемножаются: {a}·{b} = {ab}.', tex: '(x^{a})^{b}' },
{ note: олучаем:', tex: 'x^{ab}' }
{ note: 'Возводим степень в степень показатели перемножаются.', tex: '(x^{a})^{b}' },
{ note: еремножаем показатели: {a} · {b} = {ab}.', tex: 'x^({a}*{b})' },
{ note: 'Получаем степень.', tex: 'x^{ab}' }
]
},
@@ -388,8 +390,9 @@
srcExpr: '(x + {a})^2', answerExpr: 'x^2 + {a2x}*x + {a2}', answerVars: ['x'],
display: 'Раскройте: (x + {a})²',
solution: [
{ note: 'Это квадрат суммы. Формула: (a + b)² = a² + 2ab + b² (здесь a = x, b = {a}).', tex: '(x + {a})^2' },
{ note: 'Раскрываем и приводим к стандартному виду:', tex: 'x^2 + {a2x}*x + {a2}' }
{ note: 'Это квадрат суммы. Применяем формулу (a + b)² = a² + 2ab + b².', tex: '(x + {a})^2' },
{ note: 'Первое слагаемое x, второе {a}: квадрат первого, удвоенное произведение, квадрат второго.', tex: 'x^2 + 2*{a}*x + {a}^2' },
{ note: 'Считаем коэффициенты — стандартный вид.', tex: 'x^2 + {a2x}*x + {a2}' }
]
},
@@ -402,8 +405,9 @@
srcExpr: '(x - {a})^2', answerExpr: 'x^2 - {a2x}*x + {a2}', answerVars: ['x'],
display: 'Раскройте: (x {a})²',
solution: [
{ note: 'Это квадрат разности. Формула: (a b)² = a² 2ab + b² (здесь a = x, b = {a}).', tex: '(x - {a})^2' },
{ note: 'Раскрываем и приводим к стандартному виду:', tex: 'x^2 - {a2x}*x + {a2}' }
{ note: 'Это квадрат разности. Применяем формулу (a b)² = a² 2ab + b².', tex: '(x - {a})^2' },
{ note: 'Квадрат первого, минус удвоенное произведение, плюс квадрат второго ({a}).', tex: 'x^2 - 2*{a}*x + {a}^2' },
{ note: 'Считаем коэффициенты — стандартный вид.', tex: 'x^2 - {a2x}*x + {a2}' }
]
},
@@ -417,7 +421,8 @@
display: 'Раскройте: (x {a})(x + {a})',
solution: [
{ note: 'Произведение разности и суммы — формула разности квадратов: (a − b)(a + b) = a² b².', tex: '(x - {a})*(x + {a})' },
{ note: 'Получаем:', tex: 'x^2 - {a2}' }
{ note: 'Здесь a = x, b = {a}: квадрат первого минус квадрат второго.', tex: 'x^2 - {a}^2' },
{ note: 'Считаем.', tex: 'x^2 - {a2}' }
]
},
@@ -588,8 +593,9 @@
lhs: 'x', rhs: '{a}*{b}', display: 'Стороны прямоугольника {a} и {b}. Найдите его площадь.',
answerVar: 'x', answer: 'val', integerAnswer: true,
solution: [
{ note: 'Площадь прямоугольника произведение его сторон:', tex: 'x = {a}*{b}' },
{ note: 'Считаем:', tex: 'x = {ans}' }
{ note: 'Площадь прямоугольника равна произведению его сторон.', tex: 'S = a*b' },
{ note: 'Подставляем длины сторон {a} и {b}.', tex: 'x = {a}*{b}' },
{ note: 'Перемножаем и получаем площадь.', tex: 'x = {ans}' }
]
},
@@ -604,8 +610,9 @@
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}' }
{ note: 'Площадь треугольника — половина произведения основания на высоту.', tex: 'S = a*h/2' },
{ note: 'Подставляем основание {a} и высоту {h}.', tex: 'x = {a}*{h}/2' },
{ note: 'Считаем площадь.', tex: 'x = {ans}' }
]
},
@@ -619,8 +626,9 @@
lhs: 'x', rhs: '{a}^2', display: 'Сторона квадрата {a}. Найдите его площадь.',
answerVar: 'x', answer: 'val', integerAnswer: true,
solution: [
{ note: 'Площадь квадрата — сторона, возведённая в квадрат:', tex: 'x = {a}^2' },
{ note: 'Считаем:', tex: 'x = {ans}' }
{ note: 'Площадь квадрата — это сторона, умноженная сама на себя.', tex: 'S = a^2' },
{ note: 'Подставляем сторону {a}.', tex: 'x = {a}^2' },
{ note: 'Считаем.', tex: 'x = {ans}' }
]
},
@@ -748,8 +756,9 @@
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}' }
{ note: 'Площадь трапеции — полусумма оснований, умноженная на высоту.', tex: 'S = (a + b)*h/2' },
{ note: 'Подставляем основания {a}, {b} и высоту {h}.', tex: 'x = ({a} + {b})*{h}/2' },
{ note: 'Считаем: сначала сумму оснований, затем на высоту и пополам.', tex: 'x = {ans}' }
]
},
@@ -763,8 +772,9 @@
lhs: 'x', rhs: '{a}*{h}', display: 'Сторона параллелограмма {a}, высота к ней {h}. Найдите площадь.',
answerVar: 'x', answer: 'val', integerAnswer: true,
solution: [
{ note: 'Площадь параллелограмма — сторона на высоту к ней:', tex: 'x = {a}*{h}' },
{ note: 'Считаем:', tex: 'x = {ans}' }
{ note: 'Площадь параллелограмма — сторона, умноженная на высоту к ней.', tex: 'S = a*h' },
{ note: 'Подставляем сторону {a} и высоту {h}.', tex: 'x = {a}*{h}' },
{ note: 'Считаем.', tex: 'x = {ans}' }
]
},
@@ -779,8 +789,9 @@
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}' }
{ note: 'Площадь ромба — половина произведения его диагоналей.', tex: 'S = d_1*d_2/2' },
{ note: 'Подставляем диагонали {d1} и {d2}.', tex: 'x = {d1}*{d2}/2' },
{ note: 'Считаем.', tex: 'x = {ans}' }
]
},
@@ -796,8 +807,9 @@
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}' }
{ note: 'Выпуклый n-угольник делится на (n − 2) треугольника, поэтому сумма углов равна 180°·(n 2).', tex: 'x = 180*(n - 2)' },
{ note: 'Подставляем число сторон n = {n}.', tex: 'x = 180*({n} - 2)' },
{ note: 'Считаем.', tex: 'x = {ans}' }
]
},
@@ -812,8 +824,9 @@
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}' }
{ note: 'У правильного многоугольника все углы равны: делим сумму углов 180°·(n − 2) на число углов n.', tex: 'x = 180*(n - 2)/n' },
{ note: 'Подставляем n = {n}.', tex: 'x = 180*({n} - 2)/{n}' },
{ note: 'Считаем.', tex: 'x = {ans}' }
]
},
@@ -829,8 +842,9 @@
lhs: 'x', rhs: '{a}*{k}', display: 'Треугольники подобны с коэффициентом {k}. Сторона первого равна {a}. Найдите сходственную сторону второго.',
answerVar: 'x', answer: 'val', integerAnswer: true,
solution: [
{ note: 'Сходственные стороны подобных фигур пропорциональны коэффициенту подобия:', tex: 'x = {a}*{k}' },
{ note: 'Считаем:', tex: 'x = {ans}' }
{ note: 'У подобных фигур сходственные стороны пропорциональны: сторону умножают на коэффициент подобия k.', tex: 'x = a*k' },
{ note: 'Подставляем сторону {a} и коэффициент {k}.', tex: 'x = {a}*{k}' },
{ note: 'Считаем.', tex: 'x = {ans}' }
]
},
@@ -844,8 +858,9 @@
lhs: 'x', rhs: '{p}*{k}', display: 'Фигуры подобны с коэффициентом {k}. Периметр первой равен {p}. Найдите периметр второй.',
answerVar: 'x', answer: 'val', integerAnswer: true,
solution: [
{ note: 'Периметры подобных фигур относятся как коэффициент подобия:', tex: 'x = {p}*{k}' },
{ note: 'Считаем:', tex: 'x = {ans}' }
{ note: 'Периметры подобных фигур относятся как коэффициент подобия: периметр умножают на k.', tex: 'P = p*k' },
{ note: 'Подставляем периметр {p} и коэффициент {k}.', tex: 'x = {p}*{k}' },
{ note: 'Считаем.', tex: 'x = {ans}' }
]
},
@@ -932,12 +947,13 @@
{
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' },
pick: { a: [1, 9], b: [1, 9] }, derive: { da: 'a/10', db: 'b/10', asum: 'a + b', 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}' }
{ note: 'Складываем десятичные дроби поразрядно запятая строго под запятой.', tex: 'x = {da} + {db}' },
{ note: 'В десятых долях: {a} + {b} = {asum} десятых.', tex: 'x = {asum}/10' },
{ note: 'Переводим обратно в десятичную дробь.', tex: 'x = {ans}' }
]
},
@@ -945,12 +961,13 @@
{
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' },
pick: { a: [2, 9], b: [1, 8] }, constraint: 'a > b', derive: { da: 'a/10', db: 'b/10', adif: 'a - b', 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}' }
{ note: 'Вычитаем десятичные дроби поразрядно — запятая под запятой.', tex: 'x = {da} - {db}' },
{ note: 'В десятых долях: {a} − {b} = {adif} десятых.', tex: 'x = {adif}/10' },
{ note: 'Переводим обратно в десятичную дробь.', tex: 'x = {ans}' }
]
},
@@ -958,12 +975,13 @@
{
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' },
pick: { a: [1, 9], b: [1, 9] }, derive: { da: 'a/10', db: 'b/10', ab: 'a*b', 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}' }
{ note: 'Перемножаем числа без запятых, как целые.', tex: 'x = {da} * {db}' },
{ note: 'Целыми: {a} · {b} = {ab}. У множителей всего 2 знака после запятой — столько же отделяем.', tex: 'x = {ab}/100' },
{ note: 'Ставим запятую — получаем ответ.', tex: 'x = {ans}' }
]
},