Files
Learn_System/backend/scripts/seed_ctmath_ct2016_v1.js
T
Maxim Dolgolyov fec638135f chore(ctmath): убрать упоминания сторонних авторов из ссылок-учебников
Поле ref в решениях задач (показывается ученику как «Учебник: …») содержало фамилии
авторов чужих учебников (Арефьева, Казаков, Латотин, Герасимов). Заменено на обобщённые
ссылки нашего курса: «Алгебра, 7 класс, гл. 1» и т.п. (фамилии и кавычки-ёлочки убраны).
452 замены в 15 seed_ctmath_*.js. Синтаксис OK, валидация 30/30.
Применённые варианты (112,113) обновятся при повторном --apply (upsert solution_html).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 11:33:25 +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();