Files
Learn_System/backend/scripts/seed_ctmath_ct2016_v1.js
T
Maxim Dolgolyov c86d5b9ad4 feat(ctmath): вариант 113 — ЦТ-2016 (30 заданий)
Пробник ЦТ по математике 2016, Вариант 1 (А1–А18 + В1–В12) для трека exam-prep ctmath.
Источник: чистый PDF ЦТ 2016.pdf. ВСЕ 30 ответов решены и сверены с официальной таблицей
(стр.35, столбец Вариант 1) — полное совпадение, включая B5=-22, B9=712, B11=56, B12=724.
Фигурные задания (А2 угол через MN||BC, А3 числа на прямой, А6 таблица, А7 площадь по
координатам, А8 область значений, А11 круговая диаграмма) реконструированы/адаптированы
в самодостаточные авто-проверяемые формы. VARIANT_LABEL 113 -> 'ЦТ-2016'.
DRY-RUN 30/30, self-check и структурный KaTeX — зелёные.
Запись в БД — пользователь: node backend/scripts/seed_ctmath_ct2016_v1.js --apply

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

385 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_ct2016_v1.js
Чистый вариант-пробник для трека exam-prep `ctmath`.
Источник: Централизованное тестирование (ЦТ) по математике, 2016, Вариант 1.
Формат: Часть А = А1–А18 (закрытые, 5 вариантов), Часть В = В1–В12 (открытые).
Всего 30 заданий. Перенабрано вручную в KaTeX по PDF:
F:\!Рабочие\ЦТ\Математика\Математика\ЦТ-ЦЭ\ЦТ 2016.pdf (10 вариантов, табл. ответов стр.35).
⚠️ Ответы решены самостоятельно и СВЕРЕНЫ с официальной таблицей ответов
(стр. 35, столбец «Вариант 1»): ВСЕ 30 совпали, включая B5=-22, B9=712, B11=56,
B12=724. variant=113 (после ЦТ-2015 = 112).
Адаптации/реконструкции заданий-«с-картинкой» (смысл/ответ сохранены, авто-проверка):
• А2 (∠ по рисунку треугольника) → та же задача с явным условием $MN\parallel BC$
(даёт официальный ответ $33^\circ$);
• А3 (числа $0,k,t$ на прямой) → явно $0<k<t$, выбор верного неравенства;
• А6 (значение по таблице) → таблица перенесена в figure_html;
• А7 (площадь фигуры на сетке) → площадь многоугольника по заданным координатам
вершин (формула шнуровки), $S=35{,}5$ см²;
• А8 (целые значения функции по графику) → область значений задана отрезком $[-4;6]$;
• А11 (круговая диаграмма) → градусные меры секторов даны в тексте.
Идемпотентность: upsert по UNIQUE(exam_key, variant, task_idx).
Запуск:
node backend/scripts/seed_ctmath_ct2016_v1.js # DRY-RUN (по умолчанию)
node backend/scripts/seed_ctmath_ct2016_v1.js --apply # запись в БД
⚠️ Массовую запись в БД запускает ПОЛЬЗОВАТЕЛЬ вручную. Без --apply ничего не пишется.
─────────────────────────────────────────────────────────────────────────── */
const { DatabaseSync } = require('node:sqlite');
const path = require('path');
const APPLY = process.argv.includes('--apply');
const EXAM = 'ctmath';
const VARIANT = 113;
const PROV = 'ЦТ–2016, Вариант 1';
const R = String.raw;
const L = ['а', 'б', 'в', 'г', 'д'];
const mc = (...html) => html.map((h, i) => [L[i], h]);
const TD = 'style="border:1px solid #99a;padding:3px 12px"';
/* ── 30 заданий ─────────────────────────────────────────────────────────── */
const TASKS = [
// ── Часть A: А1–А18 ──────────────────────────────────────────────────────
{ idx: 1, type: 'mc', topic: 'numbers', subtopic: 'num-divisibility', diff: 1,
text: R`Определите наименьшее натуральное число, кратное $2$, которое при делении на $15$ даёт неполное частное, равное $3$.`,
opts: mc('$44$', '$50$', '$48$', '$18$', '$46$'),
answer: 'д',
sol: R`Число имеет вид $15\cdot3+r=45+r$, где $0\le r<15$. Наименьшее чётное получается при $r=1$: это $46$.`,
ref: 'Герасимов «Математика, 5 кл.», ч. 1, гл. 3' },
{ idx: 2, type: 'mc', topic: 'planimetry', subtopic: 'plan-triangles', diff: 2,
text: R`В треугольнике $ABC$ точки $M$ и $N$ лежат на сторонах $AB$ и $AC$ соответственно, причём $MN\parallel BC$. Известно, что $\angle ACB=38^\circ$ и $\angle AMN=109^\circ$. Найдите градусную меру угла $BAC$.`,
opts: mc('$33^\circ$', '$52^\circ$', '$26^\circ$', '$30^\circ$', '$60^\circ$'),
answer: 'а',
sol: R`Так как $MN\parallel BC$, то $\angle ABC=\angle AMN=109^\circ$ (соответственные углы). Тогда $\angle BAC=180^\circ-\angle ABC-\angle ACB=180^\circ-109^\circ-38^\circ=33^\circ$.`,
ref: 'Казаков «Геометрия, 7 кл.», гл. 3' },
{ idx: 3, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 1,
text: R`На координатной прямой отмечены числа $0$, $k$, $t$, причём $0<k<t$. Укажите верное утверждение.`,
opts: mc('$-3k<-3t$', '$\dfrac1t>\dfrac1k$', '$3k>3t$', '$\dfrac{k}{-3}>\dfrac{t}{-3}$', '$k>t$'),
answer: 'г',
sol: R`При делении неравенства $k<t$ на отрицательное число $-3$ знак меняется: $\dfrac{k}{-3}>\dfrac{t}{-3}$. Остальные утверждения неверны.`,
ref: 'Арефьева «Алгебра, 8 кл.», гл. 1' },
{ idx: 4, type: 'mc', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 2,
text: R`Значение выражения $3^{-5}:\left(5\tfrac25\right)^{-3}$ равно:`,
opts: mc('$\dfrac{27}{125}$', '$\dfrac{4}{5}$', '$\dfrac{125}{81}$', '$\dfrac{81}{125}$', '$\dfrac{125}{243}$'),
answer: 'г',
sol: R`$5\tfrac25=\dfrac{27}{5}$. Тогда $3^{-5}:\left(\dfrac{27}{5}\right)^{-3}=3^{-5}\cdot\dfrac{3^{9}}{5^{3}}=\dfrac{3^{4}}{5^{3}}=\dfrac{81}{125}$.`,
ref: 'Арефьева «Алгебра, 7 кл.», гл. 1, § 4' },
{ idx: 5, type: 'mc', topic: 'word-sequences', subtopic: 'seq-progressions', diff: 1,
text: R`Укажите формулу $n$-го члена арифметической прогрессии $(a_n)$, если $a_1=2$, $a_2=5$.`,
opts: mc('$a_n=-3n+5$', '$a_n=3n+5$', '$a_n=3n-1$', '$a_n=2n+5$', '$a_n=5n+2$'),
answer: 'в',
sol: R`$d=a_2-a_1=3$, поэтому $a_n=a_1+(n-1)d=2+3(n-1)=3n-1$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 4' },
{ idx: 6, type: 'mc', topic: 'word-sequences', subtopic: 'word-problems', diff: 1,
text: R`Величины $a$ и $b$ прямо пропорциональны. Используя данные таблицы, найдите неизвестное значение величины $a$.`,
fig: R`<table class="task-fig" style="border-collapse:collapse;margin:6px 0"><tr><td ${TD}><i>a</i></td><td ${TD}></td><td ${TD}>1,9</td></tr><tr><td ${TD}><i>b</i></td><td ${TD}>108</td><td ${TD}>7,6</td></tr></table>`,
opts: mc('$32$', '$27$', '$22$', '$14$', '$56$'),
answer: 'б',
sol: R`При прямой пропорциональности $\dfrac{a}{b}$ постоянно: $\dfrac{a}{108}=\dfrac{1{,}9}{7{,}6}=0{,}25$, откуда $a=27$.`,
ref: 'Герасимов «Математика, 6 кл.», гл. 2' },
{ idx: 7, type: 'mc', topic: 'planimetry', subtopic: 'plan-quadrilaterals', diff: 2,
text: R`Найдите площадь (в см²) многоугольника с вершинами $A(2;2)$, $B(9;2)$, $C(9;7)$, $D(3;7)$, $E(2;8)$ (координаты — в сантиметрах).`,
opts: mc('$35{,}5$', '$28$', '$36$', '$49$', '$35$'),
answer: 'а',
sol: R`По формуле площади многоугольника по координатам вершин (формула шнуровки) $2S=\bigl|{-}14+45+42+10-12\bigr|=71$, поэтому $S=35{,}5$ см².`,
ref: 'Казаков «Геометрия, 8 кл.», гл. 4' },
{ idx: 8, type: 'mc', topic: 'functions', subtopic: 'fn-properties', diff: 2,
text: R`Областью значений функции $y=f(x)$ на промежутке $(-5;5)$ является отрезок $[-4;6]$. Найдите сумму всех целых значений, которые принимает функция.`,
opts: mc('$12$', '$14$', '$7$', '$10$', '$11$'),
answer: 'д',
sol: R`Функция принимает все целые значения от $-4$ до $6$. Их сумма $-4-3-2-1+0+1+2+3+4+5+6=11$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 2' },
{ idx: 9, type: 'mc', topic: 'numbers', subtopic: 'num-divisibility', diff: 1,
text: R`Найдите значение выражения НОК$(12;18;36)$ + НОД$(39;52)$.`,
opts: mc('$26$', '$50$', '$48$', '$72$', '$49$'),
answer: 'д',
sol: R`НОК$(12;18;36)=36$, НОД$(39;52)=13$. Сумма $36+13=49$.`,
ref: 'Герасимов «Математика, 6 кл.», гл. 1' },
{ idx: 10, type: 'mc', topic: 'stereometry', subtopic: 'ster-angles-distances', diff: 2,
text: R`Прямая $a$ пересекает плоскость $\alpha$ в точке $A$ и образует с плоскостью угол $60^\circ$. Точка $B$ лежит на прямой $a$, причём $AB=6\sqrt2$. Найдите расстояние от точки $B$ до плоскости $\alpha$.`,
opts: mc('$3\sqrt2$', '$3\sqrt6$', '$3\sqrt3$', '$6\sqrt6$', '$6\sqrt3$'),
answer: 'б',
sol: R`Расстояние от $B$ до плоскости равно $AB\sin60^\circ=6\sqrt2\cdot\dfrac{\sqrt3}{2}=3\sqrt6$.`,
ref: 'Латотин «Геометрия, 10 кл.», разд. 3' },
{ idx: 11, type: 'mc', topic: 'word-sequences', subtopic: 'word-problems', diff: 2,
text: R`На круговой диаграмме распределения посевных площадей секторам отвечают: ячмень — $63^\circ$, пшеница — $108^\circ$, гречиха — $36^\circ$, рожь — $18^\circ$, остальное — овёс. Сколько гектаров отведено под гречиху, если овсом засеяно на $390$ га больше, чем рожью?`,
opts: mc('$110$ га', '$150$ га', '$120$ га', '$160$ га', '$180$ га'),
answer: 'в',
sol: R`Овёс: $360^\circ-63^\circ-108^\circ-36^\circ-18^\circ=135^\circ$. Разность «овёс минус рожь» $=135^\circ-18^\circ=117^\circ$ отвечает $390$ га, поэтому $1^\circ\to\dfrac{390}{117}=\dfrac{10}{3}$ га. Гречиха: $36^\circ\cdot\dfrac{10}{3}=120$ га.`,
ref: 'Герасимов «Математика, 6 кл.», гл. 2' },
{ idx: 12, type: 'mc', topic: 'planimetry', subtopic: 'plan-triangles', diff: 2,
text: R`Длины всех сторон треугольника — целые числа. Если длина одной стороны равна $1$, а другой — $3$, то периметр треугольника равен:`,
opts: mc('$7$', '$14$', '$21$', '$6$', '$8$'),
answer: 'а',
sol: R`По неравенству треугольника третья сторона $c$ удовлетворяет $|3-1|<c<3+1$, то есть $2<c<4$, целое $c=3$. Периметр $1+3+3=7$.`,
ref: 'Казаков «Геометрия, 7 кл.», гл. 3' },
{ idx: 13, type: 'mc', topic: 'expressions', subtopic: 'expr-fractions', diff: 2,
text: R`Сократите дробь $\dfrac{x^{2}-9}{8x^{2}-23x-3}$.`,
opts: mc('$\dfrac{x-3}{8x+1}$', '$\dfrac{x+3}{8x-1}$', '$\dfrac{x+3}{x+1}$', '$\dfrac{x+3}{8x+1}$', '$\dfrac{x-3}{8x-1}$'),
answer: 'г',
sol: R`$8x^{2}-23x-3=(x-3)(8x+1)$, поэтому $\dfrac{(x-3)(x+3)}{(x-3)(8x+1)}=\dfrac{x+3}{8x+1}$.`,
ref: 'Арефьева «Алгебра, 8 кл.», гл. 1' },
{ idx: 14, type: 'mc', topic: 'word-sequences', subtopic: 'word-problems', diff: 2,
text: R`Из пунктов $A$ и $B$, расстояние между которыми $160$ км, одновременно навстречу друг другу выехали два автомобиля с постоянными скоростями: из $A$ — со скоростью $a$ км/ч, из $B$ — со скоростью $b$ км/ч. Составьте выражение для расстояния (в километрах) от пункта $A$ до места встречи.`,
opts: mc('$\dfrac{160a}{a+b}$', '$\dfrac{160}{a+b}$', '$\dfrac{160(a+b)}{a}$', '$\dfrac{160b}{a+b}$', '$\dfrac{160(a+b)}{b}$'),
answer: 'а',
sol: R`Время до встречи $t=\dfrac{160}{a+b}$. Расстояние от $A$: $a\cdot t=\dfrac{160a}{a+b}$.`,
ref: 'Арефьева «Алгебра, 7 кл.», гл. 3' },
{ idx: 15, type: 'mc', topic: 'stereometry', subtopic: 'ster-rotation', diff: 3,
text: R`Точки $A,B,C$ лежат на большой окружности сферы так, что треугольник $ABC$ равносторонний. Если $AB=3\sqrt6$, то площадь сферы равна:`,
opts: mc('$144\pi$', '$72\pi$', '$36\pi$', '$18\pi$', '$68\pi$'),
answer: 'б',
sol: R`Сторона равностороннего треугольника, вписанного в окружность радиуса $R$ (это радиус сферы), равна $R\sqrt3$. Из $3\sqrt6=R\sqrt3$ следует $R=3\sqrt2$, $R^{2}=18$. Площадь сферы $4\pi R^{2}=72\pi$.`,
ref: 'Латотин «Геометрия, 11 кл.», разд. 3' },
{ idx: 16, type: 'mc', topic: 'trigonometry', subtopic: 'trig-identities', diff: 2,
text: R`Упростите выражение $5\cos(7\pi+\alpha)+\sin\left(\dfrac{11\pi}{2}-\alpha\right)$.`,
opts: mc('$6\cos\alpha$', '$-6\cos\alpha$', '$-4\cos\alpha$', '$4\cos\alpha$', '$6\sin\alpha$'),
answer: 'б',
sol: R`$\cos(7\pi+\alpha)=\cos(\pi+\alpha)=-\cos\alpha$; $\ \sin\left(\dfrac{11\pi}{2}-\alpha\right)=\sin\left(\dfrac{3\pi}{2}-\alpha\right)=-\cos\alpha$. Сумма $5(-\cos\alpha)+(-\cos\alpha)=-6\cos\alpha$.`,
ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 10' },
{ idx: 17, type: 'mc', topic: 'functions', subtopic: 'fn-properties', diff: 2,
text: R`График функции, заданной формулой $y=kx+b$, симметричен относительно начала координат и проходит через точку $A(2;10)$. Значение выражения $k+b$ равно:`,
opts: mc('$-8$', '$2$', '$5$', '$10$', '$12$'),
answer: 'в',
sol: R`Симметрия относительно начала координат означает нечётность функции, поэтому $b=0$. Тогда $y=kx$, и из $10=2k$ получаем $k=5$. Значит $k+b=5$.`,
ref: 'Арефьева «Алгебра, 8 кл.», гл. 3' },
{ idx: 18, type: 'mc', topic: 'equations', subtopic: 'eq-rational', diff: 3,
text: R`Сумма всех натуральных решений неравенства $(6-x)\cdot(x+4)^{8}\cdot(x-13)^{2}\ge0$ равна:`,
opts: mc('$11$', '$19$', '$21$', '$34$', '$36$'),
answer: 'г',
sol: R`Множители $(x+4)^{8}\ge0$ и $(x-13)^{2}\ge0$, поэтому знак выражения определяет $(6-x)$. Неравенство выполнено при $x\le6$, а также при $x=13$ (там левая часть равна $0$). Натуральные решения $1,2,3,4,5,6,13$; их сумма $34$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 3' },
// ── Часть B: В1–В12 ──────────────────────────────────────────────────────
{ idx: 19, type: 'open', topic: 'word-sequences', subtopic: 'word-problems', diff: 3,
text: R`Для покраски стен общей площадью $175$ м² планируется закупка краски. Банка объёмом $2{,}5$ л стоит $75\,000$ рублей, банка объёмом $10$ л — $270\,000$ рублей. Какую минимальную сумму (в рублях) потратят на покупку необходимого количества краски, если её расход составляет $0{,}2$ л/м²?`,
answer: '960000',
sol: R`Нужно $175\cdot0{,}2=35$ л краски. Литр в банке $10$ л дешевле ($27\,000$ против $30\,000$). Минимум даёт набор $3$ банки по $10$ л и $2$ банки по $2{,}5$ л: $30+5=35$ л за $3\cdot270\,000+2\cdot75\,000=960\,000$ рублей.`,
ref: 'Арефьева «Алгебра, 7 кл.», гл. 3' },
{ idx: 20, type: 'open', topic: 'equations', subtopic: 'eq-irrational', diff: 3,
text: R`Найдите сумму корней (корень, если он единственный) уравнения $2x\cdot\sqrt{7x+18}=x^{2}+7x+18$.`,
answer: '9',
sol: R`Пусть $u=\sqrt{7x+18}\ge0$, тогда $u^{2}=7x+18$ и уравнение примет вид $x^{2}-2xu+u^{2}=0$, то есть $(x-u)^{2}=0$, $x=u$. Значит $x=\sqrt{7x+18}$, $x^{2}-7x-18=0$, $x=9$ (корень $-2$ не подходит, так как $x\ge0$).`,
ref: 'Арефьева «Алгебра, 10 кл.», гл. 2, § 17' },
{ idx: 21, type: 'open', topic: 'planimetry', subtopic: 'plan-quadrilaterals', diff: 4,
text: R`В равнобедренную трапецию, площадь которой равна $36\tfrac18$, вписана окружность. Сумма двух углов трапеции равна $60^\circ$. Найдите периметр трапеции.`,
answer: '34',
sol: R`Два равных угла при большем основании дают $60^\circ$, значит острый угол равен $30^\circ$. Для описанной около окружности трапеции $a+b=2l$ (сумма оснований равна сумме боковых сторон). Высота $h=l\sin30^\circ=\dfrac{l}{2}$, площадь $S=\dfrac12(a+b)h=\dfrac{l^{2}}{2}=\dfrac{289}{8}$, откуда $l=\dfrac{17}{2}$. Периметр $a+b+2l=4l=34$.`,
ref: 'Казаков «Геометрия, 8 кл.», гл. 4' },
{ idx: 22, type: 'open', topic: 'equations', subtopic: 'eq-rational', diff: 2,
text: R`Пусть $(x;y)$ — решение системы уравнений $\begin{cases}5x-y=5,\\ 5x^{2}-xy+x=12.\end{cases}$ Найдите значение выражения $5y-x$.`,
answer: '23',
sol: R`Из первого уравнения $y=5x-5$. Подставив во второе: $5x^{2}-x(5x-5)+x=12$, то есть $6x=12$, $x=2$, $y=5$. Тогда $5y-x=25-2=23$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 1' },
{ idx: 23, type: 'open', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 3,
text: R`Найдите значение выражения $2\cdot\left(\sqrt[3]{5\sqrt5}-\sqrt[3]{6\sqrt6}\right):\left(\sqrt5+\sqrt6\right)-4\sqrt{30}$.`,
answer: '-22',
sol: R`$\sqrt[3]{5\sqrt5}=\sqrt5$ и $\sqrt[3]{6\sqrt6}=\sqrt6$. Тогда $\dfrac{2(\sqrt5-\sqrt6)}{\sqrt5+\sqrt6}=\dfrac{2(\sqrt5-\sqrt6)^{2}}{5-6}=-2(11-2\sqrt{30})=-22+4\sqrt{30}$. Вычитая $4\sqrt{30}$, получаем $-22$.`,
ref: 'Арефьева «Алгебра, 10 кл.», гл. 1' },
{ idx: 24, type: 'open', topic: 'equations', subtopic: 'eq-exponential', diff: 3,
text: R`Найдите сумму корней уравнения $(x-81)\cdot\left(9^{x}+8\cdot3^{x+1}-81\right)=0$.`,
answer: '82',
sol: R`Первый множитель даёт $x=81$. Во втором при $t=3^{x}$: $9^{x}+24\cdot3^{x}-81=t^{2}+24t-81=0$, $t=3$ (корень $t=-27$ отброшен), откуда $3^{x}=3$, $x=1$. Сумма корней $81+1=82$.`,
ref: 'Арефьева «Алгебра, 11 кл.», гл. 2' },
{ idx: 25, type: 'open', topic: 'stereometry', subtopic: 'ster-polyhedra', diff: 4,
text: R`Найдите площадь боковой поверхности правильной треугольной пирамиды, если длина биссектрисы её основания равна $4\sqrt3$, а плоский угол при вершине равен $2\operatorname{arctg}\dfrac45$.`,
answer: '60',
sol: R`Биссектриса (она же медиана) равностороннего основания равна $\dfrac{a\sqrt3}{2}=4\sqrt3$, откуда $a=8$. В боковой грани половина угла при вершине $\beta=\operatorname{arctg}\dfrac45$, и $\operatorname{tg}\beta=\dfrac{a/2}{l}=\dfrac45$, поэтому апофема $l=5$. Площадь грани $\dfrac12\cdot8\cdot5=20$, боковая поверхность $3\cdot20=60$.`,
ref: 'Латотин «Геометрия, 11 кл.», разд. 1' },
{ idx: 26, type: 'open', topic: 'equations', subtopic: 'eq-logarithmic', diff: 4,
text: R`Найдите сумму наименьшего и наибольшего целых решений неравенства $\log_{1/15}\bigl(\log_{2}\log_{9}(x+15)\bigr)>0$.`,
answer: '60',
sol: R`Основание $\dfrac{1}{15}<1$, поэтому $0<\log_{2}\log_{9}(x+15)<1$, откуда $1<\log_{9}(x+15)<2$, то есть $9<x+15<81$, $-6<x<66$. Целые решения от $-5$ до $65$; их наименьшее и наибольшее в сумме дают $-5+65=60$.`,
ref: 'Арефьева «Алгебра, 11 кл.», гл. 3' },
{ idx: 27, type: 'open', topic: 'trigonometry', subtopic: 'trig-equations', diff: 4,
text: R`Найдите (в градусах) сумму корней уравнения $10\sin5x\cos5x+5\sin10x\cos18x=0$ на промежутке $(110^\circ;170^\circ)$.`,
answer: '712',
sol: R`$10\sin5x\cos5x=5\sin10x$, поэтому $5\sin10x(1+\cos18x)=0$. Из $\sin10x=0$: $x=18^\circ k$ — корни $126^\circ,144^\circ,162^\circ$. Из $\cos18x=-1$: $x=10^\circ+20^\circ k$ — корни $130^\circ,150^\circ$. Сумма $126+144+162+130+150=712$.`,
ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 8' },
{ idx: 28, type: 'open', topic: 'equations', subtopic: 'eq-rational', diff: 4,
text: R`Найдите произведение наименьшего и наибольшего целых решений неравенства $|15-2x-x^{2}|+4<4\cdot|3-x|+|x+5|$.`,
answer: '-24',
sol: R`Так как $|15-2x-x^{2}|=|x+5|\cdot|x-3|$, неравенство равносильно $(|x+5|-4)(|x-3|-1)<0$, его решение — $(-9;-1)\cup(2;4)$. Целые решения $-8,-7,\ldots,-2$ и $3$; произведение наименьшего и наибольшего $(-8)\cdot3=-24$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 3' },
{ idx: 29, type: 'open', topic: 'planimetry', subtopic: 'plan-triangles', diff: 5,
text: R`Точка $A$ движется по периметру треугольника $KMP$. Точки $K_1,M_1,P_1$ лежат на медианах треугольника $KMP$ и делят их в отношении $11:3$, считая от вершин. По периметру треугольника $K_1M_1P_1$ движется точка $B$ со скоростью, в пять раз большей скорости точки $A$. Сколько раз точка $B$ обойдёт периметр треугольника $K_1M_1P_1$ за то время, за которое точка $A$ дважды обойдёт периметр треугольника $KMP$?`,
answer: '56',
sol: R`Точки на медианах в отношении $11:3$ от вершин дают треугольник $K_1M_1P_1$, подобный $KMP$ с коэффициентом $\dfrac{5}{28}$ (например, $\vec{K_1M_1}=\dfrac{5}{28}\vec{KM}$). За два обхода $A$ (путь $2P$) точка $B$ проходит $5\cdot2P=10P$, что составляет $\dfrac{10P}{(5/28)P}=56$ обходов.`,
ref: 'Казаков «Геометрия, 9 кл.», гл. 2' },
{ idx: 30, type: 'open', topic: 'stereometry', subtopic: 'ster-polyhedra', diff: 5,
text: R`Объём прямоугольного параллелепипеда $ABCDA_1B_1C_1D_1$ равен $1728$. Точка $P$ лежит на боковом ребре $CC_1$ так, что $CP:PC_1=2:1$. Через точку $P$, вершину $D$ и середину бокового ребра $AA_1$ проведена секущая плоскость, делящая параллелепипед на две части. Найдите объём меньшей из частей.`,
answer: '724',
sol: R`В единичных долях рёбер ($u,v,w\in[0;1]$) секущая плоскость задаётся уравнением $-\dfrac{2u}{3}+\dfrac{v}{2}+w=\dfrac12$. Объём части, где $w$ больше плоскости, равен $\dfrac{181}{432}$ объёма параллелепипеда — это меньше половины. Значит меньшая часть $=\dfrac{181}{432}\cdot1728=181\cdot4=724$.`,
ref: 'Латотин «Геометрия, 11 кл.», разд. 1' },
];
/* ── Сборка 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 !== 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_ct2016_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 ответов пройдены (30/30).');
/* ── APPLY: upsert ─────────────────────────────────────────────────────────── */
if (!APPLY) {
console.log('\nDRY-RUN: ничего не записано. Для записи: node backend/scripts/seed_ctmath_ct2016_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 → «Варианты» → «ЦТ-2016».\n`);
} catch (e) {
db.exec('ROLLBACK');
console.error('\n✗ Ошибка записи, откат транзакции:', e.message);
process.exitCode = 1;
}
db.close();