feat: exam9 — Экзамен 9 класс по математике (80 вариантов)

Новый отдельный модуль /exam9 в стиле LearnSpace:
- 80 вариантов × 10 заданий = 800 задач с разбором (KaTeX + SVG)
- Сайдбар: пункт «Экзамен 9 класс» (clipboard-check)
- Feature flag: feature_exam9_enabled (мигр. 002)
- Видим всем авторизованным; рендер на стороне клиента
- Прогресс в localStorage: подсветка вариантов (done/partial)
- Возобновление последнего варианта при возврате

Структура:
  frontend/exam9.html              — страница (LearnSpace layout)
  frontend/js/exam9/app.js         — рендерер
  frontend/js/exam9/variants/      — 80 файлов с данными
  frontend/img/exam9/              — 22 PNG/JPG фигур заданий

Картинки путей _tmp/ → /img/exam9/ переписаны автоматически.

Все маршруты проверены: 200 OK на /exam9, /js/exam9/*, /img/exam9/*.
This commit is contained in:
Maxim Dolgolyov
2026-05-16 12:53:49 +03:00
parent ae31e4c4e8
commit 6cff327e88
107 changed files with 16507 additions and 0 deletions
+209
View File
@@ -0,0 +1,209 @@
VARIANTS[38] = {
label: "Вариант 38",
tasks: [
{
text: `Какое из данных равенств является верным, если $f(x) = \\dfrac{8}{x}$:`,
opts: [
["а", "$f(2) = 2$"], ["б", "$f(2) = 4$"], ["в", "$f(2) = 16$"],
["г", "$f(2) = 6$"], ["д", "$f(2) = 64$"],
],
sol: `Подставляем $x=2$:
$$f(2) = \\dfrac{8}{2} = 4$$
<div class="sol-ans">Ответ: б)&ensp;$f(2)=4$</div>`
},
{
text: `Значение выражения $\\sqrt{\\dfrac{9}{25}} - \\dfrac{1}{5}$ равно:`,
opts: [
["а", "$\\dfrac{3}{5}$"], ["б", "$\\sqrt{\\dfrac{14}{25}}$"], ["в", "$\\dfrac{4}{5}$"],
["г", "$1$"], ["д", "$\\dfrac{2}{5}$"],
],
sol: `$$\\sqrt{\\dfrac{9}{25}} = \\dfrac{\\sqrt{9}}{\\sqrt{25}} = \\dfrac{3}{5}$$
$$\\dfrac{3}{5} - \\dfrac{1}{5} = \\dfrac{2}{5}$$
<div class="sol-ans">Ответ: д)&ensp;$\\dfrac{2}{5}$</div>`
},
{
text: `Какое из следующих утверждений <b>НЕ</b> верно:`,
opts: [
["а", "если катет лежит против угла в $30^{\\circ}$, то он равен половине гипотенузы;"],
["б", "если в треугольнике $ABC$ $R$ — радиус описанной окружности, то $\\dfrac{BC}{\\sin A} = 2R$;"],
["в", "сумма углов любого четырёхугольника равна $180^{\\circ}$;"],
["г", "около любого квадрата можно описать окружность?"],
],
sol: `<ul>
<li>а) Катет напротив угла $30°$ равен половине гипотенузы — <b>верно</b></li>
<li>б) Теорема синусов $\\dfrac{BC}{\\sin A}=2R$ — <b>верно</b></li>
<li>в) «Сумма углов четырёхугольника $=180°$» — <b style="color:#dc2626">НЕВЕРНО</b>. Сумма углов любого четырёхугольника равна $360°$.</li>
<li>г) Около любого квадрата можно описать окружность — <b>верно</b></li>
</ul>
<div class="sol-ans">Ответ: в)</div>`
},
{
text: `Раскройте скобки $-4 - (5x + 3)$ и упростите полученное выражение.`,
sol: `Минус перед скобками меняет знак каждого слагаемого внутри:
$$-4 - (5x + 3) = -4 - 5x - 3 = -5x - 7$$
<div class="sol-ans">Ответ: $-5x-7$</div>`
},
{
text: `Решите неравенство $5 + 2x > 7$.
Определите количество целых чисел из первого десятка, которые являются решениями этого неравенства.`,
sol: `<b>Свойства линейного неравенства:</b> из обеих частей можно вычитать одно и то же число, а также делить обе части на положительное число — знак неравенства не меняется.
<br><b>Шаг 1.</b> Вычитаем $5$ из обеих частей:
$$5 + 2x - 5 > 7 - 5 \\implies 2x > 2$$
<b>Шаг 2.</b> Делим обе части на $2$ (положительное число):
$$x > 1$$
<b>Шаг 3.</b> Первый десяток — натуральные числа от $1$ до $10$ (числа $1,\\,2,\\,\\ldots,\\,10$).
<br>Решениями (т.е. $x > 1$ строго) являются те, что <em>больше</em> $1$:
$$2,\\,3,\\,4,\\,5,\\,6,\\,7,\\,8,\\,9,\\,10$$
Всего $9$ чисел.
<div class="sol-ans">Ответ: $x > 1$;&ensp;целых из первого десятка — $9$</div>`
},
{
text: `Меньшая диагональ $BD$ ромба $ABCD$ равна $10$ см, тупой угол $B$ ромба равен $120^{\\circ}$.
Найдите периметр ромба.`,
sol: `<svg viewBox="0 0 230 195" xmlns="http://www.w3.org/2000/svg" style="max-width:330px;width:100%;height:auto;display:block;margin:8px 0">
<!-- A=(20,165), B=(80,61), C=(200,61), D=(140,165) — сторона 120px=10см, угол A=60° -->
<polygon points="20,165 80,61 200,61 140,165" fill="rgba(37,99,235,0.07)" stroke="#334155" stroke-width="2"/>
<!-- Треугольник ABD (подсветка) -->
<polygon points="20,165 80,61 140,165" fill="rgba(220,38,38,0.13)" stroke="none"/>
<!-- Диагональ AC (пунктир) -->
<line x1="20" y1="165" x2="200" y2="61" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,3"/>
<!-- Диагональ BD — данная (красная) -->
<line x1="80" y1="61" x2="140" y2="165" stroke="#dc2626" stroke-width="2.5"/>
<!-- Дуга 60° при A -->
<path d="M 42 165 A 22 22 0 0 0 31 146" fill="none" stroke="#555" stroke-width="1.3"/>
<!-- Дуга 120° при B -->
<path d="M 102 61 A 22 22 0 0 1 91 80" fill="none" stroke="#555" stroke-width="1.3"/>
<text x="6" y="178" font-size="15" font-family="serif" font-style="italic">A</text>
<text x="73" y="55" font-size="15" font-family="serif" font-style="italic">B</text>
<text x="203" y="55" font-size="15" font-family="serif" font-style="italic">C</text>
<text x="143" y="180" font-size="15" font-family="serif" font-style="italic">D</text>
<text x="33" y="158" font-size="11" fill="#555">60°</text>
<text x="86" y="78" font-size="11" fill="#555">120°</text>
<!-- Метка BD -->
<text x="97" y="120" font-size="13" fill="#dc2626" font-weight="bold">BD=10</text>
</svg>
<b>Свойства ромба:</b>
<br>1) Все четыре стороны ромба равны.
<br>2) Диагонали ромба взаимно перпендикулярны и точкой пересечения делятся пополам.
<br>3) Диагонали ромба являются биссектрисами его углов.
<br><b>Шаг 1.</b> Обозначим точку пересечения диагоналей через $O$. По свойству диагоналей:
$$BO = \\dfrac{BD}{2} = \\dfrac{10}{2} = 5\\text{ см}$$
<b>Шаг 2.</b> Поскольку $BD$ — биссектриса тупого угла $B = 120°$:
$$\\angle OBC = \\dfrac{\\angle B}{2} = \\dfrac{120°}{2} = 60°$$
<b>Шаг 3.</b> Рассмотрим прямоугольный треугольник $OBC$ (прямой угол при $O$).
<br>По <b>определению косинуса:</b> $\\cos\\alpha = \\dfrac{\\text{прилежащий катет}}{\\text{гипотенуза}}$.
<br>Прилежащий к углу $B$ катет — $BO$, гипотенуза — $BC$:
$$\\cos 60° = \\dfrac{BO}{BC} \\implies \\dfrac{1}{2} = \\dfrac{5}{BC} \\implies BC = 10\\text{ см}$$
<b>Шаг 4.</b> Периметр ромба — это сумма всех сторон, а они равны:
$$P = 4\\cdot BC = 4\\cdot 10 = 40\\text{ см}$$
<div class="sol-ans">Ответ: $P = 40$ см</div>`
},
{
text: `В арифметической прогрессии третий и десятый члены соответственно равны $12$ и $-2$.
Чему равна сумма второго и одиннадцатого членов этой прогрессии?`,
sol: `<b>Формула $n$-го члена арифметической прогрессии:</b> $a_n = a_1 + (n - 1)d$.
<br>Из неё следует: $a_m - a_k = (m - k)\\cdot d$.
<br><b>Шаг 1.</b> Находим разность $d$.
<br>Между $a_3$ и $a_{10}$$10 - 3 = 7$ шагов:
$$a_{10} - a_3 = 7d \\implies -2 - 12 = 7d \\implies 7d = -14 \\implies d = -2$$
<b>Шаг 2.</b> Находим $a_2$ и $a_{11}$.
<br>$a_2 = a_3 - d = 12 - (-2) = 14$ (предыдущий член = следующий $-\\,d$).
<br>$a_{11} = a_{10} + d = -2 + (-2) = -4$.
<br><b>Шаг 3.</b> Складываем:
$$a_2 + a_{11} = 14 + (-4) = 10$$
<div class="sol-ans">Ответ: $10$</div>`
},
{
text: `Двое сотрудников по озеленению Национального историко-культурного
музея-заповедника «Несвиж» могут выполнить уборку части парка за $12$ дней.
За сколько дней, работая отдельно, выполнит эту работу первый сотрудник,
если он за $2$ дня выполняет такую же часть работы, какую второй выполняет за $3$ дня?`,
sol: `Пусть производительности (часть работы за день): первый — $r_1$, второй — $r_2$.
<br><b>Условие 1:</b> «первый за $2$ дня выполняет столько же, сколько второй за $3$»:
$$2r_1 = 3r_2 \\implies r_2 = \\dfrac{2}{3}r_1$$
<b>Условие 2:</b> вместе за $12$ дней выполнили всю работу ($=1$):
$$12(r_1 + r_2) = 1 \\implies 12\\left(r_1 + \\dfrac{2}{3}r_1\\right) = 1$$
$$12\\cdot\\dfrac{5r_1}{3} = 1 \\implies 20r_1 = 1 \\implies r_1 = \\dfrac{1}{20}$$
Первый сотрудник один выполнит работу за $\\dfrac{1}{r_1} = 20$ дней.
<div class="sol-ans">Ответ: $20$ дней</div>`
},
{
text: `Окружности с радиусами $9$ см и $16$ см касаются внешним образом.
Найдите отрезок общей внешней касательной, заключённый между точками касания.`,
sol: `<b>$O_1O_2 = R+r = 16+9 = 25$ см</b> (внешнее касание). Радиусы перпендикулярны касательной: $O_1T_1\\perp T_1T_2$ и $O_2T_2\\perp T_1T_2$, поэтому $O_1T_1\\parallel O_2T_2$.
<svg viewBox="0 0 230 180" xmlns="http://www.w3.org/2000/svg" style="max-width:360px;width:100%;height:auto;display:block;margin:10px 0">
<!-- Схематично: больший круг слева (R=16), меньший справа (r=9) -->
<circle cx="78" cy="118" r="54" fill="rgba(37,99,235,0.06)" stroke="#2563eb" stroke-width="1.8"/>
<circle cx="156" cy="118" r="24" fill="rgba(22,163,74,0.10)" stroke="#16a34a" stroke-width="1.8"/>
<!-- Прямоугольник O2-T2-T1-H подсветка -->
<polygon points="90,90 99,68 165,96 156,118" fill="rgba(234,179,8,0.15)" stroke="none"/>
<!-- Линия центров -->
<line x1="78" y1="118" x2="156" y2="118" stroke="#94a3b8" stroke-width="1.2" stroke-dasharray="4,3"/>
<!-- Касательная T1-T2 -->
<line x1="83" y1="57" x2="181" y2="102" stroke="#dc2626" stroke-width="2.2"/>
<!-- Радиусы O1T1, O2T2 (пунктир) -->
<line x1="78" y1="118" x2="99" y2="68" stroke="#2563eb" stroke-width="1.5" stroke-dasharray="3,2"/>
<line x1="156" y1="118" x2="165" y2="96" stroke="#16a34a" stroke-width="1.5" stroke-dasharray="3,2"/>
<!-- O2H (пунктир жёлтый) -->
<line x1="156" y1="118" x2="90" y2="90" stroke="#ca8a04" stroke-width="1.4" stroke-dasharray="4,2"/>
<!-- Прямые углы T1 и T2 -->
<polygon points="99,68 96,75 103,78 106,71" fill="rgba(0,0,0,0.08)" stroke="#334155" stroke-width="1.2"/>
<polygon points="165,96 162,103 169,106 172,99" fill="rgba(0,0,0,0.08)" stroke="#334155" stroke-width="1.2"/>
<!-- Прямой угол при H -->
<polygon points="90,90 96,73 103,76 97,93" fill="none" stroke="#ca8a04" stroke-width="1.1"/>
<!-- Точки -->
<circle cx="78" cy="118" r="3.5" fill="#2563eb"/>
<circle cx="156" cy="118" r="3.5" fill="#16a34a"/>
<circle cx="99" cy="68" r="3.5" fill="#dc2626"/>
<circle cx="165" cy="96" r="3.5" fill="#dc2626"/>
<circle cx="90" cy="90" r="3" fill="#ca8a04"/>
<!-- Метки -->
<text x="63" y="124" font-size="12" font-family="serif" font-style="italic" fill="#2563eb">O₁</text>
<text x="159" y="124" font-size="12" font-family="serif" font-style="italic" fill="#16a34a">O₂</text>
<text x="90" y="62" font-size="12" font-family="serif" font-style="italic" fill="#dc2626">T₁</text>
<text x="168" y="95" font-size="12" font-family="serif" font-style="italic" fill="#dc2626">T₂</text>
<text x="80" y="89" font-size="12" font-family="serif" font-style="italic" fill="#ca8a04">H</text>
<!-- Длины -->
<text x="80" y="95" font-size="11" fill="#2563eb">R=16</text>
<text x="147" y="110" font-size="11" fill="#16a34a">r=9</text>
<text x="80" y="106" font-size="11" fill="#ca8a04">7</text>
<text x="121" y="98" font-size="11" fill="#ca8a04">24</text>
<text x="118" y="64" font-size="12" fill="#dc2626" font-weight="bold">T₁T₂=?</text>
<text x="100" y="131" font-size="10" fill="#475569">16</text>
<text x="137" y="127" font-size="10" fill="#475569">9</text>
</svg>
<b>Опустим из $O_2$ перпендикуляр на прямую $O_1T_1$</b> — получим точку $H$.
<br>Тогда $O_2T_2T_1H$ — <b>прямоугольник</b>, значит $O_2H = T_1T_2$ (то, что ищем).
$$O_1H = O_1T_1 - T_1H = R - r = 16 - 9 = 7\\text{ см}$$
В прямоугольном $\\triangle O_1HO_2$ ($\\angle H = 90°$) — узнаём тройку <b>72425</b>:
$$O_1O_2^2 = O_1H^2 + O_2H^2 \\implies 25^2 = 7^2 + (T_1T_2)^2$$
$$625 = 49 + (T_1T_2)^2 \\implies (T_1T_2)^2 = 576 \\implies T_1T_2 = 24\\text{ см}$$
<div class="sol-ans">Ответ: $24$ см</div>`
},
{
text: `Определите знак выражения $\\dfrac{2}{9}x_1 - x_2$, где $x_1$, $x_2$ — корни уравнения
$(5 - 2\\sqrt{6})\\,x^2 - 10x + 9(5 + 2\\sqrt{6}) = 0$ и $x_1 \\gt x_2$.`,
sol: `<b>Формула разности квадратов:</b> $(a - b)(a + b) = a^2 - b^2$.
<br><b>Шаг 1. Подготовка.</b>
<br>Замечаем красивое равенство:
$$(5 - 2\\sqrt{6})(5 + 2\\sqrt{6}) = 5^2 - (2\\sqrt{6})^2 = 25 - 24 = 1$$
Числа $5 - 2\\sqrt{6}$ и $5 + 2\\sqrt{6}$ — <em>взаимно обратны</em>: $\\dfrac{1}{5 - 2\\sqrt{6}} = 5 + 2\\sqrt{6}$.
<br><b>Шаг 2. Замена переменной.</b>
<br>Сделаем замену $y = (5 - 2\\sqrt{6})\\,x$. Тогда $x = y\\cdot(5 + 2\\sqrt{6})$.
<br>Подставляем в исходное уравнение, помня, что $(5 - 2\\sqrt{6})\\cdot x^2 = \\dfrac{y^2}{5 - 2\\sqrt{6}} = y^2(5 + 2\\sqrt{6})$... Удобнее иначе: умножим обе части исходного уравнения на $(5 - 2\\sqrt{6})$. Учитывая, что $9(5 + 2\\sqrt{6})\\cdot(5 - 2\\sqrt{6}) = 9\\cdot 1 = 9$:
$$(5 - 2\\sqrt{6})^2 x^2 - 10(5 - 2\\sqrt{6})\\,x + 9 = 0$$
В переменной $y = (5 - 2\\sqrt{6})\\,x$ это:
$$y^2 - 10y + 9 = 0$$
<b>Шаг 3. Решаем по теореме Виета.</b>
<br>Корни уравнения $y^2 - 10y + 9 = 0$: ищем числа с суммой $10$ и произведением $9$. Это $1$ и $9$:
$$(y - 1)(y - 9) = 0 \\implies y_1 = 1,\\; y_2 = 9$$
<b>Шаг 4. Возвращаемся к $x$.</b>
<br>$x = y\\cdot(5 + 2\\sqrt{6})$, причём $5 + 2\\sqrt{6} \\gt 0$. По условию $x_1 \\gt x_2$, поэтому большему $y$ соответствует больший $x$:
$$x_1 = 9(5 + 2\\sqrt{6}), \\quad x_2 = 5 + 2\\sqrt{6}$$
<b>Шаг 5. Вычисляем $\\dfrac{2}{9}x_1 - x_2$.</b>
$$\\dfrac{2}{9}\\cdot 9(5 + 2\\sqrt{6}) - (5 + 2\\sqrt{6}) = 2(5 + 2\\sqrt{6}) - (5 + 2\\sqrt{6}) = 5 + 2\\sqrt{6}$$
Так как $5 \\gt 0$ и $2\\sqrt{6} \\gt 0$, то $5 + 2\\sqrt{6} \\gt 0$.
<div class="sol-ans">Ответ: $\\dfrac{2}{9}x_1 - x_2 \\gt 0$ (положительно)</div>`
},
]
};