From 03c6ebfdce85d220a9762233511258d0da1016e4 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Thu, 25 Jun 2026 16:55:43 +0300 Subject: [PATCH] =?UTF-8?q?feat(trainer):=20=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=86=D0=B0=20=E2=80=94=20=D0=B2=D0=B2=D0=BE=D0=B4=20?= =?UTF-8?q?=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=20(=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0)=20+=20=D0=BF=D0=BE=D0=B4=D1=81=D0=BA=D0=B0=D0=B7=D0=BA?= =?UTF-8?q?=D0=B8-=D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BE=D0=BA=20(C1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Подключение на странице (после редизайна-премиум-консоли): - 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) --- frontend/trainer.html | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/frontend/trainer.html b/frontend/trainer.html index dd9c75b..e420ac2 100644 --- a/frontend/trainer.html +++ b/frontend/trainer.html @@ -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();