feat(trainer): страница — ввод систем (пара) + подсказки-разбор ошибок (C1)

Подключение на странице (после редизайна-премиум-консоли):
- applyInputMode: kind system в multi (скрыт префикс «x =») + placeholder «напр. x = 2; y = 3»
- answerLabel/isLabelKind: для системы показываем пару «x = 2,  y = 3»
- check(): на неверном ответе зовём TE.analyzeMistake -> адресная подсказка (не разделил на коэффициент / перепутан знак / арифметика), не выдавая ответ; иначе общий текст
- смоук страницы 40/40 (системы: пара принята, префикс скрыт; неверный ответ -> разбор-подсказка)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-25 16:55:43 +03:00
parent fb81beca39
commit 03c6ebfdce
+8 -3
View File
@@ -858,11 +858,12 @@
// Префикс «x =» и подсказка ввода зависят от типа задачи.
function applyInputMode() {
var k = cur && cur.kind;
var multi = (k === 'roots' || k === 'simplify' || k === 'inequality');
var multi = (k === 'roots' || k === 'simplify' || k === 'inequality' || k === 'system');
var eqx = $('tr-eqx'); if (eqx) eqx.style.display = multi ? 'none' : '';
$('tr-input').placeholder = (k === 'roots') ? 'корни через ;'
: (k === 'simplify') ? 'упрощённое выражение'
: (k === 'inequality') ? ('напр. ' + (cur.answerVar || 'x') + ' < 3')
: (k === 'system') ? 'напр. x = 2; y = 3'
: 'ответ';
var tog = $('tr-step-toggle'); if (tog) tog.style.display = canStep() ? '' : 'none';
var df = $('tr-difficulty'); if (df) df.style.display = (k === 'word') ? 'none' : '';
@@ -874,9 +875,10 @@
if (cur.kind === 'roots' && cur.answers) return 'Корни: ' + cur.answers.map(fmt).join('; ');
if (cur.kind === 'simplify') return '= ' + (cur.answerExpr ? fmt(cur.answerExpr) : '');
if (cur.kind === 'inequality' && cur.answerRel) return (cur.answerVar || 'x') + ' ' + (REL_SYM[cur.answerRel.op] || cur.answerRel.op) + ' ' + fmt(cur.answerRel.bound);
if (cur.kind === 'system' && cur.pair) return (cur.answerVars || ['x', 'y']).map(function (v) { return v + ' = ' + fmt(cur.pair[v]); }).join(', ');
return 'x = ' + fmt(cur.answer);
}
function isLabelKind() { return cur.kind === 'roots' || cur.kind === 'simplify' || cur.kind === 'inequality'; }
function isLabelKind() { return cur.kind === 'roots' || cur.kind === 'simplify' || cur.kind === 'inequality' || cur.kind === 'system'; }
function updateStats() { $('tr-solved').textContent = solved; $('tr-streak').textContent = streak; }
function stepHtml(st, n) {
@@ -1016,7 +1018,10 @@
onSolved();
} else {
streak = 0;
fb.className = 'tr-feedback bad'; fb.innerHTML = ICON.bad + ' Неверно. Разбери решение и реши похожую.';
// репетитор (C1): адресная подсказка по типовой ошибке, не выдавая ответ
var diag = TE.analyzeMistake ? TE.analyzeMistake(cur, r.value) : null;
var msg = diag ? diag.hint : 'Неверно. Разбери решение и реши похожую.';
fb.className = 'tr-feedback bad'; fb.innerHTML = ICON.bad + ' ' + esc(msg);
$('tr-card').classList.add('tr-wrong');
recordAnswer(false); submitAttempt(false);
revealSolution();