'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 = число «чистых» вариантов-пробников [101;1999]; год-пачки (годы≥2011, 0) скрыты роутом const distinct = db.prepare(`SELECT COUNT(DISTINCT variant) c FROM exam_tasks WHERE exam_key=? AND variant BETWEEN 101 AND 1999`).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();