diff --git a/backend/scripts/seed_ctmath_rt2223_e3v1.js b/backend/scripts/seed_ctmath_rt2223_e3v1.js new file mode 100644 index 0000000..422075e --- /dev/null +++ b/backend/scripts/seed_ctmath_rt2223_e3v1.js @@ -0,0 +1,387 @@ +'use strict'; +/* ─────────────────────────────────────────────────────────────────────────── + seed_ctmath_rt2223_e3v1.js + Чистый вариант-пробник для трека exam-prep `ctmath`. + + Источник: РТ–2022/2023, Этап III, Вариант 1 (РИКЗ, «Тематическое + консультирование по математике»). 30 заданий: А1–А10 + В1–В20. + Перенабрано вручную в KaTeX по PDF (визуальное чтение, НЕ OCR): + F:\!Рабочие\ЦТ\Математика\Математика\РТ\2022-2023\МАТ РТ-3 22_23 В1.pdf + + variant=109 — РТ-2022/23 Этап III (этап I — 107, этап II — 108). + Геометрия закодирована текстом. Единственное задание с обязательным + чертежом — А6 (чтение графика): кусочно-линейная функция на [-5;6] + воспроизведена inline-SVG в figure_html (как у math9 и варианта 106); + все 5 утверждений и ответ (134) согласованы с реконструкцией. + + Идемпотентность: upsert по UNIQUE(exam_key, variant, task_idx). + Запуск: + node backend/scripts/seed_ctmath_rt2223_e3v1.js # DRY-RUN (по умолчанию) + node backend/scripts/seed_ctmath_rt2223_e3v1.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 = 109; +const PROV = 'РТ–2022/2023, Этап III, Вариант 1'; +const R = String.raw; + +const L = ['а', 'б', 'в', 'г', 'д']; +const mc = (...html) => html.map((h, i) => [L[i], h]); + +/* ── SVG-график для А6: кусочно-линейная функция на [-5;6] через точки + (-5,3),(-2,-5),(4,5),(6,-1). Три нуля; min=-5 (x=-2), max=5 (x=4); + возрастает на (-2;4) → целые с f'>0: -1,0,1,2,3 (сумма 5); f'(-4)<0. + Цвета — только в SVG-стоки. */ +const FIG_A6 = ` + + + + + + + + + + x + y + O + 1 + 1 + y=f(x) +`; + +/* ── 30 заданий ─────────────────────────────────────────────────────────── */ +const TASKS = [ + // ── Часть A: А1–А10 ────────────────────────────────────────────────────── + { idx: 1, type: 'mc', topic: 'expressions', subtopic: 'expr-polynomials', diff: 1, + text: R`Укажите номер выражения, являющегося разностью квадратов выражений $m$ и $7n$.`, + opts: mc('$(m-7n)^{2}$', '$\left(\dfrac{m}{7n}\right)^{2}$', '$m^{2}-(7n)^{2}$', '$m-(7n)^{2}$', '$m^{2}-7n^{2}$'), + answer: 'в', + sol: R`Разность квадратов выражений $m$ и $7n$ — это $m^{2}-(7n)^{2}$.`, + ref: 'Арефьева «Алгебра, 7 кл.», гл. 2, § 12–13' }, + + { idx: 2, type: 'mc', topic: 'trigonometry', subtopic: 'trig-identities', diff: 2, + text: R`Из углов $180^\circ$, $240^\circ$, $225^\circ$, $210^\circ$, $270^\circ$ выберите тот, тангенс которого равен $\sqrt3$.`, + opts: mc('$180^\circ$', '$240^\circ$', '$225^\circ$', '$210^\circ$', '$270^\circ$'), + answer: 'б', + sol: R`$\operatorname{tg}240^\circ=\operatorname{tg}(180^\circ+60^\circ)=\operatorname{tg}60^\circ=\sqrt3$. У остальных данных углов тангенс не равен $\sqrt3$.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 3' }, + + { idx: 3, type: 'mc', topic: 'planimetry', subtopic: 'plan-circle', diff: 2, + text: R`Вписанный угол $MKN$ опирается на дугу $MN$, градусная мера которой (заключённой внутри этого угла) равна $88^\circ$. Найдите градусную меру угла $MKN$.`, + opts: mc('$44^\circ$', '$24^\circ$', '$46^\circ$', '$88^\circ$', '$22^\circ$'), + answer: 'а', + sol: R`Вписанный угол равен половине дуги, на которую он опирается: $\angle MKN=\dfrac12\cdot88^\circ=44^\circ$.`, + ref: 'Казаков «Геометрия, 8 кл.», гл. 4, § 27' }, + + { idx: 4, type: 'mc', topic: 'equations', subtopic: 'eq-rational', diff: 2, + text: R`Укажите номер уравнения, корнем которого является число $-1$.`, + opts: mc('$\dfrac{5}{x+1}=0$', '$x^{2}+1=0$', '$3^{\,x-1}=1$', '$\log_7(x+2)=0$', '$\sqrt{x-1}=0$'), + answer: 'г', + sol: R`Подставим $x=-1$: $\dfrac{5}{0}$ не имеет смысла; $\ (-1)^{2}+1=2\ne0$; $\ 3^{-2}\ne1$; $\ \log_7(-1+2)=\log_7 1=0$ — верно; $\ \sqrt{-2}$ не имеет смысла. Корень $-1$ имеет только уравнение под номером 4.`, + ref: 'Арефьева «Алгебра, 7 кл.», гл. 3, § 15' }, + + { idx: 5, type: 'mc', topic: 'functions', subtopic: 'fn-properties', diff: 2, + text: R`Среди значений аргумента $x$, равных $1{,}5$; $0{,}4$; $1{,}2$; $0{,}6$; $2{,}5$, укажите то, при котором значение функции $f(x)=\dfrac2x$ меньше $1$.`, + opts: mc('$1{,}5$', '$0{,}4$', '$1{,}2$', '$0{,}6$', '$2{,}5$'), + answer: 'д', + sol: R`$f(x)=\dfrac2x<1$ при $x>2$ (для положительных $x$). Из данных чисел этому условию удовлетворяет только $2{,}5$: $\dfrac{2}{2{,}5}=0{,}8<1$.`, + ref: 'Арефьева «Алгебра, 8 кл.», гл. 3, § 13' }, + + { idx: 6, type: 'open', topic: 'functions', subtopic: 'fn-properties', diff: 3, + fig: FIG_A6, + text: R`На рисунке изображён график функции $y=f(x)$, определённой на промежутке $[-5;6]$. Укажите номера верных утверждений.
1) функция имеет три нуля;
2) $f'(-4)=0$;
3) максимум функции равен $5$;
4) сумма целых значений аргумента, при которых $f'(x)>0$, равна $5$;
5) наименьшее значение функции на промежутке $[-5;6]$ равно $-2$.
Ответ запишите цифрами в порядке возрастания, без пробелов.`, + answer: '134', ansShow: '1, 3, 4', + sol: R`$1)$ верно: график пересекает ось абсцисс в трёх точках. $\ 2)$ неверно: при $x=-4$ функция убывает, $f'(-4)<0$. $\ 3)$ верно: наибольшее (максимум) значение функции равно $5$. $\ 4)$ верно: функция возрастает на $(-2;4)$, целые значения с $f'(x)>0$ — это $-1,0,1,2,3$, их сумма $5$. $\ 5)$ неверно: наименьшее значение функции равно $-5$.`, + ref: 'Арефьева «Алгебра, 9 кл.», гл. 2, § 7; «Алгебра, 10 кл.», гл. 3, § 20' }, + + { idx: 7, type: 'mc', topic: 'word-sequences', subtopic: 'word-problems', diff: 2, + text: R`Пять рабочих могут выполнить работу за $14$ дней. За сколько дней могут выполнить эту же работу $7$ рабочих?`, + opts: mc('$20$', '$16$', '$12$', '$10$', '$9$'), + answer: 'г', + sol: R`Зависимость между числом рабочих и числом дней обратно пропорциональная: $\dfrac{5}{7}=\dfrac{x}{14}$, откуда $x=\dfrac{5\cdot14}{7}=10$ (дней).`, + ref: 'Герасимов «Математика, 6 кл.», гл. 2, § 4–5' }, + + { idx: 8, type: 'mc', topic: 'trigonometry', subtopic: 'trig-identities', diff: 2, + text: R`Найдите значение выражения $6\cos\alpha$, если $\sin\alpha=\dfrac{\sqrt2}{3}$ и $\dfrac{\pi}{2}<\alpha<\pi$.`, + opts: mc('$2\sqrt7$', '$-2\sqrt{11}$', '$-2\sqrt7$', '$2\sqrt{11}$', '$-2\sqrt2$'), + answer: 'в', + sol: R`Из $\sin^{2}\alpha+\cos^{2}\alpha=1$: $\cos^{2}\alpha=1-\dfrac29=\dfrac79$. Во второй четверти $\cos\alpha<0$, поэтому $\cos\alpha=-\dfrac{\sqrt7}{3}$. Тогда $6\cos\alpha=-2\sqrt7$.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 4' }, + + { idx: 9, type: 'mc', topic: 'stereometry', subtopic: 'ster-rotation', diff: 2, + text: R`Прямоугольник, у которого длины сторон равны $3$ и $6$, вращается вокруг большей стороны. Найдите площадь боковой поверхности цилиндра, полученного в результате вращения.`, + opts: mc('$54\pi$', '$18\pi$', '$108\pi$', '$45\pi$', '$36\pi$'), + answer: 'д', + sol: R`При вращении вокруг большей стороны ($6$) она становится высотой цилиндра, а меньшая ($3$) — радиусом основания. Площадь боковой поверхности $S=2\pi rh=2\pi\cdot3\cdot6=36\pi$.`, + ref: 'Латотин «Геометрия, 11 кл.», разд. 1, § 2' }, + + { idx: 10, type: 'open', topic: 'trigonometry', subtopic: 'trig-circle', diff: 2, + text: R`Среди данных утверждений укажите номера верных.
1) $\operatorname{arctg}(-1)=\dfrac{3\pi}{4}$;
2) $\sin\dfrac{\pi}{4}>\sin\dfrac{\pi}{6}$;
3) $\cos\dfrac{\pi}{3}>\cos\dfrac{\pi}{6}$;
4) $\operatorname{ctg}\dfrac{17\pi}{12}<0$;
5) $\arccos\left(-\dfrac12\right)=\dfrac{2\pi}{3}$.
Ответ запишите цифрами в порядке возрастания, без пробелов.`, + answer: '25', ansShow: '2, 5', + sol: R`$1)$ неверно: $\operatorname{arctg}(-1)=-\dfrac{\pi}{4}$. $\ 2)$ верно: $\dfrac{\sqrt2}{2}>\dfrac12$. $\ 3)$ неверно: $\dfrac12<\dfrac{\sqrt3}{2}$. $\ 4)$ неверно: $\operatorname{ctg}\dfrac{17\pi}{12}=\operatorname{ctg}\dfrac{5\pi}{12}>0$. $\ 5)$ верно: $\arccos\left(-\dfrac12\right)=\dfrac{2\pi}{3}$. Подходят 2 и 5.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 7; § 9' }, + + // ── Часть B: В1–В20 ────────────────────────────────────────────────────── + { idx: 11, type: 'long', topic: 'word-sequences', subtopic: 'seq-progressions', diff: 3, + text: R`Для начала каждого из предложений А–В подберите его окончание 1–6 так, чтобы получилось верное утверждение.
Начало:
А) Сумма шестнадцати первых членов арифметической прогрессии $(a_n)$, у которой $a_1=-2$, $a_{16}=43$, равна …
Б) Сумма пяти первых членов геометрической прогрессии $(b_n)$, у которой $b_1=-4$, $q=2$, равна …
В) Сумма бесконечно убывающей геометрической прогрессии, у которой $b_1=-208$, $q=\dfrac15$, равна …
Окончание:
1) $-260$; 2) $-110$; 3) $328$; 4) $-832$; 5) $-124$; 6) $252$.
Ответ запишите сочетанием букв и цифр, например: А1Б1В4.`, + answer: 'А3Б5В1', ansShow: 'А3Б5В1', + sol: R`А) $S_{16}=\dfrac{a_1+a_{16}}{2}\cdot16=\dfrac{-2+43}{2}\cdot16=41\cdot8=328$ — окончание 3. Б) $S_5=\dfrac{b_1(q^{5}-1)}{q-1}=\dfrac{-4(32-1)}{1}=-124$ — окончание 5. В) $S=\dfrac{b_1}{1-q}=\dfrac{-208}{1-\frac15}=-208\cdot\dfrac54=-260$ — окончание 1.`, + ref: 'Арефьева «Алгебра, 9 кл.», гл. 4, § 16; § 18–19' }, + + { idx: 12, type: 'open', topic: 'stereometry', subtopic: 'ster-angles-distances', diff: 3, + text: R`$ABCDA_1B_1C_1D_1$ — прямоугольный параллелепипед. Выберите верные утверждения.
1) расстояние от точки $B$ до плоскости грани $A_1D_1C_1B_1$ равно длине отрезка $BB_1$;
2) расстояние между плоскостями граней $AA_1D_1D$ и $BB_1C_1C$ равно длине отрезка $AB$;
3) расстояние между прямой $D_1C_1$ и плоскостью грани $ABCD$ равно длине отрезка $DC_1$;
4) расстояние от точки $C$ до плоскости грани $AA_1D_1D$ равно длине отрезка $CC_1$;
5) расстояние между плоскостями граней $AA_1B_1B$ и $DD_1C_1C$ равно длине отрезка $B_1D$;
6) расстояние между прямой $DC_1$ и плоскостью грани $AA_1B_1B$ равно длине отрезка $B_1C_1$.
Ответ запишите цифрами в порядке возрастания, без пробелов.`, + answer: '126', ansShow: '1, 2, 6', + sol: R`Расстояние от точки (прямой) до плоскости — длина перпендикуляра. $\ 1)$ верно: $BB_1\perp$ верхней грани. $\ 2)$ верно: $AB$ — общий перпендикуляр параллельных граней. $\ 3)$ неверно: расстояние равно длине бокового ребра, а не диагонали $DC_1$. $\ 4)$ неверно: расстояние равно $CD$, а не $CC_1$. $\ 5)$ неверно: расстояние равно $AD$, а не диагонали $B_1D$. $\ 6)$ верно: $B_1C_1$ — перпендикуляр между $DC_1$ и гранью $AA_1B_1B$. Подходят 1, 2, 6.`, + ref: 'Латотин «Геометрия, 10 кл.», разд. 3, § 8' }, + + { idx: 13, type: 'long', topic: 'functions', subtopic: 'fn-graphs', diff: 2, + text: R`На рисунке изображён график функции $f(x)=|x|$ и отмечена точка $A(-2;2)$, принадлежащая этому графику. Для начала каждого из предложений А–В подберите его окончание 1–6 так, чтобы получилось верное утверждение.
Начало:
А) Если график функции $f(x)=|x|$ сдвинуть на $6$ единиц вправо вдоль оси абсцисс, то точка $A$ будет иметь координаты …
Б) Если график функции $f(x)=|x|$ сдвинуть на $8$ единиц вниз вдоль оси ординат, то точка $A$ будет иметь координаты …
В) Если график функции $f(x)=|x|$ сдвинуть на $2$ единицы влево вдоль оси абсцисс и на $3$ единицы вверх вдоль оси ординат, то точка $A$ будет иметь координаты …
Окончание:
1) $(-8;2)$; 2) $(0;-1)$; 3) $(-2;-6)$; 4) $(-2;10)$; 5) $(4;2)$; 6) $(-4;5)$.
Ответ запишите сочетанием букв и цифр, например: А1Б1В4.`, + answer: 'А5Б3В6', ansShow: 'А5Б3В6', + sol: R`А) сдвиг на $6$ вправо: $(-2+6;2)=(4;2)$ — окончание 5. Б) сдвиг на $8$ вниз: $(-2;2-8)=(-2;-6)$ — окончание 3. В) сдвиг на $2$ влево и $3$ вверх: $(-2-2;2+3)=(-4;5)$ — окончание 6.`, + ref: 'Арефьева «Алгебра, 9 кл.», гл. 2, § 9' }, + + { idx: 14, type: 'long', topic: 'numbers', subtopic: 'num-divisibility', diff: 2, + text: R`Для начала каждого из предложений А–В подберите его окончание 1–6 так, чтобы получилось верное утверждение, если известно, что $2023=7\cdot17\cdot17$.
Начало:
А) Наибольший простой делитель числа $2023$ равен …
Б) Количество различных натуральных делителей числа $2023$ равно …
В) Наибольший общий делитель чисел $117$ и $2023$ равен …
Окончание:
1) $5$; 2) $17$; 3) $7$; 4) $51$; 5) $1$; 6) $6$.
Ответ запишите сочетанием букв и цифр, например: А1Б1В4.`, + answer: 'А2Б6В5', ansShow: 'А2Б6В5', + sol: R`А) простые делители числа $2023$ — это $7$ и $17$, наибольший $17$ — окончание 2. Б) делители $2023$: $1,7,17,119,289,2023$ — всего $6$ — окончание 6. В) $117=3^{2}\cdot13$, у чисел $117$ и $2023$ общих простых делителей нет, поэтому их наибольший общий делитель равен $1$ — окончание 5.`, + ref: 'Герасимов «Математика, 5 кл.», ч. 1, гл. 1, § 12; § 14' }, + + { idx: 15, type: 'open', topic: 'planimetry', subtopic: 'plan-triangles', diff: 2, + text: R`В треугольнике $ABC$ точка $M$ лежит на стороне $AC$, точка $N$ — на стороне $BC$, причём $MN\parallel AB$, $CM=24$, $CN=12$, $NB=3$. Найдите длину стороны $AC$.`, + answer: '30', + sol: R`Так как $MN\parallel AB$, треугольник $MNC$ подобен треугольнику $ABC$. Тогда $\dfrac{CM}{CA}=\dfrac{CN}{CB}$, где $CB=CN+NB=15$. Получаем $\dfrac{24}{CA}=\dfrac{12}{15}$, откуда $CA=\dfrac{24\cdot15}{12}=30$.`, + ref: 'Казаков «Геометрия, 8 кл.», гл. 3, § 20' }, + + { idx: 16, type: 'open', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 3, + text: R`Найдите значение выражения $\left(3b^{0{,}25}\right)^{2}+3b^{0{,}5}$ при $b=\log_{\sqrt2}256$.`, + answer: '48', + sol: R`Упростим: $\left(3b^{0{,}25}\right)^{2}+3b^{0{,}5}=9b^{0{,}5}+3b^{0{,}5}=12b^{0{,}5}$. Значение $b=\log_{\sqrt2}256=\log_{2^{1/2}}2^{8}=\dfrac{8}{1/2}=16$. Тогда $12\cdot16^{0{,}5}=12\cdot4=48$.`, + ref: 'Арефьева «Алгебра, 11 кл.», гл. 1, § 1' }, + + { idx: 17, type: 'open', topic: 'equations', subtopic: 'eq-logarithmic', diff: 3, + text: R`Найдите произведение корней уравнения $\log_{\sqrt5}\left(x-3\sqrt7\right)+\log_{\sqrt5}\left(x+3\sqrt7\right)=0$ (корень, если он единственный).`, + answer: '8', + sol: R`По свойству логарифмов $\log_{\sqrt5}\left((x-3\sqrt7)(x+3\sqrt7)\right)=0$, то есть $x^{2}-63=1$, $x^{2}=64$, $x=\pm8$. Условию $x-3\sqrt7>0$ ($3\sqrt7\approx7{,}9$) удовлетворяет только $x=8$.`, + ref: 'Арефьева «Алгебра, 11 кл.», гл. 3, § 9' }, + + { idx: 18, type: 'open', topic: 'word-sequences', subtopic: 'word-problems', diff: 2, + text: R`Через электронный сервис Петя купил билет на спортивное мероприятие и заплатил $46$ рублей $25$ копеек. В эту сумму входит стоимость билета и сервисный сбор $2$ рубля $50$ копеек. За два дня до мероприятия Петя решил вернуть билет. По правилам организатора ему вернут $80\%$ стоимости билета. Какую сумму (в рублях) получит Петя, вернув билет?`, + answer: '35', + sol: R`Стоимость билета без сервисного сбора: $46{,}25-2{,}50=43{,}75$ рубля. Вернут $80\%$ от неё: $43{,}75\cdot0{,}8=35$ (рублей).`, + ref: 'Герасимов «Математика, 6 кл.», гл. 2, § 1–2' }, + + { idx: 19, type: 'open', topic: 'equations', subtopic: 'eq-exponential', diff: 3, + text: R`Найдите сумму всех целых решений неравенства $\left(\dfrac37\right)^{\frac{x+18}{(x-2)^{2}}}\le\dfrac37$.`, + answer: '23', + sol: R`Так как $0<\dfrac37<1$, функция убывает, поэтому неравенство равносильно $\dfrac{x+18}{(x-2)^{2}}\ge1$, то есть $\dfrac{(x+2)(x-7)}{(x-2)^{2}}\le0$. Методом интервалов (нули $-2$ и $7$, $x\ne2$) решение — $[-2;2)\cup(2;7]$. Целые: $-2,-1,0,1,3,4,5,6,7$; их сумма равна $23$.`, + ref: 'Арефьева «Алгебра, 11 кл.», гл. 2, § 6' }, + + { idx: 20, type: 'open', topic: 'planimetry', subtopic: 'plan-quadrilaterals', diff: 4, + text: R`В трапеции $ABCD$ ($BC\parallel AD$) известно, что $\angle A=90^\circ$, $\angle C=120^\circ$, $AD=8\sqrt2$. Найдите значение выражения $\sqrt3\cdot S$, где $S$ — площадь трапеции $ABCD$, если высота трапеции равна $3\sqrt6$.`, + answer: '117', + sol: R`Пусть $CK$ — высота ($CK=3\sqrt6$). В прямоугольном треугольнике $CKD$ угол при $D$ равен $60^\circ$, поэтому $KD=\dfrac{CK}{\sqrt3}=3\sqrt2$. Тогда $AK=AD-KD=8\sqrt2-3\sqrt2=5\sqrt2$, а так как $ABCK$ — прямоугольник, $BC=AK=5\sqrt2$. Площадь $S=\dfrac{AD+BC}{2}\cdot CK=\dfrac{8\sqrt2+5\sqrt2}{2}\cdot3\sqrt6=39\sqrt3$. Тогда $\sqrt3\cdot S=\sqrt3\cdot39\sqrt3=117$.`, + ref: 'Казаков «Геометрия, 8 кл.», гл. 2, § 17' }, + + { idx: 21, type: 'open', topic: 'functions', subtopic: 'fn-derivative', diff: 3, + text: R`Найдите наименьшее значение функции $f(x)=\dfrac{x^{2}}{x-4}$ на отрезке $[6;10]$.`, + answer: '16', + sol: R`$f'(x)=\dfrac{2x(x-4)-x^{2}}{(x-4)^{2}}=\dfrac{x^{2}-8x}{(x-4)^{2}}$. Нули $x=0$ и $x=8$; на $[6;10]$ лежит $x=8$. Сравним $f(6)=\dfrac{36}{2}=18$, $f(8)=\dfrac{64}{4}=16$, $f(10)=\dfrac{100}{6}=16\dfrac23$. Наименьшее значение $16$ (при $x=8$).`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 3, § 22' }, + + { idx: 22, type: 'open', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 3, + text: R`Найдите значение выражения $\log_3\left(\dfrac{a}{9}\right)-\log_3\left(\dfrac{81}{b}\right)$, если $\log_3(ab)=17$.`, + answer: '11', + sol: R`$\log_3\dfrac{a}{9}-\log_3\dfrac{81}{b}=\log_3 a-\log_3 9-\log_3 81+\log_3 b=\log_3(ab)-2-4=\log_3(ab)-6$. Подставив $\log_3(ab)=17$, получим $17-6=11$.`, + ref: 'Арефьева «Алгебра, 11 кл.», гл. 3, § 7' }, + + { idx: 23, type: 'open', topic: 'stereometry', subtopic: 'ster-polyhedra', diff: 4, + text: R`$ABCA_1B_1C_1$ — правильная треугольная призма, длина стороны основания которой равна $7$, а бокового ребра — $\sqrt{29}$. Найдите периметр сечения призмы плоскостью, проходящей через прямую $A_1C_1$ и середину ребра $BB_1$.`, + answer: '22', + sol: R`Пусть $K$ — середина ребра $BB_1$. Сечение — равнобедренный треугольник $A_1KC_1$ с $A_1C_1=7$ и $KA_1=KC_1$. Из прямоугольного треугольника $KB_1A_1$: $KB_1=\dfrac{\sqrt{29}}{2}$, $A_1B_1=7$, поэтому $KA_1=\sqrt{49+\dfrac{29}{4}}=\sqrt{\dfrac{225}{4}}=\dfrac{15}{2}$. Периметр $P=A_1C_1+KA_1+KC_1=7+2\cdot\dfrac{15}{2}=22$.`, + ref: 'Латотин «Геометрия, 10 кл.», разд. 1, § 3' }, + + { idx: 24, type: 'open', topic: 'equations', subtopic: 'eq-rational', diff: 3, + text: R`Найдите сумму всех целых решений системы неравенств $\begin{cases}x^{2}+8x+7\ge0,\\(x+9)(4-x)>0.\end{cases}$`, + answer: '-10', + sol: R`$x^{2}+8x+7\ge0\Rightarrow(x+7)(x+1)\ge0$, решение $(-\infty;-7]\cup[-1;+\infty)$. $\ (x+9)(4-x)>0\Rightarrow x\in(-9;4)$. Пересечение — $(-9;-7]\cup[-1;4)$. Целые: $-8,-7,-1,0,1,2,3$; их сумма равна $-10$.`, + ref: 'Арефьева «Алгебра, 8 кл.», гл. 3, § 16' }, + + { idx: 25, type: 'open', topic: 'equations', subtopic: 'eq-irrational', diff: 3, + text: R`Найдите сумму квадратов корней уравнения $\sqrt{2x+6}-\sqrt{x+1}=2$.`, + answer: '226', + sol: R`Перепишем: $\sqrt{2x+6}=2+\sqrt{x+1}$. Возведя в квадрат: $2x+6=4+4\sqrt{x+1}+x+1$, $x+1=4\sqrt{x+1}$. Ещё раз в квадрат: $x^{2}-14x-15=0$, корни $-1$ и $15$ (оба проходят проверку). Сумма квадратов $(-1)^{2}+15^{2}=1+225=226$.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 2, § 17' }, + + { idx: 26, type: 'open', topic: 'stereometry', subtopic: 'ster-angles-distances', diff: 4, + text: R`В прямоугольном треугольнике $KMN$ угол $M$ равен $90^\circ$, а $KN=6\sqrt2$. Точка $A$, не лежащая в плоскости треугольника $KMN$, удалена на расстояние $7$ от каждой вершины треугольника. Найдите значение выражения $21\sqrt2\cdot\cos\alpha$, где $\alpha$ — угол между прямой $AM$ и плоскостью $KMN$.`, + answer: '18', + sol: R`Так как точка $A$ равноудалена от вершин, основание $O$ перпендикуляра $AO$ — центр описанной около прямоугольного треугольника окружности, то есть середина гипотенузы $KN$, причём $MO=\dfrac{KN}{2}=3\sqrt2$. Угол между $AM$ и плоскостью — это $\angle AMO=\alpha$. В прямоугольном треугольнике $AOM$: $\cos\alpha=\dfrac{MO}{AM}=\dfrac{3\sqrt2}{7}$. Тогда $21\sqrt2\cdot\dfrac{3\sqrt2}{7}=\dfrac{21\cdot3\cdot2}{7}=18$.`, + ref: 'Латотин «Геометрия, 10 кл.», разд. 3, § 9' }, + + { idx: 27, type: 'open', topic: 'trigonometry', subtopic: 'trig-equations', diff: 4, + text: R`Найдите (в градусах) сумму различных корней уравнения $\sqrt3\sin5x+\cos5x=0$ на промежутке $(-45^\circ;0^\circ)$.`, + answer: '-48', + sol: R`Разделив на $\cos5x$: $\sqrt3\operatorname{tg}5x+1=0$, $\operatorname{tg}5x=-\dfrac{\sqrt3}{3}$, откуда $5x=-30^\circ+180^\circ n$, $x=-6^\circ+36^\circ n$. Промежутку $(-45^\circ;0^\circ)$ принадлежат $-6^\circ$ и $-42^\circ$; их сумма равна $-48^\circ$.`, + ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 8' }, + + { idx: 28, type: 'open', topic: 'equations', subtopic: 'eq-logarithmic', diff: 4, + text: R`Найдите сумму всех целых решений неравенства $\dfrac{8}{1+\log_3 x}>-1+\log_3 x$.`, + answer: '351', + sol: R`Пусть $t=\log_3 x$, тогда $\dfrac{8}{1+t}>t-1$, что приводит к $\dfrac{(t-3)(t+3)}{t+1}<0$, решение $t<-3$ или $-1Ответ: ${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`); + if (t.type !== 'long' && !checkAnswerServer(t.answer, t.answer)) + problems.push(`#${t.idx}: answer "${t.answer}" не проходит self-check (Unicode-минус? пробел?)`); + 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_rt2223_e3v1 (${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'); +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)}`); +} + +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_rt2223_e3v1.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++; + } + 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 → «Варианты» → «РТ-2022/23 · этап III».\n`); +} catch (e) { + db.exec('ROLLBACK'); + console.error('\n✗ Ошибка записи, откат транзакции:', e.message); + process.exitCode = 1; +} +db.close();