From 98894e31adcaf51a2360611b0409a7d8db2b43f1 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Thu, 18 Jun 2026 21:08:19 +0300 Subject: [PATCH] =?UTF-8?q?feat(ctmath):=20=D1=8D=D1=82=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=20=D0=A0=D0=A2-2024/25=20=D0=AD=D1=82=D0=B0=D0=BF=20I=20?= =?UTF-8?q?=D0=92=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82=201=20(variant=3D101?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Первый чистый 30-задачный вариант-пробник для exam-prep ctmath (А1–А10 + В1–В20), в отличие от год-пачек (variant=год). Идемпотентный seed (dry-run/--apply), 3 чертежа вырезаны из PDF (хорда/график/L-поле). Проверено: KaTeX-рендер 30/30, self-сверка ответов через checkAnswerServer. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/scripts/seed_ctmath_rt2425_e1v1.js | 384 +++++++++++++++++++++ frontend/img/ct/math/rt2425_e1v1/a2.png | Bin 0 -> 8450 bytes frontend/img/ct/math/rt2425_e1v1/b12.png | Bin 0 -> 6019 bytes frontend/img/ct/math/rt2425_e1v1/b9.png | Bin 0 -> 9530 bytes 4 files changed, 384 insertions(+) create mode 100644 backend/scripts/seed_ctmath_rt2425_e1v1.js create mode 100644 frontend/img/ct/math/rt2425_e1v1/a2.png create mode 100644 frontend/img/ct/math/rt2425_e1v1/b12.png create mode 100644 frontend/img/ct/math/rt2425_e1v1/b9.png diff --git a/backend/scripts/seed_ctmath_rt2425_e1v1.js b/backend/scripts/seed_ctmath_rt2425_e1v1.js new file mode 100644 index 0000000..3360cd8 --- /dev/null +++ b/backend/scripts/seed_ctmath_rt2425_e1v1.js @@ -0,0 +1,384 @@ +'use strict'; +/* ─────────────────────────────────────────────────────────────────────────── + seed_ctmath_rt2425_e1v1.js + Эталонный «чистый» вариант-пробник для трека exam-prep `ctmath`. + + Источник: РТ–2024/2025, Этап I, Вариант 1 (РИКЗ, «Тематическое + консультирование по математике»). 30 заданий: А1–А10 (часть A) + + В1–В20 (часть B). Перенабрано вручную в KaTeX по PDF + (F:\!Рабочие\ЦТ\Математика\Математика\РТ\2024-2025\МАТ РТ-1 24_25 В1.pdf). + + Чем отличается от уже залитых 723 задач: те сгруппированы по `variant`=ГОД + (2024 → 114 задач в одной «пачке») и НЕ образуют чистого 30-задачного + варианта, поэтому таймер-пробник на них собирается криво. Здесь + variant=101 — ровно 30 заданий (task_idx 1..30) → корректный пробник + на 180 мин (mock source='variant'). + + Идемпотентность: upsert по UNIQUE(exam_key, variant, task_idx). Повторный + запуск обновляет строки, не плодит дубли. + + Запуск: + node backend/scripts/seed_ctmath_rt2425_e1v1.js # DRY-RUN (по умолчанию) + node backend/scripts/seed_ctmath_rt2425_e1v1.js --apply # запись в БД + + ⚠️ Массовую запись в БД запускает ПОЛЬЗОВАТЕЛЬ вручную (авто-режим + Claude Code блокирует продакшн-записи). Скрипт безопасен: без --apply + ничего не пишет, только печатает сводку и самопроверку. + ─────────────────────────────────────────────────────────────────────────── */ + +const { DatabaseSync } = require('node:sqlite'); +const path = require('path'); + +const APPLY = process.argv.includes('--apply'); +const EXAM = 'ctmath'; +const VARIANT = 101; // чистый 30-задачный вариант (не год) +const PROV = 'РТ–2024/2025, Этап I, Вариант 1'; +const R = String.raw; + +// figure helper — белый фон у самого PNG, поэтому смотрится на любой теме +const FIG = (name, alt) => + `${alt}`; + +/* opts: метки кириллица а–д (как в существующих 723 строках ctmath; + checkAnswerServer имеет ветку /^[а-д]$/). РТ-варианты 1..5 → а..д. */ +const L = ['а', 'б', 'в', 'г', 'д']; +const mc = (...html) => html.map((h, i) => [L[i], h]); + +/* ── 30 заданий ─────────────────────────────────────────────────────────── */ +const TASKS = [ + // ── Часть A: А1–А10 ────────────────────────────────────────────────────── + { idx: 1, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 1, + text: R`Результатом округления числа $1{,}3678$ до тысячных является число:`, + opts: mc('$0{,}368$', '$1{,}367$', '$1{,}368$', '$1{,}370$', '$1{,}363$'), + answer: 'в', + sol: R`Округляем до третьего знака после запятой: $1{,}3678\approx 1{,}368$.`, + ref: 'Герасимов «Математика, 6 кл.», гл. 1, § 2' }, + + { idx: 2, type: 'mc', topic: 'planimetry', subtopic: 'plan-circle', diff: 1, + text: R`Среди отрезков $FP$, $OA$, $NK$, $MA$, $TE$ укажите отрезок, который является хордой окружности, изображённой на рисунке. (Точка $O$ — центр окружности.)`, + opts: mc('$FP$', '$OA$', '$NK$', '$MA$', '$TE$'), + answer: 'г', + sol: R`Хорда — это отрезок, соединяющий две точки окружности. Обе точки $M$ и $A$ лежат на окружности, поэтому хордой является отрезок $MA$.`, + ref: 'Казаков «Геометрия, 7 кл.», гл. 1, § 4', + fig: FIG('a2.png', 'Окружность с центром O и точками E, K, P, F, N, A, T, M') }, + + { idx: 3, type: 'mc', topic: 'functions', subtopic: 'fn-graphs', diff: 2, + text: R`Укажите номер функции, график которой параллелен графику функции $y=4x+1$.`, + opts: mc('$y=4x-1$', '$y=-4x+1$', '$y=-4x-1$', '$y=x+4$', '$y=-x-4$'), + answer: 'а', + sol: R`Графики линейных функций параллельны, если их угловые коэффициенты равны, а свободные члены различны. У $y=4x+1$ коэффициент $k=4$; из предложенных только $y=4x-1$ имеет $k=4$ и $b=-1\ne 1$.`, + ref: 'Арефьева «Алгебра, 7 кл.», гл. 3, § 20' }, + + { idx: 4, type: 'mc', topic: 'expressions', subtopic: 'expr-polynomials', diff: 2, + text: R`Найдите значения данных выражений при $x=-1{,}1$. Укажите номер того выражения, значение которого является наибольшим.`, + opts: mc('$2x$', '$1-x$', '$|x|$', '$x+1$', '$x^2$'), + answer: 'б', + sol: R`Подставим $x=-1{,}1$: $\ 1)\ 2x=-2{,}2;\quad 2)\ 1-x=2{,}1;\quad 3)\ |x|=1{,}1;\quad 4)\ x+1=-0{,}1;\quad 5)\ x^2=1{,}21.$ Наибольшее значение $2{,}1$ — у выражения $1-x$.`, + ref: 'Арефьева «Алгебра, 7 кл.», гл. 2, § 4' }, + + { idx: 5, type: 'mc', topic: 'equations', subtopic: 'eq-linear', diff: 1, + text: R`Определите, при каком из значений $x$, равных $6;\ 0;\ 1{,}8;\ 4{,}2;\ -1$, верно двойное неравенство $3\le x+1<7$.`, + opts: mc('$6$', '$0$', '$1{,}8$', '$4{,}2$', '$-1$'), + answer: 'г', + sol: R`Неравенство $3\le x+1<7$ равносильно $2\le x<6$. Из данных чисел этому промежутку принадлежит только $x=4{,}2$.`, + ref: 'Арефьева «Алгебра, 7 кл.», гл. 3, § 18' }, + + { idx: 6, type: 'open', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 2, + text: R`Укажите номера верных равенств.
1) $2^{5/7}:2^{4/7}=2^{1/7}$;
2) $2^{1/3}=\dfrac{1}{8}$;
3) $2^{1/3}\cdot 2^{2}=2^{2/3}$;
4) $\left(2^{1/3}\right)^{2}=2^{1/9}$;
5) $2^{1/3}\cdot 5^{1/3}=10^{1/3}$.
Ответ запишите цифрами в порядке возрастания, без пробелов.`, + answer: '15', ansShow: '1, 5', + sol: R`$1)\ 2^{5/7}:2^{4/7}=2^{5/7-4/7}=2^{1/7}$ — верно. $\ 2)$ неверно. $\ 3)\ 2^{1/3}\cdot 2^{2}=2^{1/3+2}=2^{7/3}\ne 2^{2/3}$ — неверно. $\ 4)\ \left(2^{1/3}\right)^{2}=2^{2/3}\ne 2^{1/9}$ — неверно. $\ 5)\ 2^{1/3}\cdot 5^{1/3}=(2\cdot5)^{1/3}=10^{1/3}$ — верно.`, + ref: 'Арефьева «Алгебра, 11 кл.», гл. 1, § 1' }, + + { idx: 7, type: 'mc', topic: 'word-sequences', subtopic: 'word-problems', diff: 2, + text: R`В состав чайного сбора входят мята и липа в отношении $2:3$ соответственно. Сколько граммов липы входит в $975$ г такого сбора?`, + opts: mc('$390$ г', '$325$ г', '$875$ г', '$545$ г', '$585$ г'), + answer: 'д', + sol: R`Пусть на одну часть приходится $k$ г: мята — $2k$, липа — $3k$. Тогда $2k+3k=975$, $5k=975$, $k=195$. Липа: $3k=585$ г.`, + ref: 'Герасимов «Математика, 6 кл.», гл. 2, § 5' }, + + { idx: 8, type: 'mc', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 2, + text: R`Результат упрощения выражения $\sqrt{(x-3)^{2}}$ при $-1{,}61) $-\sqrt[4]{\sqrt{51}-8}$;
2) $\sqrt[3]{-8}$;
3) $\sqrt[4]{8^{-1}}$;
4) $\sqrt[4]{-8}$;
5) $-\sqrt[5]{8^{-1}}$.
Ответ запишите цифрами в порядке возрастания, без пробелов.`, + answer: '235', ansShow: '2, 3, 5', + sol: R`$1)$ не имеет смысла: $\sqrt{51}-8<0$, а корень чётной степени из отрицательного числа не существует. $\ 2)\ \sqrt[3]{-8}$ — корень нечётной степени, смысл есть. $\ 3)\ \sqrt[4]{8^{-1}}$ — $8^{-1}=\tfrac18>0$, смысл есть. $\ 4)\ \sqrt[4]{-8}$ — смысла нет. $\ 5)\ -\sqrt[5]{8^{-1}}$ — смысл есть.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 2, § 13' }, + + // ── Часть B: В1–В20 ────────────────────────────────────────────────────── + { idx: 11, type: 'open', topic: 'stereometry', subtopic: 'ster-basics', diff: 3, + text: R`Дана правильная четырёхугольная пирамида $SABCD$. Точки $M$ и $N$ — середины боковых рёбер $SA$ и $SC$ соответственно. Выберите верные утверждения.
1) прямая $MN$ пересекает прямую $SD$;
2) прямая $MN$ пересекает плоскость $SBD$;
3) прямая $MN$ лежит в плоскости $SDC$;
4) прямая $MN$ параллельна прямой $AB$;
5) прямая $MN$ параллельна плоскости $ADC$;
6) прямые $MN$ и $CD$ являются скрещивающимися.
Ответ запишите цифрами в порядке возрастания, без пробелов.`, + answer: '256', ansShow: '2, 5, 6', + sol: R`$1)$ неверно: $MN$ и $SD$ скрещиваются. $\ 2)$ верно: $M$ и $N$ по разные стороны от плоскости $SBD$. $\ 3)$ неверно: $MN$ пересекает $SDC$ в точке $N$. $\ 4)$ неверно: $MN$ и $AB$ скрещиваются. $\ 5)$ верно: $MN$ — средняя линия треугольника $SAC$, значит $MN\parallel AC$, $AC\subset ADC$. $\ 6)$ верно: $MN$ и $CD$ скрещиваются.`, + ref: 'Латотин «Геометрия, 10 кл.», разд. 1–3' }, + + { idx: 12, type: 'long', topic: 'planimetry', subtopic: 'plan-circle', diff: 3, + text: R`Для начала каждого из предложений А–В подберите его окончание 1–7 так, чтобы получилось верное утверждение.
Начало:
А) Уравнение окружности с центром в начале координат и радиусом $\sqrt{11}$ имеет вид …
Б) Уравнение окружности с центром в начале координат, проходящей через точку $M(-2;5)$, имеет вид …
В) Уравнение прямой, проходящей через точки $M(-2;5)$ и $A(2;-5)$, имеет вид …
Окончание:
1) $5y-2x=0$; 2) $x^{2}-y^{2}=29$; 3) $x^{2}+y^{2}=29$; 4) $x+y=11$;
5) $2y+5x=0$; 6) $x^{2}+y^{2}=11$; 7) $x^{2}-y^{2}=11$.
Ответ запишите сочетанием букв и цифр, например: А1Б1В4.`, + answer: 'А6Б3В5', ansShow: 'А6Б3В5', + sol: R`А) Центр $(0;0)$, радиус $\sqrt{11}$: $x^{2}+y^{2}=11$ — окончание 6. Б) Центр $(0;0)$, проходит через $M(-2;5)$: $R^{2}=(-2)^{2}+5^{2}=29$, то есть $x^{2}+y^{2}=29$ — окончание 3. В) Прямая через $M(-2;5)$ и $A(2;-5)$: подходит $2y+5x=0$ (обе точки ему удовлетворяют) — окончание 5.`, + ref: 'Арефьева «Алгебра, 9 кл.», гл. 3, § 12' }, + + { idx: 13, type: 'open', topic: 'numbers', subtopic: 'num-divisibility', diff: 1, + text: R`Фломастеры, которых всего было $445$ штук, упаковывали в коробки по $16$ штук в каждую. Сколько получилось полных коробок, если $13$ фломастеров остались неупакованными?`, + answer: '27', + sol: R`Пусть $x$ — число полных коробок. По смыслу деления с остатком $445=16x+13$, откуда $16x=432$, $x=27$.`, + ref: 'Герасимов «Математика, 5 кл.», ч. 1, гл. 1, § 11' }, + + { idx: 14, type: 'open', topic: 'functions', subtopic: 'fn-graphs', diff: 2, + text: R`Найдите значение выражения $4p$, где $p$ — произведение координат вершины параболы, заданной уравнением $y=-2x^{2}-6x+3$.`, + answer: '-45', + sol: R`Абсцисса вершины $x_0=-\dfrac{b}{2a}=-\dfrac{-6}{2\cdot(-2)}=-\dfrac32$. Ордината $y_0=-2\left(-\dfrac32\right)^{2}-6\left(-\dfrac32\right)+3=-\dfrac92+9+3=\dfrac{15}{2}$. Тогда $p=x_0y_0=-\dfrac32\cdot\dfrac{15}{2}=-\dfrac{45}{4}$ и $4p=-45$.`, + ref: 'Арефьева «Алгебра, 8 кл.», гл. 3, § 13' }, + + { idx: 15, type: 'open', topic: 'planimetry', subtopic: 'plan-triangles', diff: 2, + text: R`В треугольнике $ABC$ точки $M$ и $N$ — середины сторон $AB$ и $AC$ соответственно, $\angle ABC=95^\circ$, $\angle ANM=36^\circ$. Найдите градусную меру угла $BAC$.`, + answer: '49', + sol: R`$MN$ — средняя линия треугольника $ABC$, поэтому $MN\parallel BC$, и $\angle ACB=\angle ANM=36^\circ$ (соответственные углы). По сумме углов треугольника $\angle BAC=180^\circ-95^\circ-36^\circ=49^\circ$.`, + ref: 'Казаков «Геометрия, 7 кл.», гл. 3, § 17' }, + + { idx: 16, type: 'open', topic: 'trigonometry', subtopic: 'trig-identities', diff: 3, + text: R`Найдите значение выражения $6\sqrt3\,\sin 600^\circ-\sqrt2\,\cos 225^\circ$.`, + answer: '-8', + sol: R`$\sin600^\circ=\sin240^\circ=\sin(270^\circ-30^\circ)=-\cos30^\circ=-\dfrac{\sqrt3}{2}$; $\cos225^\circ=\cos(180^\circ+45^\circ)=-\cos45^\circ=-\dfrac{\sqrt2}{2}$. Тогда $6\sqrt3\cdot\left(-\dfrac{\sqrt3}{2}\right)-\sqrt2\cdot\left(-\dfrac{\sqrt2}{2}\right)=-9+1=-8$.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 2; § 9' }, + + { idx: 17, type: 'open', topic: 'equations', subtopic: 'eq-rational', diff: 3, + text: R`Найдите произведение наибольшего целого решения на количество всех целых решений неравенства $\left(x+\log_{0{,}5}64\right)^{2}(x-3)(x+13)\le 0$.`, + answer: '108', + sol: R`Так как $\log_{0{,}5}64=-6$, неравенство принимает вид $(x-6)^{2}(x-3)(x+13)\le 0$. Методом интервалов решение: $[-13;3]\cup\{6\}$. Наибольшее целое решение $6$; всего целых решений $18$ (17 на отрезке $[-13;3]$ и $x=6$). Произведение: $6\cdot18=108$.`, + ref: 'Арефьева «Алгебра, 9 кл.», гл. 3, § 13' }, + + { idx: 18, type: 'open', topic: 'equations', subtopic: 'eq-linear', diff: 2, + text: R`Найдите сумму всех целых решений системы неравенств $\begin{cases}(x-2)^{2}+23>(x+3)^{2}-2,\\[2pt] 1{,}6x\ge 0{,}9x-6{,}3.\end{cases}$`, + answer: '-44', + sol: R`Первое неравенство: $x^{2}-4x+4+23>x^{2}+6x+9-2$, то есть $-10x>-20$, $x<2$. Второе: $0{,}7x\ge-6{,}3$, $x\ge-9$. Решение системы — полуинтервал $[-9;2)$. Сумма всех целых из него равна $-44$.`, + ref: 'Арефьева «Алгебра, 8 кл.», гл. 1, § 6' }, + + { idx: 19, type: 'open', topic: 'functions', subtopic: 'fn-properties', diff: 3, + text: R`Функция $y=f(x)$ нечётна и определена на отрезке $[-8;8]$. Её график для $x\le 0$ изображён на рисунке. Найдите значение выражения $3n$, где $n$ — количество всех целых значений аргумента, при которых функция принимает неположительные значения.`, + answer: '30', + sol: R`График нечётной функции симметричен относительно начала координат. Функция неположительна ($f(x)\le0$) на промежутках $[-8;-6]$ и $(0;6)$, а также в точках $x=-6,\ 0,\ 6$. Целых значений с $f(x)<0$ — семь, плюс три нуля, итого $n=10$, значит $3n=30$.`, + ref: 'Арефьева «Алгебра, 9 кл.», гл. 2, § 8', + fig: FIG('b9.png', 'График нечётной функции для x ≤ 0 на отрезке [-8;0]') }, + + { idx: 20, type: 'open', topic: 'planimetry', subtopic: 'plan-quadrilaterals', diff: 2, + text: R`Найдите площадь ромба $ABCD$, если его периметр равен $72$, а величина угла $BAD$ равна $30^\circ$.`, + answer: '162', + sol: R`Сторона ромба $a=\dfrac{72}{4}=18$. Площадь $S=a^{2}\sin\alpha=18^{2}\cdot\sin30^\circ=324\cdot\dfrac12=162$.`, + ref: 'Казаков «Геометрия, 8 кл.», гл. 2, § 15' }, + + { idx: 21, type: 'open', topic: 'equations', subtopic: 'eq-exponential', diff: 3, + text: R`Найдите значение выражения $25m$, где $m$ — сумма корней уравнения $\left(\dfrac37\right)^{5x^{2}-5x+2}-\left(\dfrac73\right)^{1-3x}=0$.`, + answer: '40', + sol: R`Так как $\left(\dfrac73\right)^{1-3x}=\left(\dfrac37\right)^{3x-1}$, получаем $5x^{2}-5x+2=3x-1$, то есть $5x^{2}-8x+3=0$. Дискриминант положителен, корни существуют. По теореме Виета сумма корней $m=\dfrac{8}{5}=1{,}6$, поэтому $25m=40$.`, + ref: 'Арефьева «Алгебра, 11 кл.», гл. 2, § 5' }, + + { idx: 22, type: 'open', topic: 'equations', subtopic: 'eq-linear', diff: 2, + text: R`Поле разбили на два участка $A$ и $B$ одинаковой площади, как показано на рисунке (размеры указаны в метрах). Найдите (в метрах) периметр участка $B$.`, + answer: '390', + sol: R`Обозначим горизонтальный размер участка $B$ через $x$ м. Из равенства площадей: $140\cdot40+70\cdot(170-x)=70x$, откуда $14x=1750$, $x=125$. Значит, участок $B$ — прямоугольник $70\times125$, его периметр $2(70+125)=390$ м.`, + ref: 'Арефьева «Алгебра, 7 кл.», гл. 3, § 16', + fig: FIG('b12.png', 'L-образный участок: A и B, размеры 170, 70, 210, 40 м') }, + + { idx: 23, type: 'open', topic: 'stereometry', subtopic: 'ster-rotation', diff: 3, + text: R`Осевым сечением цилиндра является квадрат, длина диагонали которого равна $4\sqrt6$. Найдите значение выражения $\dfrac{\sqrt3\,V}{\pi}$, где $V$ — объём цилиндра.`, + answer: '144', + sol: R`Сторона квадрата $\dfrac{4\sqrt6}{\sqrt2}=4\sqrt3$, значит высота цилиндра и диаметр основания равны $4\sqrt3$, радиус $R=2\sqrt3$. Объём $V=\pi R^{2}h=\pi(2\sqrt3)^{2}\cdot4\sqrt3=48\pi\sqrt3$. Тогда $\dfrac{\sqrt3\,V}{\pi}=48\cdot3=144$.`, + ref: 'Латотин «Геометрия, 11 кл.», разд. 1, § 2' }, + + { idx: 24, type: 'open', topic: 'equations', subtopic: 'eq-irrational', diff: 3, + text: R`Найдите произведение корней (корень, если он единственный) уравнения $\sqrt{x+7}-\sqrt{x^{2}-6x-91}=0$.`, + answer: '-98', + sol: R`Так как $x^{2}-6x-91=(x+7)(x-13)$, уравнение приводится к $\sqrt{x+7}=\sqrt{(x+7)(x-13)}$. После возведения в квадрат $(x+7)(x-14)=0$. Проверка показывает, что оба числа $-7$ и $14$ — корни. Их произведение $-7\cdot14=-98$.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 2, § 17' }, + + { idx: 25, type: 'open', topic: 'trigonometry', subtopic: 'trig-equations', diff: 4, + text: R`Найдите (в градусах) сумму наименьшего положительного и наибольшего отрицательного корней уравнения $\sin 2x\cos 17x-\cos 2x\sin 17x=\sin\dfrac{3\pi}{2}$.`, + answer: '-12', + sol: R`Левая часть по формуле синуса разности равна $\sin(2x-17x)=\sin(-15x)$, а $\sin\dfrac{3\pi}{2}=-1$. Значит $\sin(-15x)=-1$, то есть $\sin15x=1$, $15x=90^\circ+360^\circ n$, $x=6^\circ+24^\circ n$. Наименьший положительный корень $6^\circ$, наибольший отрицательный $-18^\circ$; их сумма $-12^\circ$.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 8; § 10' }, + + { idx: 26, type: 'open', topic: 'equations', subtopic: 'eq-quadratic', diff: 3, + text: R`Найдите сумму всех целых решений совокупности неравенств $\left[\begin{array}{l}x^{2}-x-6\le0,\\ x^{2}-4x-5>0\end{array}\right.$ на промежутке $[-10;7]$.`, + answer: '-36', + sol: R`$1)\ x^{2}-x-6\le0$: решение $[-2;3]$. $\ 2)\ x^{2}-4x-5>0$: решение $(-\infty;-1)\cup(5;+\infty)$. Объединение решений совокупности: $(-\infty;3]\cup(5;+\infty)$. Пересечение с $[-10;7]$ даёт $[-10;3]\cup(5;7]$. Сумма целых: $-49+13=-36$.`, + ref: 'Арефьева «Алгебра, 8 кл.», гл. 3, § 16' }, + + { idx: 27, type: 'open', topic: 'stereometry', subtopic: 'ster-polyhedra', diff: 4, + text: R`В правильной четырёхугольной пирамиде $QABCD$ длина бокового ребра равна $17$, длина диагонали основания $ABCD$ равна $16$. Через середины рёбер $AB$ и $AD$ и точку $Q$ проведена секущая плоскость. Найдите значение выражения $S^{2}$, где $S$ — площадь сечения пирамиды этой плоскостью.`, + answer: '3856', + sol: R`Пусть $K$, $M$ — середины рёбер $AB$, $AD$; сечение — равнобедренный треугольник $KQM$. $KM$ — средняя линия треугольника $ABD$, $KM=\dfrac12 BD=8$. Высота пирамиды $QO=\sqrt{QA^{2}-OA^{2}}=\sqrt{17^{2}-8^{2}}=15$. Высота $QN$ треугольника $KQM$: $QN=\sqrt{QO^{2}+ON^{2}}=\sqrt{15^{2}+4^{2}}=\sqrt{241}$. Площадь $S=\dfrac12\cdot KM\cdot QN=4\sqrt{241}$, откуда $S^{2}=16\cdot241=3856$.`, + ref: 'Латотин «Геометрия, 10 кл.», разд. 1, § 3' }, + + { idx: 28, type: 'open', topic: 'word-sequences', subtopic: 'word-problems', diff: 4, + text: R`При делении некоторого натурального двузначного числа на произведение его цифр неполное частное равно $3$, а остаток равен $10$. Если цифры этого числа поменять местами, то полученное число будет меньше данного на $36$. Найдите исходное число.`, + answer: '73', + sol: R`Пусть $x$ — цифра десятков, $y$ — цифра единиц; число равно $10x+y$. Условия дают систему $\begin{cases}10x+y=3xy+10,\\ 10x+y=(10y+x)+36.\end{cases}$ Из второго уравнения $x-y=4$. Подставив $x=y+4$, получаем $3y^{2}+y-30=0$, откуда $y=3$, $x=7$. Искомое число — $73$.`, + ref: 'Арефьева «Алгебра, 9 кл.», гл. 3, § 11' }, + + { idx: 29, type: 'open', topic: 'functions', subtopic: 'fn-derivative', diff: 4, + text: R`Составьте уравнение касательной к графику функции $f(x)=32x^{3}-24x-5$ в точке с абсциссой $x_0=\dfrac14$. В ответ запишите произведение координат точки пересечения этой касательной с прямой $y=-16x-10$.`, + answer: '-84', + sol: R`$f'(x)=96x^{2}-24$, $f'\!\left(\dfrac14\right)=-18=k$; $f\!\left(\dfrac14\right)=-10{,}5$. Касательная $y=-18x-6$. Пересечение с $y=-16x-10$: $-18x-6=-16x-10$, $x=2$, $y=-42$. Произведение координат $2\cdot(-42)=-84$.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 3, § 20' }, + + { idx: 30, type: 'open', topic: 'stereometry', subtopic: 'ster-angles-distances', diff: 5, + text: R`Из точки $E$ — середины стороны $BC$ равностороннего треугольника $ABC$ — проведён перпендикуляр $EP$ к плоскости треугольника, причём $EP=\dfrac12 BC$. На отрезке $PC$ взята точка $M$ так, что $PM:MC=2:3$. Найдите значение выражения $176\sin^{2}\alpha$, где $\alpha$ — угол между прямой $AM$ и плоскостью $ABC$.`, + answer: '18', + sol: R`Пусть сторона равна $a$, тогда $EP=\dfrac a2$. Проекция $M$ на плоскость — точка $K$ на $EC$, $\angle MAK=\alpha$. Из подобия $\triangle MKC\sim\triangle PEC$: $MK=\dfrac{3a}{10}$, $CK=\dfrac{3a}{10}$. По теореме косинусов в $\triangle AKC$: $AK^{2}=a^{2}+\left(\dfrac{3a}{10}\right)^{2}-2a\cdot\dfrac{3a}{10}\cos60^\circ=\dfrac{79a^{2}}{100}$. Тогда $AM^{2}=MK^{2}+AK^{2}=\dfrac{88a^{2}}{100}$, $\sin\alpha=\dfrac{MK}{AM}=\dfrac{3}{2\sqrt{22}}$, и $176\sin^{2}\alpha=176\cdot\dfrac{9}{88}=18$.`, + ref: 'Латотин «Геометрия, 10 кл.», разд. 3, § 9' }, +]; + +/* ── Сборка solution_html ────────────────────────────────────────────────── */ +function ansShowOf(t) { + if (t.ansShow != null) return t.ansShow; + if (t.type === 'mc') return `${t.answer})`; + return `$${t.answer}$`; // числовой/комбинация цифр — в KaTeX +} +function buildSolution(t) { + const ans = ansShowOf(t); + let html = `${t.sol}
Ответ: ${ans}
`; + if (t.ref) html += `
Учебник: ${t.ref}
`; + return html; +} + +/* ── Самопроверка (повтор логики checkAnswerServer из exam-prep.js) ────────── */ +const EPS = 1e-6; +function srvToNumber(s) { + if (s == null) return NaN; + let t = String(s).trim().replace(/\$/g, '').replace(/\s+/g, '').replace(',', '.'); + const f = t.match(/^(-?\d+(?:\.\d+)?)\s*\/\s*(-?\d+(?:\.\d+)?)$/); + if (f) { const n = Number(f[1]), d = Number(f[2]); return d === 0 ? NaN : n / d; } + const n = Number(t); return Number.isFinite(n) ? n : NaN; +} +function checkAnswerServer(userInput, canonical) { + if (userInput == null || canonical == null) return false; + const c = String(canonical).trim(); + if (/^[а-д]$/.test(c)) return String(userInput).trim().toLowerCase() === c.toLowerCase(); + if (/^[^;]+;[^;]+$/.test(c)) return false; // (пар нет в этом варианте) + const cn = srvToNumber(c), un = srvToNumber(userInput); + if (Number.isNaN(cn) || Number.isNaN(un)) return false; + return Math.abs(cn - un) < EPS; +} + +/* ── Валидация набора ──────────────────────────────────────────────────────── */ +const problems = []; +if (TASKS.length !== 30) problems.push(`Ожидалось 30 заданий, получено ${TASKS.length}`); +const seen = new Set(); +for (const t of TASKS) { + if (seen.has(t.idx)) problems.push(`Дубль task_idx=${t.idx}`); seen.add(t.idx); + if (t.idx < 1 || t.idx > 30) problems.push(`task_idx вне 1..30: ${t.idx}`); + if (!['mc', 'open', 'long'].includes(t.type)) problems.push(`#${t.idx}: тип ${t.type}`); + if (t.type === 'mc') { + if (!Array.isArray(t.opts) || t.opts.length !== 5) problems.push(`#${t.idx}: mc должен иметь 5 вариантов`); + if (!t.opts.some(o => o[0] === t.answer)) problems.push(`#${t.idx}: answer "${t.answer}" не среди меток`); + } + if (!t.text || !t.sol) problems.push(`#${t.idx}: пустой text/sol`); + // self-check автопроверки (long не автопроверяется) + if (t.type !== 'long' && !checkAnswerServer(t.answer, t.answer)) + problems.push(`#${t.idx}: answer "${t.answer}" не проходит self-check (Unicode-минус? пробел?)`); + // запрет Unicode-минуса в answer (нужен ASCII '-') + if (/−/.test(String(t.answer))) problems.push(`#${t.idx}: Unicode-минус в answer`); +} + +/* ── Экспорт для тестов/тиража (без запуска main при require) ──────────────── */ +module.exports = { TASKS, buildSolution, ansShowOf, checkAnswerServer, EXAM, VARIANT, PROV }; +if (require.main !== module) return; + +/* ── Открытие БД ───────────────────────────────────────────────────────────── */ +const DB = path.join(__dirname, '..', 'data', 'learnspace.db'); +const db = new DatabaseSync(DB); + +// Защита: трек должен существовать +const track = db.prepare(`SELECT exam_key, variants_count FROM exam_tracks WHERE exam_key=?`).get(EXAM); +if (!track) { console.error(`✗ Трек '${EXAM}' не найден в exam_tracks. Прерывание.`); process.exit(1); } + +/* ── DRY-RUN сводка ────────────────────────────────────────────────────────── */ +console.log(`\n=== seed_ctmath_rt2425_e1v1 (${PROV}) variant=${VARIANT} ===`); +console.log(`Режим: ${APPLY ? 'APPLY (запись)' : 'DRY-RUN (только проверка)'}\n`); + +const byType = TASKS.reduce((a, t) => (a[t.type] = (a[t.type] || 0) + 1, a), {}); +console.log('Типы:', JSON.stringify(byType), '| фигур:', TASKS.filter(t => t.fig).length, '\n'); + +console.log('idx | type | subtopic | d | answer | fig'); +console.log('----+------+-----------------------+---+-----------+----'); +for (const t of TASKS) { + console.log( + `${String(t.idx).padStart(3)} | ${t.type.padEnd(4)} | ${String(t.subtopic).padEnd(21)} | ${t.diff} | ${String(t.answer).padEnd(9)} | ${t.fig ? '✓' : ''}` + ); +} + +if (problems.length) { + console.error(`\n✗ ПРОБЛЕМЫ (${problems.length}):`); + problems.forEach(p => console.error(' - ' + p)); + console.error('\nЗапись отменена из-за ошибок валидации.'); + db.close(); + process.exit(1); +} +console.log('\n✓ Валидация и self-check ответов пройдены (30/30).'); + +/* ── APPLY: upsert ─────────────────────────────────────────────────────────── */ +if (!APPLY) { + console.log('\nDRY-RUN: ничего не записано. Для записи: node backend/scripts/seed_ctmath_rt2425_e1v1.js --apply\n'); + db.close(); + process.exit(0); +} + +const upsert = db.prepare(` + INSERT INTO exam_tasks + (exam_key, variant, task_idx, task_type, text_html, figure_html, + opts_json, answer, solution_html, topic, subtopic, difficulty) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(exam_key, variant, task_idx) DO UPDATE SET + task_type = excluded.task_type, + text_html = excluded.text_html, + figure_html = excluded.figure_html, + opts_json = excluded.opts_json, + answer = excluded.answer, + solution_html = excluded.solution_html, + topic = excluded.topic, + subtopic = excluded.subtopic, + difficulty = excluded.difficulty +`); + +let n = 0; +db.exec('BEGIN'); +try { + for (const t of TASKS) { + upsert.run( + EXAM, VARIANT, t.idx, t.type, + t.text, + t.fig || null, + t.type === 'mc' ? JSON.stringify(t.opts) : null, + t.answer, + buildSolution(t), + t.topic, t.subtopic, t.diff + ); + n++; + } + // обновить variants_count = реальное число различных вариантов + const distinct = db.prepare(`SELECT COUNT(DISTINCT variant) c FROM exam_tasks WHERE exam_key=?`).get(EXAM).c; + db.prepare(`UPDATE exam_tracks SET variants_count=? WHERE exam_key=?`).run(distinct, EXAM); + db.exec('COMMIT'); + console.log(`\n✓ Записано/обновлено ${n} заданий (variant=${VARIANT}).`); + console.log(`✓ exam_tracks.variants_count = ${distinct} (различных вариантов).`); + console.log(`\nПробник доступен: /exam-prep/ctmath → «Варианты» → «Вариант ${VARIANT}».\n`); +} catch (e) { + db.exec('ROLLBACK'); + console.error('\n✗ Ошибка записи, откат транзакции:', e.message); + process.exitCode = 1; +} +db.close(); diff --git a/frontend/img/ct/math/rt2425_e1v1/a2.png b/frontend/img/ct/math/rt2425_e1v1/a2.png new file mode 100644 index 0000000000000000000000000000000000000000..0f58e5beb6bdbc6ad2c7bfd6fba50eaee7917985 GIT binary patch literal 8450 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

8W@|9% Uy(v%x{@Vail!eJuNSVL=4-_Y|%K!iX literal 0 HcmV?d00001 diff --git a/frontend/img/ct/math/rt2425_e1v1/b12.png b/frontend/img/ct/math/rt2425_e1v1/b12.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ca1d069775ec82aa40f32c791966fe671b7907 GIT binary patch literal 6019 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 Up~q%e5Uw-a)za52x@8moAMP-B_y7O^ literal 0 HcmV?d00001 diff --git a/frontend/img/ct/math/rt2425_e1v1/b9.png b/frontend/img/ct/math/rt2425_e1v1/b9.png new file mode 100644 index 0000000000000000000000000000000000000000..06c31c54e0ae35cb4dbc21a962cb71753548d79f GIT binary patch literal 9530 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