Files
Learn_System/backend/scripts/seed_ctmath_rt2425_e1v1.js
T
Maxim Dolgolyov 98894e31ad feat(ctmath): эталонный пробник РТ-2024/25 Этап I Вариант 1 (variant=101)
Первый чистый 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) <noreply@anthropic.com>
2026-06-18 21:08:19 +03:00

385 lines
36 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'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) =>
`<img src="/img/ct/math/rt2425_e1v1/${name}" alt="${alt}" ` +
`style="max-width:300px;width:100%;height:auto;display:block;margin:10px auto;` +
`background:#fff;border-radius:8px;padding:6px;">`;
/* 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`Укажите номера верных равенств.<br>1) $2^{5/7}:2^{4/7}=2^{1/7}$;<br>2) $2^{1/3}=\dfrac{1}{8}$;<br>3) $2^{1/3}\cdot 2^{2}=2^{2/3}$;<br>4) $\left(2^{1/3}\right)^{2}=2^{1/9}$;<br>5) $2^{1/3}\cdot 5^{1/3}=10^{1/3}$.<br><i>Ответ запишите цифрами в порядке возрастания, без пробелов.</i>`,
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{,}6<x<-1$ имеет вид:`,
opts: mc('$x-6$', '$-x+3$', '$x+3$', '$-x-3$', '$x-3$'),
answer: 'б',
sol: R`По свойству $\sqrt{a^{2}}=|a|$ имеем $\sqrt{(x-3)^{2}}=|x-3|$. При $-1{,}6<x<-1$ выражение $x-3<0$, поэтому $|x-3|=-(x-3)=-x+3$.`,
ref: 'Арефьева «Алгебра, 8 кл.», гл. 1, § 3' },
{ idx: 9, type: 'mc', topic: 'stereometry', subtopic: 'ster-basics', diff: 2,
text: R`Прямая $a$ перпендикулярна плоскости $\alpha$ и пересекает её в точке $A$. Точка $B$ находится на расстоянии $2$ от прямой $a$ и на расстоянии $\sqrt{21}$ от плоскости $\alpha$. Найдите расстояние от точки $B$ до точки $A$.`,
opts: mc('$5$', '$\sqrt{17}$', '$2\sqrt{21}$', '$\sqrt{23}$', '$6$'),
answer: 'а',
sol: R`Опустим перпендикуляры: $BK=2$ — на прямую $a$, $BM=\sqrt{21}$ — на плоскость $\alpha$; тогда $AM=BK=2$. В прямоугольном треугольнике $BMA$ по теореме Пифагора $BA^{2}=BM^{2}+AM^{2}=(\sqrt{21})^{2}+2^{2}=25$, значит $BA=5$.`,
ref: 'Латотин «Геометрия, 10 кл.», разд. 3, § 8' },
{ idx: 10, type: 'open', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 2,
text: R`Укажите номера выражений, которые имеют смысл.<br>1) $-\sqrt[4]{\sqrt{51}-8}$;<br>2) $\sqrt[3]{-8}$;<br>3) $\sqrt[4]{8^{-1}}$;<br>4) $\sqrt[4]{-8}$;<br>5) $-\sqrt[5]{8^{-1}}$.<br><i>Ответ запишите цифрами в порядке возрастания, без пробелов.</i>`,
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$ соответственно. Выберите верные утверждения.<br>1) прямая $MN$ пересекает прямую $SD$;<br>2) прямая $MN$ пересекает плоскость $SBD$;<br>3) прямая $MN$ лежит в плоскости $SDC$;<br>4) прямая $MN$ параллельна прямой $AB$;<br>5) прямая $MN$ параллельна плоскости $ADC$;<br>6) прямые $MN$ и $CD$ являются скрещивающимися.<br><i>Ответ запишите цифрами в порядке возрастания, без пробелов.</i>`,
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 кл.», разд. 13' },
{ idx: 12, type: 'long', topic: 'planimetry', subtopic: 'plan-circle', diff: 3,
text: R`Для начала каждого из предложений А–В подберите его окончание 1–7 так, чтобы получилось верное утверждение.<br><b>Начало:</b><br>А) Уравнение окружности с центром в начале координат и радиусом $\sqrt{11}$ имеет вид …<br>Б) Уравнение окружности с центром в начале координат, проходящей через точку $M(-2;5)$, имеет вид …<br>В) Уравнение прямой, проходящей через точки $M(-2;5)$ и $A(2;-5)$, имеет вид …<br><b>Окончание:</b><br>1) $5y-2x=0$;&emsp;2) $x^{2}-y^{2}=29$;&emsp;3) $x^{2}+y^{2}=29$;&emsp;4) $x+y=11$;<br>5) $2y+5x=0$;&emsp;6) $x^{2}+y^{2}=11$;&emsp;7) $x^{2}-y^{2}=11$.<br><i>Ответ запишите сочетанием букв и цифр, например: А1Б1В4.</i>`,
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}<div class="sol-ans">Ответ: ${ans}</div>`;
if (t.ref) html += `<div class="sol-ref" style="margin-top:6px;font-size:.85em;opacity:.7">Учебник: ${t.ref}</div>`;
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();