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 0000000..0f58e5b Binary files /dev/null and b/frontend/img/ct/math/rt2425_e1v1/a2.png differ 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 0000000..f9ca1d0 Binary files /dev/null and b/frontend/img/ct/math/rt2425_e1v1/b12.png differ 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 0000000..06c31c5 Binary files /dev/null and b/frontend/img/ct/math/rt2425_e1v1/b9.png differ