Контент ЦЭ/ЦТ по математике уже в БД (questions, subject_id=3, 1753 задания 2011–2025, seed_math_ct*.js) — курс строим на нём через tests/assignments (готовый mode='ct') и courses, а не через exam-prep/exam_tasks. - plans/ct-math/BUILD_ON_QUESTIONS.md — новый основной тех-документ: схема questions/topics/tests/assignments, режимы ct/topic, таксономия и её доведение, каркас курса, диагностика из реальных вопросов, прогресс, порядок работ - примечания-пивот в PLAN (§6/§8), TOPICS_SEED, DIGITIZATION_SPEC (помечены вторичными: exam-prep — опция, оцифровка уже сделана), пилотах, README - difficulty приведён к шкале банка 1–3 Миграция 077 оставлена как опция exam-prep, в БД не применяется. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
14 KiB
Спецификация оцифровки заданий РТ/ЦТ → exam_tasks + диагностика
⚠️ БОЛЬШЕЙ ЧАСТЬЮ УЖЕ СДЕЛАНО / ВТОРИЧНО. Оцифровка ЦЭ/ЦТ по математике уже выполнена — 1753 задания в банке
questions(скриптыbackend/scripts/seed_math_ct*.js, 2011–2025). Поэтому этот документ (перенос вexam_tasksexam-prep) не основной. Сборка курса и диагностики — на существующем банке: BUILD_ON_QUESTIONS.md. Текст ниже актуален лишь для (а) будущей добивки годов в форматеseed_math_ct*(правило: 1 вариант из сборника, без повторов — см. памятьproject_ct_seeded), либо (б) если перейдём на exam-prep.
Как переносить задания из PDF (РТ 2006–2025, ЦТ/ЦЭ 2004–2024) в банк
exam_tasksтрекаctmath, как их классифицировать (тема/сложность/тип) и как собрать входной диагностический тест. Опирается на реальные конвейеры платформы:backend/scripts/import-exam-tasks.js(импорт),tag-exam-tasks.js(классификатор темы), формат вариантовfrontend/js/exam9/variants/v*.js.
1. Схема целевой таблицы (напоминание)
exam_tasks(
id, exam_key, variant, task_idx,
task_type TEXT CHECK (task_type IN ('mc','open','long')),
text_html, figure_html, opts_json, answer, solution_html,
topic, subtopic, difficulty,
UNIQUE(exam_key, variant, task_idx)
)
Для трека: exam_key='ctmath', variant = номер варианта (сквозная нумерация по источникам, см. §6), task_idx = 1..30.
2. Маппинг номера задания → тип и подтема
Позиция в ЦЭ/ЦТ почти жёстко задаёт тему (карта §1.2 PLAN.md). Это дефолт классификатора — экономит ручную разметку; правится точечно, если конкретный вариант отклонился.
| task_idx | task_type | topic (раздел) | subtopic (по умолчанию) | difficulty |
|---|---|---|---|---|
| 1 (А1) | mc | numbers | num-real |
1 |
| 2 (А2) | mc | stereometry | ster-basics |
2 |
| 3 (А3) | mc | trigonometry | trig-circle |
1 |
| 4 (А4) | mc | numbers | num-divisibility |
1 |
| 5 (А5) | mc | equations | eq-quadratic |
1 |
| 6 (А6) | mc | equations | eq-linear |
2 |
| 7 (А7) | mc | word-sequences | word-problems |
2 |
| 8 (А8) | mc | trigonometry | trig-identities |
2 |
| 9 (А9) | mc | stereometry | ster-rotation |
3 |
| 10 (А10) | mc | expressions | expr-powers-roots |
2 |
| 11 (В1) | open | stereometry | ster-angles-distances |
3 |
| 12 (В2) | open | functions | fn-properties |
2 |
| 13 (В3) | open | word-sequences | seq-progressions |
2 |
| 14 (В4) | open | trigonometry | trig-identities |
3 |
| 15 (В5) | open | planimetry | plan-triangles |
3 |
| 16 (В6) | open | word-sequences | seq-progressions |
3 |
| 17 (В7) | open | word-sequences | word-problems |
3 |
| 18 (В8) | open | equations | eq-linear |
2 |
| 19 (В9) | open | functions | fn-properties |
3 |
| 20 (В10) | open | planimetry | plan-quadrilaterals |
3 |
| 21 (В11) | open | equations | eq-logarithmic |
3 |
| 22 (В12) | open | numbers | num-divisibility |
4 |
| 23 (В13) | open | stereometry | ster-rotation |
4 |
| 24 (В14) | open | equations | eq-exponential |
4 |
| 25 (В15) | open | trigonometry | trig-equations |
5 |
| 26 (В16) | open | equations | eq-logarithmic |
5 |
| 27 (В17) | open | stereometry | ster-polyhedra |
5 |
| 28 (В18) | open | equations | eq-irrational |
4 |
| 29 (В19) | open | functions | fn-derivative |
5 |
| 30 (В20) | open | stereometry | ster-angles-distances |
5 |
Часть А =
mc(всегда 5 вариантов ответа). Часть В =open(число/слово/комбинация цифр).longиспользовать только если ответ не авто-проверяем (в ЦЭ/ЦТ почти не встречается — там всё с коротким ответом). ⚠️ Маппинг — стартовый; при оцифровке КАЖДОГО варианта проверять реальную тему задания и при отклонении менятьsubtopic/difficultyвручную.
3. Форматы полей
3.1. text_html
Условие задания с формулами в KaTeX-разметке ($...$ инлайн). HTML допустим (списки, <br>). Картинки/чертежи — в figure_html.
3.2. figure_html
Чертёж: предпочтительно inline <svg> (масштабируемо, тема). Допустимо <img src="/img/ct/math/..."> (как уже практикуется в репозитории — см. frontend/img/ct/math/). NULL, если рисунка нет.
3.3. opts_json (только mc)
Массив пар [метка, html], как в exam9:
[["1","$-16$"],["2","$-12$"],["3","$12$"],["4","$26$"],["5","$-26$"]]
(В ЦЭ/ЦТ метки — цифры 1–5.)
3.4. answer
mc: метка верного варианта, напр."5".open: строка-эталон ответа. Форматы части В:- число:
"-26","24","153"; - комбинация цифр (В1-тип «выберите верные», порядок не важен): хранить нормализованно, напр. отсортированные цифры
"124"; проверку делать как множество цифр; - комбинация буква-цифра (В2-тип сопоставление):
"А5Б1В4"(как в реальном бланке).
- число:
- ⚠️ Договориться о нормализации ответа на клиенте (тримминг, запятая/точка в дробях, регистр) — это логика проверки, не данные. В части В реального ЦТ ответ — целое/конечная десятичная дробь; условие часто просит «увеличьте в N раз», чтобы ответ стал целым (учитывать при вводе эталона).
3.5. solution_html
Полное решение в HTML+KaTeX. Рекомендуется завершать блоком ответа в стиле exam9:
<div class="sol-ans">Ответ: $-26$</div>
(import-exam-tasks.js умеет парсить answer из такого блока — переиспользовать конвейер.)
3.6. topic / subtopic / difficulty
topic= slug раздела,subtopic= slug подтемы (из TOPICS_SEED.md).- Дефолт — по таблице §2; правка вручную при отклонении.
difficulty1–5: 1–2 = часть А и лёгкая В; 3 = средняя В; 4–5 = В12+, В14–В20. Рубрика — §4.
4. Рубрика сложности (difficulty 1–5)
| Балл | Признак | Где |
|---|---|---|
| 1 | одно действие/определение, устно | А1, А3, А4, А5 |
| 2 | 2–3 шага, базовая формула | А-часть, В2, В3, В8 |
| 3 | несколько шагов, выбор метода | В4–В11, А9 |
| 4 | многошаговое + ОДЗ/отбор/подобие | В12–В14, В18 |
| 5 | сложный метод (рационализация, отбор корней, координатный метод в 3D) | В15–В17, В19, В20 |
5. Конвейер оцифровки (рекомендуемый порядок шагов)
- Источник → структура. Один вариант = 30 задач. Удобный промежуточный формат — JS-объект как в
frontend/js/exam9/variants/vNN.js(text,opts,solсsol-ans). - Импорт. Прогнать через
backend/scripts/import-exam-tasks.js(автоопределениеmc/openпо наличиюopts, парсanswerизsol-ans). - Классификация. Проставить
topic/subtopic/difficultyпо §2 (можно скриптом поtask_idx), затем выборочно проверить отклонения (по аналогии сtag-exam-tasks.js). - Чертежи. Для задач с рисунком — добавить
figure_html(SVG/<img>); часть А2/А9/В1/В13/В17/В20 почти всегда с чертежом. - Верификация. Сверить
answerс официальными ответами (папки…\Ответы…, DJVU-исходники) — критично для авто-проверки. - Сборка вариантов. Полные варианты доступны как
exam_mock_sessions(пробники на 180 мин) автоматически — нужна только заполненность 30 задач варианта.
OCR кириллицы+формул из PDF/DJVU ненадёжен на математике — формулы почти всегда перенабираются вручную в KaTeX. Это основной объём работы; приоритет источников — §6.
6. Приоритет источников для оцифровки
| Очередь | Источник | Почему |
|---|---|---|
| 1 | ЦТ-ЦЭ\ЦЭ-ЦТ-2024 МАТ.pdf |
эталон текущего формата, есть ответы |
| 2 | РТ\2022-2023 … 2024-2025 |
свежие, формат совпадает, 3 этапа × 2 варианта |
| 3 | ЦТ-ЦЭ\2017–2021 + DJVU-ответы |
большой банк реальных заданий с ответами |
| 4 | РТ\2016–2021 |
расширение банка |
| 5 | ДРТ\ |
доп. варианты + разборы консультаций |
| 6 | старые РТ/ЦТ 2004–2015 |
архив, по мере необходимости |
Нумерация variant: сквозная, с префиксом-меткой источника в solution_html/комментарии (напр. «ЦЭ-2024», «РТ-2024 этап 2 в1»), чтобы не терять происхождение.
7. Входной диагностический тест
Цель: за ~30–40 минут определить уровень по каждому разделу → назначить трек и приоритетные модули.
Состав (1 задание на ключевую подтему, смесь А и В, 12–15 задач)
| # | Подтема | Уровень-зонд | Источник-позиция |
|---|---|---|---|
| 1 | num-real |
🟢 | А1 |
| 2 | eq-quadratic |
🟢 | А5 |
| 3 | trig-circle |
🟢 | А3 |
| 4 | expr-powers-roots |
🟢 | А10 |
| 5 | word-problems |
🟡 | А7 / В7 |
| 6 | seq-progressions |
🟡 | В3 / В6 |
| 7 | fn-properties |
🟡 | В2 / В9 |
| 8 | trig-identities |
🟡 | В4 |
| 9 | plan-triangles |
🟡 | В5 |
| 10 | ster-basics |
🟡 | А2 / В1 |
| 11 | eq-logarithmic |
🔴 | В11 → В16 |
| 12 | trig-equations |
🔴 | В15 |
| 13 | fn-derivative |
🔴 | В19 |
| 14 | ster-angles-distances |
🔴 | В20 |
Логика назначения трека (по результату)
- Доля верных среди 🟢-зондов < 75% или «проваленные» базовые разделы → стартовый трек База; провальные разделы проходятся с нуля.
- 🟢 уверенно, 🟡 ≥ ~50% → трек Ядро.
- 🟢+🟡 уверенно и хотя бы часть 🔴 решена → трек Продвинутый.
- Любой раздел с диагностикой < 50% → этот раздел всегда с уровня База, независимо от общего трека (правило ветвления §4.3 PLAN.md).
Реализация на платформе
- Диагностика =
exam_mock_sessionsсsource='random'/спец-наборtask_ids_jsonиз перечисленных подтем, либо practice-наборstrategy=weak. - Результаты пишутся в
exam_attempts(по подтемам) → дашборд/детектор слабых тем сразу строит heatmap и список приоритетов. exam_user_plan.weak_focus=1— включить фокус на слабых темах (опционально).
8. Чек-лист «задание готово»
text_htmlнабран, формулы в KaTeX, читается;figure_htmlдобавлен (если есть чертёж);opts_jsonдляmc(5 вариантов) / отсутствует дляopen;answerсверен с официальным ключом, нормализован;solution_htmlсsol-ans;topic/subtopic/difficultyпроставлены и проверены против реальной темы;UNIQUE(exam_key, variant, task_idx)не нарушен.