feat(trainer): полные решения систем + шапка «Математика»; решения по всем темам

- Шапка-пилюля теперь УНИВЕРСАЛЬНАЯ и не мигает: всегда «Математика · 5–9 класс» (не переключается на «Алгебра»; предмет выбирается сегментом Алгебра/Геометрия)
- Системы 2 ур-ний — ПОЛНОЕ решение методом сложения (6 шагов): уравнять коэффициенты при x, вычесть (исключить x → coefY·y=rhsY), найти y, подставить, найти x, ответ-пара. Коэффициенты 2..4 / |коэф|≥2 — без «1x» в шагах
- Аудит решений по ВСЕМ темам: 7 «тонких» (1 шаг) генераторов (simp-like/expand, pow-mult/pow, sq-sum/diff, diff-sq) развёрнуты в 2 шага (правило → итог)
- смоук T21: у каждого из 60 генераторов решение ≥2 шагов; движок 1214/1214, страница 42/42; эмодзи 0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-25 18:05:43 +03:00
parent fb16821b0a
commit b5916e7f3b
2 changed files with 35 additions and 21 deletions
+30 -15
View File
@@ -280,7 +280,8 @@
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' }
{ note: 'Слагаемые {a}x и {b}x подобны (одинаковая буквенная часть x). Складываем коэффициенты: {a} + {b} = {s}.', tex: '{a}x + {b}x' },
{ note: 'Получаем:', tex: '{s}x' }
]
},
@@ -293,7 +294,8 @@
srcExpr: '{a}*(x + {b})', answerExpr: '{a}*x + {ab}', answerVars: ['x'],
display: 'Раскройте скобки: {a}(x + {b})',
solution: [
{ note: 'Умножаем множитель {a} на каждое слагаемое внутри скобки.', tex: '{a}(x + {b}) = {a}x + {ab}' }
{ note: 'Умножаем множитель {a} на каждое слагаемое в скобке: {a}·x и {a}·{b}.', tex: '{a}(x + {b})' },
{ note: 'Получаем:', tex: '{a}x + {ab}' }
]
},
@@ -355,7 +357,8 @@
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}' }
{ note: 'Основание одинаковое (x) — при умножении степеней показатели складываются: {a} + {b} = {s}.', tex: 'x^{a} * x^{b}' },
{ note: 'Получаем:', tex: 'x^{s}' }
]
},
@@ -368,7 +371,8 @@
srcExpr: '(x^{a})^{b}', answerExpr: 'x^{ab}', answerVars: ['x'],
display: 'Упростите: (x^{a})^{b}',
solution: [
{ note: 'При возведении степени в степень показатели перемножаются: {a}·{b} = {ab}.', tex: '(x^{a})^{b} = x^{ab}' }
{ note: 'При возведении степени в степень показатели перемножаются: {a}·{b} = {ab}.', tex: '(x^{a})^{b}' },
{ note: 'Получаем:', tex: 'x^{ab}' }
]
},
@@ -383,7 +387,8 @@
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}' }
{ note: 'Это квадрат суммы. Формула: (a + b)² = a² + 2ab + b² (здесь a = x, b = {a}).', tex: '(x + {a})^2' },
{ note: 'Раскрываем и приводим к стандартному виду:', tex: 'x^2 + {a2x}*x + {a2}' }
]
},
@@ -396,7 +401,8 @@
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}' }
{ note: 'Это квадрат разности. Формула: (a b)² = a² 2ab + b² (здесь a = x, b = {a}).', tex: '(x - {a})^2' },
{ note: 'Раскрываем и приводим к стандартному виду:', tex: 'x^2 - {a2x}*x + {a2}' }
]
},
@@ -409,7 +415,8 @@
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}' }
{ note: 'Произведение разности и суммы — формула разности квадратов: (a b)(a + b) = a² b².', tex: '(x - {a})*(x + {a})' },
{ note: 'Получаем:', tex: 'x^2 - {a2}' }
]
},
@@ -609,14 +616,18 @@
{
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] },
pick: { a1: [2, 4], b1: [2, 4], a2: [2, 4], b2: [2, 4], sx: [-6, 6], sy: [-6, 6] },
constraint: 'a1*b2 - a2*b1 != 0',
derive: { c1: 'a1*sx + b1*sy', c2: 'a2*sx + b2*sy' },
derive: { c1: 'a1*sx + b1*sy', c2: 'a2*sx + b2*sy', coefY: 'b1*a2 - b2*a1', rhsY: 'c1*a2 - c2*a1' },
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: '' }
{ note: 'Решаем методом сложения. Уравняем коэффициенты при x: умножим первое уравнение на {a2}, а второе — на {a1}.', tex: '' },
{ note: 'Вычтем из первого уравнения второе — слагаемые с x сократятся, останется только y:', tex: '{coefY}*y = {rhsY}' },
{ note: 'Разделим обе части на коэффициент при y:', tex: 'y = {sy}' },
{ note: 'Подставим y = {sy} в первое уравнение системы:', tex: '{a1}*x + {b1}*{sy} = {c1}' },
{ note: 'Решим его относительно x:', tex: 'x = {sx}' },
{ note: 'Ответ: x = {sx}, y = {sy}.', tex: '' }
]
},
@@ -625,13 +636,17 @@
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' },
constraint: 'abs(a1) >= 2 && abs(b1) >= 2 && abs(a2) >= 2 && abs(b2) >= 2 && a1*b2 - a2*b1 != 0',
derive: { c1: 'a1*sx + b1*sy', c2: 'a2*sx + b2*sy', coefY: 'b1*a2 - b2*a1', rhsY: 'c1*a2 - c2*a1' },
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: '' }
{ note: 'Метод сложения (внимательно со знаками). Уравняем коэффициенты при x: умножим первое уравнение на {a2}, второе — на {a1}.', tex: '' },
{ note: 'Вычтем из первого уравнения второе — переменная x исключается:', tex: '{coefY}*y = {rhsY}' },
{ note: 'Разделим обе части на коэффициент при y:', tex: 'y = {sy}' },
{ note: 'Подставим y = {sy} в первое уравнение системы:', tex: '{a1}*x + {b1}*{sy} = {c1}' },
{ note: 'Найдём x:', tex: 'x = {sx}' },
{ note: 'Ответ: x = {sx}, y = {sy}.', tex: '' }
]
},
+5 -6
View File
@@ -686,15 +686,14 @@
return out;
}
var SUBJ_LBL = { algebra: 'Алгебра', geometry: 'Геометрия' };
// подпись в шапке: предмет + диапазон классов текущего предмета (универсально 5–9)
// подпись в шапке — УНИВЕРСАЛЬНАЯ: «Математика · 5–9 класс» (предмет выбирается
// отдельным сегментом Алгебра/Геометрия, шапка его не дублирует).
function updateSubjectPill() {
var pill = $('tr-subject'); if (!pill) return;
var gr = topics.filter(function (t) { return (t.subject || 'algebra') === curSubject && t.grade; })
.map(function (t) { return t.grade; });
var name = SUBJ_LBL[curSubject] || 'Математика';
if (!gr.length) { pill.textContent = name; return; }
var gr = topics.filter(function (t) { return t.grade; }).map(function (t) { return t.grade; });
if (!gr.length) { pill.textContent = 'Математика'; return; }
var lo = Math.min.apply(null, gr), hi = Math.max.apply(null, gr);
pill.textContent = name + ' · ' + (lo === hi ? (lo + ' класс') : (lo + '' + hi + ' класс'));
pill.textContent = 'Математика · ' + (lo === hi ? (lo + ' класс') : (lo + '' + hi + ' класс'));
}
function renderSubjects() {
updateSubjectPill();