From 143ae232164534a601ff7cf44b9ea5d151188a23 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 19 Jun 2026 08:37:29 +0300 Subject: [PATCH] =?UTF-8?q?fix(ctmath):=20=D1=81=D1=80=D0=B5=D0=B7=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=BD=D0=B0=D0=BD?= =?UTF-8?q?=D1=81-=D0=BF=D1=80=D0=B5=D1=84=D0=B8=D0=BA=D1=81=20[=D0=A6?= =?UTF-8?q?=D0=A2=20YYYY=20=C2=B7=20XN]=20=D0=B8=D0=B7=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 48 заданий год-пачек (ЦТ 2017/2021) при оцифровке получили в начале text_html тег вида «[ЦТ 2017 · A1]» — мусор для ученика в тренажёре. cleanup_ctmath_bank.js теперь срезает ведущий тег [ЦТ|ЦЭ|РТ|ДРТ YYYY …] (узкий паттерн, не трогает матскобки внутри $…$, не обнуляет пустой результат). Идемпотентно. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/scripts/cleanup_ctmath_bank.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/backend/scripts/cleanup_ctmath_bank.js b/backend/scripts/cleanup_ctmath_bank.js index 79d26c2..d2ce0f9 100644 --- a/backend/scripts/cleanup_ctmath_bank.js +++ b/backend/scripts/cleanup_ctmath_bank.js @@ -55,6 +55,21 @@ if (t1419 && t1419.task_type === 'mc') { console.log(`• id=1419: пропуск (тип ${t1419 ? t1419.task_type : 'нет строки'})`); } +// 2b. Срезать провенанс-префикс [ЦТ YYYY · XN] из начала текста задания +// (в чистых вариантах 101+ его нет; для консистентности убираем из год-пачек). +// Паттерн узкий: [ + ЦТ|ЦЭ|РТ|ДРТ + год + … + ]; математические скобки внутри $…$ не задеваются. +const reTag = /^\s*\[(?:ЦТ|ЦЭ|РТ|ДРТ)\s+\d{4}[^\]]*\]\s*/; +const prefixed = db.prepare(`SELECT id, text_html FROM exam_tasks WHERE exam_key=? AND TRIM(text_html) LIKE '[%'`).all(EXAM) + .filter(r => reTag.test(r.text_html)) + .map(r => ({ id: r.id, clean: r.text_html.replace(reTag, '') })) + .filter(p => p.clean.trim().length > 0); // не обнуляем задачу +if (prefixed.length) { + actions.push({ desc: `срезать провенанс-префикс [ЦТ … ] у ${prefixed.length} заданий`, + run: () => { const upd = db.prepare(`UPDATE exam_tasks SET text_html=? WHERE id=?`); for (const p of prefixed) upd.run(p.clean, p.id); } }); +} else { + console.log('• провенанс-префиксы: пропуск (не найдено)'); +} + // 3. variants_count = число чистых вариантов (≥101) const cleanCnt = get(`SELECT COUNT(DISTINCT variant) c FROM exam_tasks WHERE exam_key=? AND variant BETWEEN ? AND ?`, EXAM, MOCK_LO, MOCK_HI).c; const curCnt = get(`SELECT variants_count vc FROM exam_tracks WHERE exam_key=?`, EXAM).vc;