Files
Learn_System/backend/scripts/seed_ctmath_ct2020_v1.js
T
Maxim Dolgolyov 59c691dcfc feat(ctmath): вариант 116 — ЦТ-2020 (32 задания, формат А1-А20)
Пробник ЦТ по математике 2020, Вариант 1. ⚠️ Новый формат: 32 задания (А1–А20 + В1–В12),
В1 на соответствие, В2 множ.выбор. Машинерия параметризована N_TASKS=32. Источник: чистый
PDF ЦТ 2020.pdf. ВСЕ 32 ответа решены и сверены с официальной таблицей (стр.44, столбец
Вариант 1) — полное совпадение, включая A20=37√13/3, B5=-335, B8=-320, B9=160, B10=577,
B11=-16, B12=336 (сфера через 4 точки куба). Фигурные A9/A11 реконструированы; без авторских
ссылок (политика «все учебники наши»). VARIANT_LABEL 116 -> 'ЦТ-2020'.
DRY-RUN 32/32, self-check и структурный KaTeX — зелёные.
Запись в БД — пользователь: node backend/scripts/seed_ctmath_ct2020_v1.js --apply

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 12:09:17 +03:00

364 lines
32 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_ct2020_v1.js
Чистый вариант-пробник для трека exam-prep `ctmath`.
Источник: Централизованное тестирование (ЦТ) по математике, 2020, Вариант 1.
Формат 2020: Часть А = А1–А20 (закрытые), Часть В = В1–В12 (открытые; В1 — на
соответствие, В2 — множественный выбор). Всего **32 задания** (не 30!).
Перенабрано вручную в KaTeX по PDF:
F:\!Рабочие\ЦТ\Математика\Математика\ЦТ-ЦЭ\ЦТ 2020.pdf (10 вариантов, табл. ответов стр.44).
⚠️ Ответы решены самостоятельно и СВЕРЕНЫ с официальной таблицей (стр.44, столбец
«Вариант 1»): ВСЕ 32 совпали, включая A20=37√13/3, B5=-335, B8=-320, B9=160, B10=577,
B11=-16, B12=336. variant=116 (после ЦТ-2019 = 115).
Реконструкции заданий-«с-картинкой» (смысл/ответ сохранены, авто-проверка):
• А9 (точка и прямая на сетке) → A(-1;2), прямая l: y=-x; симметрия → (-2;1);
• А11 (графики плот/катер) → скорость плота и расстояние даны числами (→ 960 мин);
• А2/А7 — добавлены явные условия (точки на одной дуге; M,N — середины сторон);
• В1/В2 — данные предложений/утверждений приведены текстом (как в оригинале).
Идемпотентность: upsert по UNIQUE(exam_key, variant, task_idx). Без авторских ссылок
(политика «все учебники наши»).
Запуск:
node backend/scripts/seed_ctmath_ct2020_v1.js # DRY-RUN (по умолчанию)
node backend/scripts/seed_ctmath_ct2020_v1.js --apply # запись в БД
⚠️ Массовую запись в БД запускает ПОЛЬЗОВАТЕЛЬ вручную. Без --apply ничего не пишется.
─────────────────────────────────────────────────────────────────────────── */
const { DatabaseSync } = require('node:sqlite');
const path = require('path');
const APPLY = process.argv.includes('--apply');
const EXAM = 'ctmath';
const VARIANT = 116;
const N_TASKS = 32;
const PROV = 'ЦТ–2020, Вариант 1';
const R = String.raw;
const L = ['а', 'б', 'в', 'г', 'д'];
const mc = (...html) => html.map((h, i) => [L[i], h]);
/* ── 32 задания ─────────────────────────────────────────────────────────── */
const TASKS = [
// ── Часть A: А1–А20 ──────────────────────────────────────────────────────
{ idx: 1, type: 'mc', topic: 'functions', subtopic: 'fn-graphs', diff: 1,
text: R`Укажите номер точки, которая принадлежит графику функции $y=5^{x}$.`,
opts: mc('$(25;2)$', '$(2;10)$', '$(5;25)$', '$(2;25)$', '$(1;0)$'),
answer: 'г',
sol: R`При $x=2$ имеем $y=5^{2}=25$, поэтому точка $(2;25)$ лежит на графике.` },
{ idx: 2, type: 'mc', topic: 'planimetry', subtopic: 'plan-circle', diff: 2,
text: R`Вписанный угол $KML$ равен $38^\circ$. Точки $M$ и $N$ лежат на одной дуге окружности (по одну сторону от хорды $KL$). Найдите вписанный угол $KNL$.`,
opts: mc('$46^\circ$', '$38^\circ$', '$19^\circ$', '$52^\circ$', '$76^\circ$'),
answer: 'б',
sol: R`Вписанные углы, опирающиеся на одну и ту же дугу $KL$ с одной стороны, равны: $\angle KNL=\angle KML=38^\circ$.` },
{ idx: 3, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 1,
text: R`Укажите номер выражения для натурального числа, содержащего $c$ десятков и $3$ единицы ($c$ — цифра).`,
opts: mc('$c+3$', '$3c$', '$3c+10$', '$10c+3$', '$30+c$'),
answer: 'г',
sol: R`$c$ десятков и $3$ единицы — это $10c+3$.` },
{ idx: 4, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 1,
text: R`Определите, на сколько неизвестное слагаемое меньше суммы, если $x+20=80$.`,
opts: mc('$80$', '$20$', '$60$', '$40$', '$100$'),
answer: 'б',
sol: R`Неизвестное слагаемое $x=80-20=60$, сумма равна $80$. Разность $80-60=20$.` },
{ idx: 5, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 1,
text: R`Среди точек $C(33)$, $D(24)$, $E(28)$, $F(43)$, $K(12)$ координатной прямой укажите точку, симметричную точке $A(5)$ относительно точки $B(19)$.`,
opts: mc('$C(33)$', '$D(24)$', '$E(28)$', '$F(43)$', '$K(12)$'),
answer: 'а',
sol: R`Симметричная точка имеет координату $2\cdot19-5=33$ — это точка $C(33)$.` },
{ idx: 6, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 2,
text: R`Найдите значение выражения $\left(3\tfrac17-2\right)\cdot\left(1+\tfrac34\right):9$.`,
opts: mc('$1\tfrac{41}{63}$', '$\tfrac{3}{28}$', '$1\tfrac{19}{252}$', '$-\tfrac{11}{36}$', '$\tfrac29$'),
answer: 'д',
sol: R`$\left(\tfrac{22}{7}-2\right)\cdot\tfrac74:9=\tfrac87\cdot\tfrac74:9=2:9=\tfrac29$.` },
{ idx: 7, type: 'mc', topic: 'planimetry', subtopic: 'plan-triangles', diff: 2,
text: R`В треугольнике $ABC$ $\angle ABC=104^\circ$, $\angle ACB=29^\circ$. Точки $M$ и $N$ — середины сторон $BC$ и $AC$ соответственно. Найдите градусную меру угла $ANM$ четырёхугольника $ABMN$.`,
opts: mc('$151^\circ$', '$128^\circ$', '$119^\circ$', '$133^\circ$', '$104^\circ$'),
answer: 'г',
sol: R`$MN$ — средняя линия, поэтому $MN\parallel AB$ и $\angle MNC=\angle BAC=180^\circ-104^\circ-29^\circ=47^\circ$. Так как $A,N,C$ лежат на одной прямой, $\angle ANM=180^\circ-47^\circ=133^\circ$.` },
{ idx: 8, type: 'mc', topic: 'numbers', subtopic: 'num-divisibility', diff: 1,
text: R`У Юры некоторое количество марок, а у Яна — в $2$ раза больше. Все марки поместили в один альбом. Среди чисел $26$, $38$, $20$, $37$, $39$ выберите то, которое может выражать количество марок в альбоме.`,
opts: mc('$26$', '$38$', '$20$', '$37$', '$39$'),
answer: 'д',
sol: R`Всего марок $x+2x=3x$ — число, кратное $3$. Из данных чисел кратно $3$ только $39$.` },
{ idx: 9, type: 'mc', topic: 'functions', subtopic: 'fn-graphs', diff: 2,
text: R`Даны точка $A(-1;2)$ и прямая $l$, заданная уравнением $y=-x$. Найдите координаты точки, симметричной точке $A$ относительно прямой $l$.`,
opts: mc('$(1;1)$', '$(-1;0)$', '$(-2;1)$', '$(0;2)$', '$(-2;4)$'),
answer: 'в',
sol: R`Симметрия относительно прямой $y=-x$ переводит точку $(x;y)$ в $(-y;-x)$, поэтому $(-1;2)\to(-2;1)$.` },
{ idx: 10, type: 'mc', topic: 'functions', subtopic: 'fn-graphs', diff: 2,
text: R`График уравнения $1{,}8x-0{,}6y=a$ проходит через точку $A(-2;9)$. Найдите число $a$.`,
opts: mc('$-9$', '$9$', '$7$', '$-18$', '$-2{,}4$'),
answer: 'а',
sol: R`$a=1{,}8\cdot(-2)-0{,}6\cdot9=-3{,}6-5{,}4=-9$.` },
{ idx: 11, type: 'mc', topic: 'word-sequences', subtopic: 'word-problems', diff: 2,
text: R`Из двух пунктов навстречу друг другу одновременно отправляются плот (по течению) и катер (против течения). По графику движения скорость плота (равная скорости течения) составляет $0{,}5$ км/ч, а расстояние между пунктами — $8$ км. За сколько минут плот придёт в пункт, из которого отправился катер?`,
opts: mc('$1020$ мин', '$960$ мин', '$510$ мин', '$900$ мин', '$480$ мин'),
answer: 'б',
sol: R`Плоту нужно пройти $8$ км со скоростью $0{,}5$ км/ч: $\dfrac{8}{0{,}5}=16$ ч $=960$ мин.` },
{ idx: 12, type: 'mc', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 2,
text: R`Внесите множитель под знак корня в выражении $-x\cdot\sqrt[5]{2x^{2}}$.`,
opts: mc('$\sqrt[5]{2x^{3}}$', '$\sqrt[5]{2x^{7}}$', '$\sqrt[5]{-2x^{7}}$', '$\sqrt[5]{-2x^{3}}$', '$\sqrt[5]{-2x^{10}}$'),
answer: 'в',
sol: R`$-x\cdot\sqrt[5]{2x^{2}}=\sqrt[5]{(-x)^{5}\cdot2x^{2}}=\sqrt[5]{-2x^{7}}$.` },
{ idx: 13, type: 'mc', topic: 'planimetry', subtopic: 'plan-circle', diff: 2,
text: R`В окружности радиуса $13$ проведена хорда $AB$. Точка $M$ делит хорду $AB$ на отрезки длиной $10$ и $12$. Найдите расстояние от точки $M$ до центра окружности.`,
opts: mc('$11$', '$7$', '$5$', '$6$', '$8$'),
answer: 'б',
sol: R`По свойству хорд $AM\cdot MB=R^{2}-OM^{2}$: $10\cdot12=169-OM^{2}$, откуда $OM^{2}=49$, $OM=7$.` },
{ idx: 14, type: 'mc', topic: 'equations', subtopic: 'eq-rational', diff: 3,
text: R`Для неравенства $(8-x)(x+3)\ge0$ укажите номера верных утверждений.<br>$1)$ число $0$ не является решением неравенства;<br>$2)$ неравенство равносильно неравенству $|x|\le8$;<br>$3)$ количество всех целых решений неравенства равно $12$;<br>$4)$ неравенство верно при $x\in[-2;3]$;<br>$5)$ решением неравенства является промежуток $[-8;3]$.`,
opts: mc('$2$ и $4$', '$3$ и $5$', '$3$ и $4$', '$1$ и $2$', '$1$ и $5$'),
answer: 'в',
sol: R`Решение неравенства — отрезок $[-3;8]$. Тогда: $0$ — решение (1 неверно); $|x|\le8$ даёт $[-8;8]$ (2 неверно); целых решений от $-3$ до $8$ ровно $12$ (3 верно); на $[-2;3]$ неравенство выполнено (4 верно); промежуток $[-3;8]$, не $[-8;3]$ (5 неверно). Верны $3$ и $4$.` },
{ idx: 15, type: 'mc', topic: 'planimetry', subtopic: 'plan-quadrilaterals', diff: 2,
text: R`Длины диагоналей ромба являются корнями уравнения $0{,}1x^{2}-2{,}2x+7{,}4=0$. Найдите площадь ромба.`,
opts: mc('$22$', '$48$', '$74$', '$11$', '$37$'),
answer: 'д',
sol: R`Уравнение равносильно $x^{2}-22x+74=0$; по теореме Виета произведение корней-диагоналей $d_1d_2=74$. Площадь ромба $\tfrac12 d_1d_2=37$.` },
{ idx: 16, type: 'mc', topic: 'planimetry', subtopic: 'plan-circle', diff: 3,
text: R`На одной стороне прямого угла с вершиной $O$ отмечены точки $A$ и $B$ так, что $OA=1{,}7$, $OB=a$, $OA<OB$. Составьте формулу для радиуса $r$ окружности, проходящей через точки $A$, $B$ и касающейся другой стороны угла.`,
opts: mc('$r=\dfrac{a+1{,}7}{2}$', '$r=\dfrac{a-1{,}7}{2}$', '$r=a+1{,}7$', '$r=\dfrac{a+3{,}4}{2}$', '$r=2a-1{,}7$'),
answer: 'а',
sol: R`Проекция центра окружности на сторону с точками $A,B$ — середина $AB$, на расстоянии $\dfrac{1{,}7+a}{2}$ от $O$. Касание другой стороны прямого угла даёт радиус, равный этому расстоянию: $r=\dfrac{a+1{,}7}{2}$.` },
{ idx: 17, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 3,
text: R`Число $A=5{,}43$ является результатом округления числа $B$ до сотых. Если $|A-B|=5\cdot10^{-3}$, то число $B$ равно:`,
opts: mc('$5{,}48$', '$5{,}4295$', '$5{,}425$', '$5{,}435$', '$5{,}4305$'),
answer: 'в',
sol: R`$|A-B|=0{,}005$, поэтому $B=5{,}425$ или $B=5{,}435$. До сотых к $5{,}43$ округляется только $5{,}425$ (число $5{,}435$ округлилось бы до $5{,}44$).` },
{ idx: 18, type: 'mc', topic: 'stereometry', subtopic: 'ster-rotation', diff: 2,
text: R`Высота цилиндра в $3$ раза больше радиуса его основания. Найдите объём цилиндра, если радиус основания равен $\sqrt6$.`,
opts: mc('$6\sqrt6\,\pi$', '$54\sqrt6\,\pi$', '$9\sqrt6\,\pi$', '$18\pi$', '$18\sqrt6\,\pi$'),
answer: 'д',
sol: R`$r=\sqrt6$, $h=3\sqrt6$. Объём $V=\pi r^{2}h=\pi\cdot6\cdot3\sqrt6=18\sqrt6\,\pi$.` },
{ idx: 19, type: 'mc', topic: 'equations', subtopic: 'eq-rational', diff: 4,
text: R`Найдите произведение наименьшего целого решения на количество всех целых решений неравенства $\left|x^{2}+9x\right|\le10$.`,
opts: mc('$90$', '$-54$', '$60$', '$-60$', '$-90$'),
answer: 'г',
sol: R`$-10\le x^{2}+9x\le10$. Правое неравенство даёт $-10\le x\le1$; левое — $x\le\dfrac{-9-\sqrt{41}}{2}$ или $x\ge\dfrac{-9+\sqrt{41}}{2}$. Решение $[-10;-7{,}7\ldots]\cup[-1{,}3\ldots;1]$. Целые решения $-10,-9,-8,-1,0,1$ (всего $6$); наименьшее $-10$. Произведение $-10\cdot6=-60$.` },
{ idx: 20, type: 'mc', topic: 'stereometry', subtopic: 'ster-polyhedra', diff: 5,
text: R`$SABCD$ — правильная четырёхугольная пирамида, все рёбра которой равны $37$. Точка $M$ — середина ребра $SA$, точка $N$ на ребре $SD$ такова, что $DN:NS=1:3$. Найдите длину отрезка, по которому плоскость, проходящая через точки $N$, $M$, $B$, пересекает основание $ABCD$.`,
opts: mc('$\dfrac{37\sqrt{13}}{3}$', '$46\tfrac14$', '$\dfrac{37\sqrt{10}}{3}$', '$\dfrac{37\sqrt{17}}{4}$', '$\dfrac{37\sqrt5}{2}$'),
answer: 'а',
sol: R`В координатах с центром основания (рёбра единичные) секущая плоскость пересекает основание по прямой $3x+2y=18{,}5$. Внутри квадрата отрезок идёт от вершины $B$ до точки на стороне $DC$; его длина равна $\dfrac{37\sqrt{13}}{3}$.` },
// ── Часть B: В1–В12 ──────────────────────────────────────────────────────
{ idx: 21, type: 'long', topic: 'word-sequences', subtopic: 'seq-progressions', diff: 3,
text: R`Дана арифметическая прогрессия $(a_n)$, у которой $a_9-a_5=12$, $a_{10}=14$. Для начала каждого из предложений А–В подберите его окончание $1$–$6$.<br>А) Разность этой прогрессии равна …<br>Б) Первый член этой прогрессии равен …<br>В) Сумма первых восьми членов этой прогрессии равна …<br>Окончания: $1)\;2$; $\ 2)\;-13$; $\ 3)\;4$; $\ 4)\;-26$; $\ 5)\;-20$; $\ 6)\;3$.`,
answer: 'А6Б2В5',
ansShow: 'А6Б2В5',
sol: R`$a_9-a_5=4d=12$, $d=3$ (окончание 6). $a_{10}=a_1+9d=14$, $a_1=-13$ (окончание 2). $S_8=4(2a_1+7d)=4(-26+21)=-20$ (окончание 5). Ответ: А6Б2В5.` },
{ idx: 22, type: 'open', topic: 'trigonometry', subtopic: 'trig-identities', diff: 3,
text: R`Выберите номера трёх верных утверждений, если известно, что $\sin\alpha=\sin23^\circ$ и $\cos\alpha=-\cos23^\circ$ (запишите цифрами в порядке возрастания).<br>$1)$ $\sin(\alpha+23^\circ)=0$;<br>$2)$ $\operatorname{tg}\alpha>0$;<br>$3)$ $\operatorname{ctg}\alpha<0$;<br>$4)$ $\alpha$ — угол первой четверти;<br>$5)$ $\sin^{2}\alpha+\cos^{2}\alpha=1$;<br>$6)$ $\alpha=-23^\circ$.`,
answer: '135',
sol: R`Из условий $\alpha=157^\circ$ (вторая четверть). Тогда $\sin(157^\circ+23^\circ)=\sin180^\circ=0$ (1 верно); $\operatorname{tg}157^\circ<0$ (2 неверно); $\operatorname{ctg}157^\circ<0$ (3 верно); это вторая четверть (4 неверно); основное тождество всегда верно (5 верно); $\alpha\ne-23^\circ$ (6 неверно). Верны $1,3,5$.` },
{ idx: 23, type: 'open', topic: 'word-sequences', subtopic: 'word-problems', diff: 3,
text: R`В каждую из трёх корзин положили одинаковое количество яблок. Если в одну из корзин добавить $19$ яблок, то в ней окажется меньше, чем в двух других корзинах вместе. Если же в эту корзину положить ещё $23$ яблока, то в ней их станет больше, чем было первоначально в трёх корзинах вместе. Сколько яблок было в каждой корзине первоначально?`,
answer: '20',
sol: R`Пусть в корзине $x$ яблок. Тогда $x+19<2x$, то есть $x>19$; и $x+19+23>3x$, то есть $x<21$. Значит $x=20$.` },
{ idx: 24, type: 'open', topic: 'planimetry', subtopic: 'plan-quadrilaterals', diff: 3,
text: R`В равнобедренную трапецию, площадь которой равна $115$, вписана окружность радиуса $5$. Найдите периметр трапеции.`,
answer: '46',
sol: R`Высота $h=2r=10$. Площадь $\tfrac12(a+b)h=5(a+b)=115$, откуда $a+b=23$. Для описанной около окружности трапеции сумма оснований равна сумме боковых сторон, поэтому периметр $=2(a+b)=46$.` },
{ idx: 25, type: 'open', topic: 'trigonometry', subtopic: 'trig-equations', diff: 4,
text: R`Найдите произведение наименьшего корня (в градусах) на количество различных корней уравнения $\sin5x=\cos65^\circ$ на промежутке $(-90^\circ;90^\circ)$.`,
answer: '-335',
sol: R`$\cos65^\circ=\sin25^\circ$, поэтому $5x=25^\circ+360^\circ k$ или $5x=155^\circ+360^\circ k$, то есть $x=5^\circ+72^\circ k$ или $x=31^\circ+72^\circ k$. На $(-90^\circ;90^\circ)$ корни $-67^\circ,-41^\circ,5^\circ,31^\circ,77^\circ$ — всего $5$; наименьший $-67^\circ$. Произведение $-67\cdot5=-335$.` },
{ idx: 26, type: 'open', topic: 'planimetry', subtopic: 'plan-quadrilaterals', diff: 4,
text: R`Точки $N$ и $M$ лежат на сторонах $AB$ и $AD$ параллелограмма $ABCD$ так, что $AN:NB=1:2$ и $AM:MD=1:2$. Площадь треугольника $CMN$ равна $45$. Найдите площадь параллелограмма $ABCD$.`,
answer: '162',
sol: R`Пусть площадь параллелограмма равна $S$. Через векторы $\vec{AB}$ и $\vec{AD}$ площадь треугольника $CMN$ равна $\tfrac{5}{18}S$. Из $\tfrac{5}{18}S=45$ получаем $S=162$.` },
{ idx: 27, type: 'open', topic: 'equations', subtopic: 'eq-exponential', diff: 5,
text: R`Найдите произведение наибольшего целого отрицательного и наибольшего целого положительного решений неравенства $3\cdot16^{\frac{x^{2}-29}{-3x}}-10\cdot16^{\frac{x^{2}-29}{-6x}}>8$.`,
answer: '-32',
sol: R`Пусть $t=16^{\frac{x^{2}-29}{-6x}}>0$. Тогда $3t^{2}-10t-8>0$, $(3t+2)(t-4)>0$, значит $t>4$, то есть $\frac{x^{2}-29}{-6x}>\tfrac12$, что приводит к $\frac{x^{2}+3x-29}{x}<0$. Решение: $x<\frac{-3-5\sqrt5}{2}$ или $0<x<\frac{-3+5\sqrt5}{2}$. Наибольшее целое отрицательное $-8$, наибольшее целое положительное $4$; произведение $-8\cdot4=-32$.` },
{ idx: 28, type: 'open', topic: 'equations', subtopic: 'eq-irrational', diff: 5,
text: R`Найдите произведение корней (корень, если он единственный) уравнения $\sqrt[4]{x^{2}+3x-40}\cdot\sqrt[3]{x^{2}-3x-40}=0$.`,
answer: '-320',
sol: R`ОДЗ: $x^{2}+3x-40\ge0$. Из $\sqrt[4]{x^{2}+3x-40}=0$: $x=-8$ или $x=5$. Из $\sqrt[3]{x^{2}-3x-40}=0$: $x=8$ или $x=-5$, но $x=-5$ не входит в ОДЗ. Корни $-8,5,8$; произведение $-8\cdot5\cdot8=-320$.` },
{ idx: 29, type: 'open', topic: 'stereometry', subtopic: 'ster-polyhedra', diff: 5,
text: R`$ABCA_1B_1C_1$ — правильная треугольная призма, у которой $AB=5$, $AA_1=5$. Точки $P$ и $Q$ — середины рёбер $AB$ и $A_1C_1$ соответственно. Найдите значение выражения $\dfrac{36}{\cos^{2}\varphi}$, где $\varphi$ — угол между прямыми $PQ$ и $AB_1$.`,
answer: '160',
sol: R`В координатах $\vec{PQ}=\left(-1{,}25;\tfrac{5\sqrt3}{4};5\right)$, $\vec{AB_1}=(5;0;5)$. Тогда $\cos^{2}\varphi=\dfrac{(\vec{PQ}\cdot\vec{AB_1})^{2}}{|\vec{PQ}|^{2}\,|\vec{AB_1}|^{2}}=\dfrac{18{,}75^{2}}{31{,}25\cdot50}=0{,}225$, и $\dfrac{36}{\cos^{2}\varphi}=160$.` },
{ idx: 30, type: 'open', topic: 'equations', subtopic: 'eq-logarithmic', diff: 5,
text: R`Найдите сумму квадратов корней (корень, если он единственный) уравнения $\log_{18}(17-x)^{2}=2-2\log_{18}x$.`,
answer: '577',
sol: R`ОДЗ: $x>0$, $x\ne17$. Уравнение приводится к $\log_{18}\bigl(x\,|17-x|\bigr)=1$, то есть $x\,|17-x|=18$. При $x<17$: $x^{2}-17x+18=0$ (корни $p,q$ с $p+q=17$, $pq=18$); при $x>17$: $x=18$. Сумма квадратов $(17^{2}-2\cdot18)+18^{2}=253+324=577$.` },
{ idx: 31, type: 'open', topic: 'numbers', subtopic: 'num-divisibility', diff: 5,
text: R`Найдите все пары $(m,n)$ целых чисел, связанных соотношением $m^{2}+2m=n^{2}-6n+13$. Пусть $k$ — количество таких пар, $m_0$ — наименьшее из значений $m$. Найдите значение выражения $k\cdot m_0$.`,
answer: '-16',
sol: R`Равенство приводится к $(m+1)^{2}-(n-3)^{2}=5$. Полагая $a=m+1$, $b=n-3$, имеем $(a-b)(a+b)=5$; целые решения дают пары $(m;n)$: $(2;5),(2;1),(-4;1),(-4;5)$. Значит $k=4$, $m_0=-4$, и $k\cdot m_0=-16$.` },
{ idx: 32, type: 'open', topic: 'stereometry', subtopic: 'ster-rotation', diff: 5,
text: R`$ABCDA_1B_1C_1D_1$ — куб, длина ребра которого равна $4\sqrt6$. Сфера проходит через его вершины $B$ и $D_1$ и середины рёбер $BB_1$ и $CC_1$. Найдите площадь сферы $S$ и в ответ запишите значение выражения $\dfrac{S}{\pi}$.`,
answer: '336',
sol: R`В координатах с ребром $a$ центр сферы — $\left(\tfrac{a}{4};\tfrac{a}{2};\tfrac{a}{4}\right)$, а $R^{2}=\tfrac{7a^{2}}{8}$. При $a=4\sqrt6$ ($a^{2}=96$) получаем $R^{2}=84$, $S=4\pi R^{2}=336\pi$ и $\dfrac{S}{\pi}=336$.` },
];
/* ── Сборка solution_html ────────────────────────────────────────────────── */
function ansShowOf(t) {
if (t.ansShow != null) return t.ansShow;
if (t.type === 'mc') return `${t.answer})`;
return `$${t.answer}$`;
}
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 !== N_TASKS) problems.push(`Ожидалось ${N_TASKS} заданий, получено ${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 > N_TASKS) problems.push(`task_idx вне 1..${N_TASKS}: ${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_ct2020_v1 (${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), '\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 ответов пройдены (${N_TASKS}/${N_TASKS}).`);
/* ── APPLY: upsert ─────────────────────────────────────────────────────────── */
if (!APPLY) {
console.log('\nDRY-RUN: ничего не записано. Для записи: node backend/scripts/seed_ctmath_ct2020_v1.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 → «Варианты» → «ЦТ-2020».\n`);
} catch (e) {
db.exec('ROLLBACK');
console.error('\n✗ Ошибка записи, откат транзакции:', e.message);
process.exitCode = 1;
}
db.close();