# Спецификация оцифровки заданий РТ/ЦТ → `exam_tasks` + диагностика > Как переносить задания из 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. Схема целевой таблицы (напоминание) ```sql 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 допустим (списки, `
`). Картинки/чертежи — в `figure_html`. ### 3.2. `figure_html` Чертёж: предпочтительно inline `` (масштабируемо, тема). Допустимо `` (как уже практикуется в репозитории — см. `frontend/img/ct/math/`). NULL, если рисунка нет. ### 3.3. `opts_json` (только `mc`) Массив пар `[метка, html]`, как в `exam9`: ```json [["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: ```html
Ответ: $-26$
``` (`import-exam-tasks.js` умеет парсить `answer` из такого блока — переиспользовать конвейер.) ### 3.6. `topic` / `subtopic` / `difficulty` - `topic` = slug раздела, `subtopic` = slug подтемы (из [TOPICS_SEED.md](TOPICS_SEED.md)). - Дефолт — по таблице §2; правка вручную при отклонении. - `difficulty` 1–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. Конвейер оцифровки (рекомендуемый порядок шагов) 1. **Источник → структура.** Один вариант = 30 задач. Удобный промежуточный формат — JS-объект как в `frontend/js/exam9/variants/vNN.js` (`text`, `opts`, `sol` с `sol-ans`). 2. **Импорт.** Прогнать через `backend/scripts/import-exam-tasks.js` (автоопределение `mc`/`open` по наличию `opts`, парс `answer` из `sol-ans`). 3. **Классификация.** Проставить `topic`/`subtopic`/`difficulty` по §2 (можно скриптом по `task_idx`), затем выборочно проверить отклонения (по аналогии с `tag-exam-tasks.js`). 4. **Чертежи.** Для задач с рисунком — добавить `figure_html` (SVG/``); часть А2/А9/В1/В13/В17/В20 почти всегда с чертежом. 5. **Верификация.** Сверить `answer` с официальными ответами (папки `…\Ответы…`, DJVU-исходники) — критично для авто-проверки. 6. **Сборка вариантов.** Полные варианты доступны как `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)` не нарушен.