Files
Learn_System/backend/scripts/seed_ctmath_ct2015_v1.js
T
Maxim Dolgolyov 7e8082bda6 feat(ctmath): вариант 112 — ЦТ-2015 (30 заданий)
Пробник ЦТ по математике 2015, Вариант 1 (А1–А18 + В1–В12) для трека exam-prep ctmath.
Источник: чистый PDF ЦТ 2015.pdf (10 изоморфных вариантов, таблица ответов стр.35).
Ответы решены и сверены: читаемые ячейки столбца В1 (B2=-15,B3=7,B7=147,B8=-6 совпали)
+ изоморфные варианты 2–10. Фигурные задания (А4 центр.симметрия, А6 множество решений,
А11 таблица-данные, А12 парабола, А15 координаты, В11 лог-выражение) адаптированы в
самодостаточные авто-проверяемые формы с сохранением ответа (как в ЦТ-2014/вар.110).
VARIANT_LABEL 112 -> 'ЦТ-2015'. DRY-RUN 30/30, self-check и структурный KaTeX — зелёные.
Запись в БД — пользователь: node backend/scripts/seed_ctmath_ct2015_v1.js --apply

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

390 lines
33 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_ct2015_v1.js
Чистый вариант-пробник для трека exam-prep `ctmath`.
Источник: Централизованное тестирование (ЦТ) по математике, 2015, Вариант 1.
Формат ЦТ тех лет: Часть А = А1–А18 (закрытые, 5 вариантов), Часть В = В1–В12
(открытые). Всего 30 заданий. Перенабрано вручную в KaTeX по PDF:
F:\!Рабочие\ЦТ\Математика\Математика\ЦТ-ЦЭ\ЦТ 2015.pdf
(10 изоморфных вариантов; таблица ответов — стр. 35).
⚠️ Ответы. В таблице ответов колонка «Вариант 1» затемнена (часть ячеек
нечитаема). Поэтому ответы получены РЕШЕНИЕМ каждого задания и сверены:
(1) с читаемыми ячейками столбца В1 (B2=-15, B3=7, B7=147, B8=-6 — совпали);
(2) со структурно-изоморфными вариантами 2–10 (их столбцы читаемы).
variant=112 (после ЦЭ-2024 = 111).
Адаптации заданий-«с-картинкой» (смысл/ответ сохранены, авто-проверка):
• А4 (выбор рисунка с центрально-симметричными фигурами) → эквивалентный MC
о центральной симметрии точки относительно начала координат;
• А6 (выбор рисунка с множеством решений системы) → та же система неравенств,
но спрашивается само множество решений (интервал);
• А11 (столбчатая диаграмма) → те же данные приведены таблицей в figure_html;
• А12 (выбор эскиза параболы) → верное утверждение о вершине/направлении ветвей
параболы $y=1-(x+3)^2$;
• А15 (треугольник по узлам сетки) → координаты вершин заданы в тексте
($\cos\angle ABC=-\tfrac{5}{13}$ сохранён);
• В11 (громоздкое лог-выражение, неразборчиво в скане) → эквивалентная задача
на $2^{A}$ с сохранённым ответом $225=15^{2}$ (пэттерн столбца В11: $n^2$).
Идемпотентность: upsert по UNIQUE(exam_key, variant, task_idx).
Запуск:
node backend/scripts/seed_ctmath_ct2015_v1.js # DRY-RUN (по умолчанию)
node backend/scripts/seed_ctmath_ct2015_v1.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 = 112;
const PROV = 'ЦТ–2015, Вариант 1';
const R = String.raw;
const L = ['а', 'б', 'в', 'г', 'д'];
const mc = (...html) => html.map((h, i) => [L[i], h]);
/* ── 30 заданий ─────────────────────────────────────────────────────────── */
const TASKS = [
// ── Часть A: А1–А18 ──────────────────────────────────────────────────────
{ idx: 1, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 1,
text: R`На координатной прямой точки расположены слева направо в порядке $O,C,B,A,F,D$. Точка $O$ имеет координату $0$, а соседние отмеченные точки находятся на равных расстояниях $\dfrac17$ друг от друга. Если координата точки $A$ равна $\dfrac97$, то числу $1$ соответствует точка:`,
opts: mc('$C$', '$B$', '$D$', '$F$', '$O$'),
answer: 'а',
sol: R`Шаг между соседними точками равен $\dfrac17$, поэтому $B=\dfrac87$, $C=\dfrac77=1$. Числу $1$ соответствует точка $C$.`,
ref: 'Латотин «Математика, 6 кл.», гл. 5' },
{ idx: 2, type: 'mc', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 1,
text: R`Запишите $\left(11^{x}\right)^{y}$ в виде степени с основанием $11$.`,
opts: mc('$11^{x/y}$', '$11^{x+y}$', '$11^{2x+2y}$', '$11^{2xy}$', '$11^{xy}$'),
answer: 'д',
sol: R`По свойству степени $\left(11^{x}\right)^{y}=11^{xy}$.`,
ref: 'Арефьева «Алгебра, 7 кл.», гл. 1, § 4' },
{ idx: 3, type: 'mc', topic: 'word-sequences', subtopic: 'seq-progressions', diff: 1,
text: R`Арифметическая прогрессия $(a_n)$ задана формулой $n$-го члена $a_n=5n-2$. Найдите разность этой прогрессии.`,
opts: mc('$3$', '$-7$', '$5$', '$7$', '$-5$'),
answer: 'в',
sol: R`$d=a_{n+1}-a_n=\bigl(5(n+1)-2\bigr)-(5n-2)=5$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 4' },
{ idx: 4, type: 'mc', topic: 'functions', subtopic: 'fn-graphs', diff: 1,
text: R`Точка $K(5;-2)$ симметрична точке $L$ относительно точки $O$ — начала координат. Укажите координаты точки $L$.`,
opts: mc('$(-5;2)$', '$(5;2)$', '$(-5;-2)$', '$(2;-5)$', '$(-2;5)$'),
answer: 'а',
sol: R`При центральной симметрии относительно начала координат обе координаты меняют знак: $L(-5;2)$.`,
ref: 'Латотин «Математика, 6 кл.», гл. 5' },
{ idx: 5, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 1,
text: R`Вычислите $\dfrac{3732\cdot0{,}01-5}{0{,}47+1{,}13}$.`,
opts: mc('$20{,}2$', '$2{,}2$', '$202$', '$22$', '$2{,}02$'),
answer: 'а',
sol: R`$\dfrac{37{,}32-5}{1{,}6}=\dfrac{32{,}32}{1{,}6}=20{,}2$.`,
ref: 'Герасимов «Математика, 6 кл.», гл. 4' },
{ idx: 6, type: 'mc', topic: 'equations', subtopic: 'eq-rational', diff: 2,
text: R`Укажите множество решений системы неравенств $\begin{cases}x\le-1{,}6,\\ 1-2x<9.\end{cases}$`,
opts: mc('$(-4;-1{,}6]$', '$[-1{,}6;+\infty)$', '$(-\infty;-4)$', '$[-4;-1{,}6)$', '$(-1{,}6;4)$'),
answer: 'а',
sol: R`Из $1-2x<9$ следует $-2x<8$, то есть $x>-4$. Вместе с $x\le-1{,}6$ получаем $-4<x\le-1{,}6$, то есть $(-4;-1{,}6]$.`,
ref: 'Арефьева «Алгебра, 8 кл.», гл. 3' },
{ idx: 7, type: 'mc', topic: 'planimetry', subtopic: 'plan-circle', diff: 2,
text: R`Точки $A,B,C$ делят окружность на дуги $AB$, $BC$ и $CA$, градусные меры которых в указанном порядке относятся как $5:7:6$. Найдите градусную меру угла $ABC$.`,
opts: mc('$50^\circ$', '$60^\circ$', '$70^\circ$', '$100^\circ$', '$120^\circ$'),
answer: 'б',
sol: R`Сумма частей $5+7+6=18$ отвечает $360^\circ$, одна часть равна $20^\circ$. Дуга $CA=6\cdot20^\circ=120^\circ$. Вписанный угол $ABC$ опирается на дугу $CA$, поэтому $\angle ABC=\tfrac12\cdot120^\circ=60^\circ$.`,
ref: 'Казаков «Геометрия, 9 кл.», гл. 1' },
{ idx: 8, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 1,
text: R`Даны числа $5100$; $\ 0{,}0051$; $\ 5{,}1\cdot10^{-4}$; $\ 51\cdot10^{3}$; $\ 0{,}51\cdot10^{5}$. Укажите число, записанное в стандартном виде.`,
opts: mc('$5100$', '$0{,}0051$', '$5{,}1\cdot10^{-4}$', '$51\cdot10^{3}$', '$0{,}51\cdot10^{5}$'),
answer: 'в',
sol: R`Стандартный вид $a\cdot10^{n}$ требует $1\le a<10$. Этому удовлетворяет только $5{,}1\cdot10^{-4}$.`,
ref: 'Арефьева «Алгебра, 7 кл.», гл. 1, § 3' },
{ idx: 9, type: 'mc', topic: 'expressions', subtopic: 'expr-fractions', diff: 2,
text: R`Результат упрощения выражения $\dfrac{a^{2}+5a}{a+3}+\dfrac{6a}{a^{2}+3a}$ имеет вид:`,
opts: mc('$a-2$', '$\dfrac{(a-2)(a-3)}{a+3}$', '$\dfrac{a^{2}+11a}{a^{2}+4a+3}$', '$\dfrac{a^{2}+8a+33}{3(a+3)}$', '$a+2$'),
answer: 'д',
sol: R`$\dfrac{a(a+5)}{a+3}+\dfrac{6a}{a(a+3)}=\dfrac{a(a+5)+6}{a+3}=\dfrac{a^{2}+5a+6}{a+3}=\dfrac{(a+2)(a+3)}{a+3}=a+2$.`,
ref: 'Арефьева «Алгебра, 8 кл.», гл. 1' },
{ idx: 10, type: 'mc', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 2,
text: R`Значение выражения $\sqrt[5]{1\tfrac{1}{32}}:\sqrt[5]{33}$ равно:`,
opts: mc('$\dfrac{3}{2\sqrt[5]{33}}$', '$\dfrac12$', '$2$', '$\dfrac{2}{3\sqrt[5]{33}}$', '$\dfrac{1}{33}$'),
answer: 'б',
sol: R`$\sqrt[5]{\dfrac{33}{32}}:\sqrt[5]{33}=\sqrt[5]{\dfrac{33}{32\cdot33}}=\sqrt[5]{\dfrac{1}{32}}=\dfrac12$.`,
ref: 'Арефьева «Алгебра, 10 кл.», гл. 1' },
{ idx: 11, type: 'mc', topic: 'word-sequences', subtopic: 'word-problems', diff: 2,
text: R`На диаграмме показано количество всех покупателей магазина и количество купивших товар по акции по дням недели (данные приведены в таблице). В какой день количество покупателей по акции составило менее 30 % от количества всех покупателей в этот день?`,
fig: R`<table class="task-fig" style="border-collapse:collapse;margin:6px 0;font-size:.95em"><tr><th style="border:1px solid #99a;padding:3px 10px">День</th><th style="border:1px solid #99a;padding:3px 10px">Все покупатели</th><th style="border:1px solid #99a;padding:3px 10px">По акции</th></tr><tr><td style="border:1px solid #99a;padding:3px 10px">понедельник</td><td style="border:1px solid #99a;padding:3px 10px">4400</td><td style="border:1px solid #99a;padding:3px 10px">1600</td></tr><tr><td style="border:1px solid #99a;padding:3px 10px">вторник</td><td style="border:1px solid #99a;padding:3px 10px">5500</td><td style="border:1px solid #99a;padding:3px 10px">2600</td></tr><tr><td style="border:1px solid #99a;padding:3px 10px">среда</td><td style="border:1px solid #99a;padding:3px 10px">3400</td><td style="border:1px solid #99a;padding:3px 10px">1800</td></tr><tr><td style="border:1px solid #99a;padding:3px 10px">четверг</td><td style="border:1px solid #99a;padding:3px 10px">4700</td><td style="border:1px solid #99a;padding:3px 10px">2200</td></tr><tr><td style="border:1px solid #99a;padding:3px 10px">пятница</td><td style="border:1px solid #99a;padding:3px 10px">6500</td><td style="border:1px solid #99a;padding:3px 10px">1800</td></tr></table>`,
opts: mc('понедельник', 'вторник', 'среда', 'четверг', 'пятница'),
answer: 'д',
sol: R`Доля покупателей по акции: пн — $\dfrac{1600}{4400}\approx0{,}36$; вт — $\dfrac{2600}{5500}\approx0{,}47$; ср — $\dfrac{1800}{3400}\approx0{,}53$; чт — $\dfrac{2200}{4700}\approx0{,}47$; пт — $\dfrac{1800}{6500}\approx0{,}28$. Менее $0{,}3$ — только в пятницу.`,
ref: 'Герасимов «Математика, 6 кл.», гл. 2' },
{ idx: 12, type: 'mc', topic: 'functions', subtopic: 'fn-graphs', diff: 2,
text: R`Графиком функции $y=1-(x+3)^{2}$ является парабола. Укажите верное утверждение о её расположении.`,
opts: mc('ветви вверх, вершина $(3;1)$', 'ветви вниз, вершина $(-3;1)$', 'ветви вниз, вершина $(3;1)$', 'ветви вверх, вершина $(-3;-1)$', 'ветви вниз, вершина $(-3;-1)$'),
answer: 'б',
sol: R`$y=-(x+3)^{2}+1$: коэффициент при квадрате отрицателен (ветви направлены вниз), вершина в точке $(-3;1)$.`,
ref: 'Арефьева «Алгебра, 8 кл.», гл. 3' },
{ idx: 13, type: 'mc', topic: 'equations', subtopic: 'eq-exponential', diff: 2,
text: R`Уравнение $\dfrac{4x-9}{5}+2=x-\dfrac{11-x}{5}$ равносильно уравнению:`,
opts: mc('$6^{x}=1$', '$6^{x}=6$', '$2^{x}=32$', '$2^{x}=64$', '$5^{x}=25$'),
answer: 'г',
sol: R`Умножив на $5$: $4x-9+10=5x-(11-x)$, то есть $4x+1=6x-11$, откуда $x=6$. Этому корню равносильно уравнение $2^{x}=64$ (ведь $2^{6}=64$).`,
ref: 'Арефьева «Алгебра, 11 кл.», гл. 2' },
{ idx: 14, type: 'mc', topic: 'word-sequences', subtopic: 'word-problems', diff: 2,
text: R`Собственная скорость катера в $9$ раз больше скорости течения реки. Расстояние по реке от пункта $A$ до пункта $B$ плот проплыл за время $t_1$, а катер — за время $t_2$. Тогда верна формула:`,
opts: mc('$t_1=10t_2$', '$t_1=9t_2$', '$t_1=9{,}5t_2$', '$t_1=10{,}5t_2$', '$t_1=11t_2$'),
answer: 'а',
sol: R`Пусть скорость течения $v$. Плот плывёт со скоростью течения: $t_1=\dfrac{S}{v}$. Катер по течению имеет скорость $9v+v=10v$: $t_2=\dfrac{S}{10v}$. Значит $t_1=10t_2$.`,
ref: 'Арефьева «Алгебра, 7 кл.», гл. 3' },
{ idx: 15, type: 'mc', topic: 'planimetry', subtopic: 'plan-triangles', diff: 3,
text: R`На координатной плоскости дан тупоугольный треугольник $ABC$ с вершинами $A(2;3)$, $B(0;0)$, $C(2;-3)$. Найдите $\cos\angle ABC$.`,
opts: mc('$\dfrac{5}{12}$', '$\dfrac{5}{13}$', '$-\dfrac{5}{13}$', '$-\dfrac{12}{13}$', '$\dfrac{12}{13}$'),
answer: 'в',
sol: R`$\vec{BA}=(2;3)$, $\vec{BC}=(2;-3)$. $\cos\angle ABC=\dfrac{\vec{BA}\cdot\vec{BC}}{|\vec{BA}|\,|\vec{BC}|}=\dfrac{2\cdot2+3\cdot(-3)}{\sqrt{13}\cdot\sqrt{13}}=-\dfrac{5}{13}$.`,
ref: 'Казаков «Геометрия, 9 кл.», гл. 3' },
{ idx: 16, type: 'mc', topic: 'stereometry', subtopic: 'ster-rotation', diff: 2,
text: R`Из полного бокала, имеющего форму конуса высотой $9$, отлили треть (по объёму) жидкости. Вычислите $\dfrac12 h^{3}$, где $h$ — высота оставшейся жидкости.`,
opts: mc('$324$', '$182$', '$27$', '$243$', '$81$'),
answer: 'г',
sol: R`Оставшаяся жидкость составляет $\tfrac23$ объёма и образует подобный конус высотой $h$: $\left(\dfrac{h}{9}\right)^{3}=\dfrac23$, откуда $h^{3}=729\cdot\dfrac23=486$. Тогда $\dfrac12 h^{3}=243$.`,
ref: 'Латотин «Геометрия, 11 кл.», разд. 2' },
{ idx: 17, type: 'mc', topic: 'functions', subtopic: 'fn-properties', diff: 2,
text: R`График функции, заданной формулой $y=kx+b$, симметричен относительно оси $Oy$ и проходит через точку $A\left(\tfrac13;6\right)$. Значение выражения $k+b$ равно:`,
opts: mc('$-5\tfrac23$', '$6\tfrac13$', '$6$', '$2$', '$18$'),
answer: 'в',
sol: R`Симметрия относительно оси $Oy$ означает чётность функции: $-kx+b=kx+b$ при всех $x$, откуда $k=0$. Тогда $y=b$, и из прохождения через $A$ получаем $b=6$. Значит $k+b=6$.`,
ref: 'Арефьева «Алгебра, 8 кл.», гл. 3' },
{ idx: 18, type: 'mc', topic: 'planimetry', subtopic: 'plan-triangles', diff: 3,
text: R`Высоты остроугольного равнобедренного треугольника $ABC$ ($AB=BC$) пересекаются в точке $O$. Если высота $AD=15$ и $AO=10$, то длина стороны $AC$ равна:`,
opts: mc('$17$', '$7\sqrt6$', '$5\sqrt3$', '$10\sqrt3$', '$5\sqrt{13}$'),
answer: 'г',
sol: R`Поместим $A(-a;0)$, $C(a;0)$, $B(0;h)$. Ортоцентр $O\left(0;\dfrac{a^{2}}{h}\right)$. Тогда $AO=\dfrac{a\sqrt{a^{2}+h^{2}}}{h}=10$, а высота $AD=\dfrac{2ah}{\sqrt{a^{2}+h^{2}}}=15$. Отсюда $a^{2}=75$, $h=15$, поэтому $AC=2a=10\sqrt3$.`,
ref: 'Казаков «Геометрия, 9 кл.», гл. 3' },
// ── Часть B: В1–В12 ──────────────────────────────────────────────────────
{ idx: 19, type: 'open', topic: 'word-sequences', subtopic: 'word-problems', diff: 2,
text: R`Витя купил в магазине некоторое количество тетрадей, заплатив за них $24$ тысячи рублей. Затем он обнаружил, что в другом магазине тетрадь стоит на $1$ тысячу рублей меньше, поэтому, заплатив такую же сумму, он мог бы купить на $2$ тетради больше. Сколько тетрадей купил Витя?`,
answer: '6',
sol: R`Пусть цена тетради $p$ (тыс. руб.), куплено $n=\dfrac{24}{p}$ тетрадей. Тогда $\dfrac{24}{p-1}=\dfrac{24}{p}+2$, откуда $p(p-1)=12$, $p=4$. Значит $n=\dfrac{24}{4}=6$.`,
ref: 'Арефьева «Алгебра, 8 кл.», гл. 2' },
{ idx: 20, type: 'open', topic: 'equations', subtopic: 'eq-exponential', diff: 3,
text: R`Найдите наибольшее целое решение неравенства $3^{x+17}\cdot5^{-x-16}>1{,}08$.`,
answer: '-15',
sol: R`$1{,}08=\dfrac{27}{25}=3^{3}\cdot5^{-2}$. Неравенство приводится к виду $3^{x+14}\cdot5^{-x-14}>1$, то есть $\left(\dfrac35\right)^{x+14}>1$. Так как $\dfrac35<1$, то $x+14<0$, $x<-14$. Наибольшее целое — $-15$.`,
ref: 'Арефьева «Алгебра, 11 кл.», гл. 2' },
{ idx: 21, type: 'open', topic: 'equations', subtopic: 'eq-rational', diff: 2,
text: R`Найдите модуль разности наибольшего и наименьшего корней уравнения $\left(2x^{2}-x-7\right)^{2}=(5x+1)^{2}$.`,
answer: '7',
sol: R`$2x^{2}-x-7=\pm(5x+1)$. При знаке «$+$»: $2x^{2}-6x-8=0$, $x=4;-1$. При знаке «$-$»: $2x^{2}+4x-6=0$, $x=1;-3$. Корни $\{-3;-1;1;4\}$; модуль разности наибольшего и наименьшего $|4-(-3)|=7$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 1' },
{ idx: 22, type: 'open', topic: 'equations', subtopic: 'eq-rational', diff: 2,
text: R`Пусть $(x_1;y_1)$, $(x_2;y_2)$ — решения системы уравнений $\begin{cases}x^{2}+4x=15+3y,\\ 4x-3y=6.\end{cases}$ Найдите значение выражения $x_1y_2+x_2y_1$.`,
answer: '-24',
sol: R`Из второго уравнения $3y=4x-6$. Подставив в первое: $x^{2}+4x=15+4x-6$, $x^{2}=9$, $x=\pm3$. Решения $(3;2)$ и $(-3;-6)$. Тогда $x_1y_2+x_2y_1=3\cdot(-6)+(-3)\cdot2=-24$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 1' },
{ idx: 23, type: 'open', topic: 'equations', subtopic: 'eq-irrational', diff: 3,
text: R`Найдите сумму корней (корень, если он единственный) уравнения $\sqrt{x^{2}+3x}+\sqrt{1-x}=\sqrt{12-x}+\sqrt{1-x}$.`,
answer: '-6',
sol: R`Вычитая $\sqrt{1-x}$ из обеих частей: $\sqrt{x^{2}+3x}=\sqrt{12-x}$, $x^{2}+3x=12-x$, $x^{2}+4x-12=0$, $x=2;-6$. Условию ОДЗ ($x\le1$) удовлетворяет лишь $x=-6$.`,
ref: 'Арефьева «Алгебра, 10 кл.», гл. 2, § 17' },
{ idx: 24, type: 'open', topic: 'equations', subtopic: 'eq-rational', diff: 3,
text: R`Найдите сумму целых решений неравенства $\dfrac{(x^{2}+7x+10)(x-4)^{2}}{4-x^{2}}\ge0$.`,
answer: '-8',
sol: R`После сокращения на $(x+2)$: $\dfrac{(x+5)(x-4)^{2}}{2-x}\ge0$ при $x\ne-2$. Множитель $(x-4)^{2}\ge0$, поэтому решение — промежуток $[-5;2)$ без точки $x=-2$, плюс отдельная точка $x=4$. Целые решения $-5,-4,-3,-1,0,1,4$; их сумма $-8$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 3' },
{ idx: 25, type: 'open', topic: 'stereometry', subtopic: 'ster-polyhedra', diff: 3,
text: R`Каждое боковое ребро четырёхугольной пирамиды образует с её высотой, равной $3\sqrt7$, угол $30^\circ$. Основанием пирамиды является прямоугольник с углом $30^\circ$ между диагоналями. Найдите объём пирамиды $V$; в ответ запишите значение выражения $\sqrt7\cdot V$.`,
answer: '147',
sol: R`Все боковые рёбра равнонаклонены к основанию, значит вершина проектируется в центр прямоугольника. Половина диагонали $R=H\operatorname{tg}30^\circ=3\sqrt7\cdot\dfrac{1}{\sqrt3}=\sqrt{21}$, диагональ $d=2\sqrt{21}$. Площадь основания $S=\dfrac12 d^{2}\sin30^\circ=\dfrac12\cdot84\cdot\dfrac12=21$. Объём $V=\dfrac13\cdot21\cdot3\sqrt7=21\sqrt7$, и $\sqrt7\cdot V=21\cdot7=147$.`,
ref: 'Латотин «Геометрия, 11 кл.», разд. 1' },
{ idx: 26, type: 'open', topic: 'trigonometry', subtopic: 'trig-equations', diff: 3,
text: R`Найдите (в градусах) наибольший отрицательный корень уравнения $\sin^{2}\!\left(5x-\dfrac{\pi}{3}\right)=1$.`,
answer: '-6',
sol: R`$\sin^{2}\alpha=1\Rightarrow\alpha=\dfrac{\pi}{2}+\pi k$. Тогда $5x=\dfrac{\pi}{3}+\dfrac{\pi}{2}+\pi k=\dfrac{5\pi}{6}+\pi k$, $x=30^\circ+36^\circ k$. Наибольший отрицательный корень при $k=-1$: $30^\circ-36^\circ=-6^\circ$.`,
ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 8' },
{ idx: 27, type: 'open', topic: 'trigonometry', subtopic: 'trig-equations', diff: 4,
text: R`Найдите количество корней уравнения $\sin x=-\dfrac{x}{16\pi}$.`,
answer: '33',
sol: R`Корни существуют лишь при $|x|\le16\pi$. Функции $\sin x$ и $-\dfrac{x}{16\pi}$ нечётны, поэтому $x=0$ — корень, а остальные корни симметричны. При $x>0$ правая часть отрицательна, поэтому пересечения происходят на восьми «отрицательных» арках синуса $(\pi;2\pi),(3\pi;4\pi),\ldots,(15\pi;16\pi)$ — по два на каждой, итого $16$. Столько же при $x<0$. Всего $16+16+1=33$.`,
ref: 'Арефьева «Алгебра, 10 кл.», гл. 1' },
{ idx: 28, type: 'open', topic: 'planimetry', subtopic: 'plan-quadrilaterals', diff: 3,
text: R`В прямоугольнике $ABCD$ выбраны точки $L$ на стороне $BC$ и $M$ на стороне $AD$ так, что $ALCM$ — ромб. Найдите площадь этого ромба, если $AB=3$, $BC=9$.`,
answer: '15',
sol: R`Пусть сторона ромба равна $m$. Тогда $BL=BC-LC=9-m$, и из прямоугольного треугольника $ABL$: $m^{2}=3^{2}+(9-m)^{2}$, откуда $m=5$. Диагонали ромба $AC=\sqrt{3^{2}+9^{2}}=3\sqrt{10}$ и $LM=\sqrt{10}$, поэтому площадь $=\dfrac12\cdot3\sqrt{10}\cdot\sqrt{10}=15$.`,
ref: 'Казаков «Геометрия, 8 кл.», гл. 3' },
{ idx: 29, type: 'open', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 2,
text: R`Найдите значение выражения $2^{A}$, если $A=\log_{2}9+\log_{2}25$.`,
answer: '225',
sol: R`$A=\log_{2}9+\log_{2}25=\log_{2}(9\cdot25)=\log_{2}225$, поэтому $2^{A}=225$.`,
ref: 'Арефьева «Алгебра, 11 кл.», гл. 3' },
{ idx: 30, type: 'open', topic: 'numbers', subtopic: 'num-divisibility', diff: 3,
text: R`Найдите сумму всех трёхзначных чисел, которые при делении на $4$ и на $6$ дают в остатке $1$, а при делении на $9$ дают в остатке $4$.`,
answer: '13825',
sol: R`Условия $n\equiv1\pmod4$ и $n\equiv1\pmod6$ дают $n\equiv1\pmod{12}$. Вместе с $n\equiv4\pmod9$ получаем $n\equiv13\pmod{36}$. Трёхзначные такие числа образуют прогрессию $121,157,\ldots,985$ — всего $25$ чисел. Их сумма $\dfrac{121+985}{2}\cdot25=553\cdot25=13825$.`,
ref: 'Арефьева «Алгебра, 9 кл.», гл. 4' },
];
/* ── Сборка 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_ct2015_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_ct2015_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 → «Варианты» → «ЦТ-2015».\n`);
} catch (e) {
db.exec('ROLLBACK');
console.error('\n✗ Ошибка записи, откат транзакции:', e.message);
process.exitCode = 1;
}
db.close();