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
+201
View File
@@ -0,0 +1,201 @@
VARIANTS[37] = {
label: "Вариант 37",
tasks: [
{
text: `Какое из данных равенств является верным, если $f(x) = \\dfrac{6}{x}$:`,
opts: [
["а", "$f(2) = 2$"], ["б", "$f(2) = 3$"], ["в", "$f(2) = 12$"],
["г", "$f(2) = 4$"], ["д", "$f(2) = 36$"],
],
sol: `Подставляем $x=2$:
$$f(2) = \\dfrac{6}{2} = 3$$
<div class="sol-ans">Ответ: б)&ensp;$f(2)=3$</div>`
},
{
text: `Значение выражения $\\sqrt{\\dfrac{25}{16}} - \\dfrac{1}{4}$ равно:`,
opts: [
["а", "$\\dfrac{1}{4}$"], ["б", "$\\sqrt{\\dfrac{21}{16}}$"], ["в", "$\\sqrt{\\dfrac{29}{16}}$"],
["г", "$1$"], ["д", "$\\dfrac{3}{2}$"],
],
sol: `$$\\sqrt{\\dfrac{25}{16}} = \\dfrac{\\sqrt{25}}{\\sqrt{16}} = \\dfrac{5}{4}$$
$$\\dfrac{5}{4} - \\dfrac{1}{4} = \\dfrac{4}{4} = 1$$
<div class="sol-ans">Ответ: г)&ensp;$1$</div>`
},
{
text: `Какое из следующих утверждений <b>НЕ</b> верно:`,
opts: [
["а", "если катет равен половине гипотенузы, то он лежит против угла в $30^{\\circ}$;"],
["б", "если в треугольнике $ABC$ $R$ — радиус описанной окружности, то $\\dfrac{AC}{\\sin B} = 2R$;"],
["в", "в любой квадрат можно вписать окружность;"],
["г", "сумма углов любого треугольника равна $360^{\\circ}$?"],
],
sol: `<ul>
<li>а) Катет $=$ половина гипотенузы ⟹ напротив угла $30°$ — <b>верно</b></li>
<li>б) Теорема синусов $\\dfrac{AC}{\\sin B}=2R$ — <b>верно</b></li>
<li>в) В любой квадрат вписывается окружность — <b>верно</b></li>
<li>г) «Сумма углов треугольника $= 360°$» — <b style="color:#dc2626">НЕВЕРНО</b>. Сумма углов любого треугольника равна $\\mathbf{180°}$.</li>
</ul>
<div class="sol-ans">Ответ: г)</div>`
},
{
text: `Раскройте скобки $-10 - (-5x - 12)$ и упростите полученное выражение.`,
sol: `Минус перед скобками меняет знак каждого слагаемого внутри:
$$-10 - (-5x - 12) = -10 + 5x + 12 = 5x + 2$$
<div class="sol-ans">Ответ: $5x+2$</div>`
},
{
text: `Решите неравенство $2x - 5 > 17$.
Определите количество целых чисел из второго десятка, которые являются решениями этого неравенства.`,
sol: `<b>Свойства линейного неравенства:</b> к обеим частям можно прибавлять одно и то же число, а также можно делить обе части на положительное число — знак неравенства не меняется.
<br><b>Шаг 1.</b> Прибавляем $5$ к обеим частям:
$$2x - 5 + 5 > 17 + 5 \\implies 2x > 22$$
<b>Шаг 2.</b> Делим обе части на $2$ (положительное число):
$$x > 11$$
<b>Шаг 3.</b> Второй десяток — это натуральные числа от $11$ до $20$ (числа $11,\\,12,\\,\\ldots,\\,20$).
<br>Решениями (т.е. $x > 11$ строго) являются те, что <em>больше</em> $11$:
$$12,\\,13,\\,14,\\,15,\\,16,\\,17,\\,18,\\,19,\\,20$$
Всего $9$ чисел.
<div class="sol-ans">Ответ: $x>11$;&ensp;целых из второго десятка — $9$</div>`
},
{
text: `Периметр ромба $ABCD$ равен $48$ см, острый угол $A$ ромба равен $60^{\\circ}$.
Найдите меньшую диагональ $BD$ ромба.`,
sol: `Сторона ромба:&ensp;$a = \\dfrac{48}{4} = 12$ см.
<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=12см, угол 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: от (42,165) до (31,146) — направление AB точно 60° -->
<path d="M 42 165 A 22 22 0 0 0 31 146" 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="36" y="106" font-size="12" fill="#334155">12</text>
<text x="152" y="106" font-size="12" fill="#334155">12</text>
<text x="133" y="56" font-size="12" fill="#334155">12</text>
<!-- Метка BD -->
<text x="97" y="120" font-size="13" fill="#dc2626" font-weight="bold">BD=12</text>
</svg>
<b>Ключевая идея.</b> В ромбе $ABCD$ рассмотрим треугольник $ABD$:
<ul>
<li>$AB = AD = 12$ см (стороны ромба)</li>
<li>$\\angle BAD = 60°$ (по условию)</li>
</ul>
Треугольник $ABD$ — <b>равнобедренный</b> с углом при вершине $60°$. Углы при основании равны $\\dfrac{180°-60°}{2}=60°$ — <b>все три угла $= 60°$</b>, т.е. треугольник <b>равносторонний</b>.
<br>Значит, $BD = AB = 12$ см.
<div class="sol-ans">Ответ: $BD = 12$ см</div>`
},
{
text: `В арифметической прогрессии второй и девятый члены соответственно равны $3$ и $10$.
Чему равна сумма третьего и десятого членов этой прогрессии?`,
sol: `<b>Формула $n$-го члена арифметической прогрессии:</b> $a_n = a_1 + (n - 1)d$, где $a_1$ — первый член, $d$ — разность прогрессии.
<br>Из этой формулы следует: $a_m - a_k = (m - k)\\cdot d$ для любых номеров $m$, $k$.
<br><b>Шаг 1.</b> Находим разность $d$.
<br>Между $a_2$ и $a_9$$9 - 2 = 7$ шагов:
$$a_9 - a_2 = 7d \\implies 10 - 3 = 7d \\implies 7d = 7 \\implies d = 1$$
<b>Шаг 2.</b> Находим $a_3$ и $a_{10}$.
<br>$a_3 = a_2 + d = 3 + 1 = 4$ (следующий член = предыдущий $+\\,d$).
<br>$a_{10} = a_9 + d = 10 + 1 = 11$.
<br><b>Шаг 3.</b> Складываем:
$$a_3 + a_{10} = 4 + 11 = 15$$
<div class="sol-ans">Ответ: $15$</div>`
},
{
text: `Двое сотрудников производственной лаборатории Слуцкого сыродельного комбината
$6$ дней обрабатывали результаты измерений.
За какое время может выполнить эту работу первый работник, работая отдельно,
если он за $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> вместе за $6$ дней выполнили всю работу ($=1$):
$$6(r_1 + r_2) = 1 \\implies 6\\left(r_1 + \\dfrac{2}{3}r_1\\right) = 1$$
$$6\\cdot\\dfrac{5r_1}{3} = 1 \\implies 10r_1 = 1 \\implies r_1 = \\dfrac{1}{10}$$
Первый работник один выполнит работу за время $\\dfrac{1}{r_1} = 10$ дней.
<div class="sol-ans">Ответ: $10$ дней</div>`
},
{
text: `Окружности с радиусами $4$ см и $9$ см касаются внешним образом.
Найдите отрезок общей внешней касательной, заключённый между точками касания.`,
sol: `<b>$O_1O_2 = R+r = 9+4 = 13$ см</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">
<!-- O1=(78,118), R=54. O2=(156,118), r=24. Tangent T1=(99,68), T2=(165,96). H=(90,90) -->
<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"/>
<circle cx="132" cy="118" r="2.5" fill="#334155"/>
<!-- Метки -->
<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=9</text>
<text x="147" y="110" font-size="11" fill="#16a34a">r=4</text>
<text x="80" y="106" font-size="11" fill="#ca8a04">5</text>
<text x="121" y="98" font-size="11" fill="#ca8a04">12</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">9</text>
<text x="137" y="127" font-size="10" fill="#475569">4</text>
</svg>
<b>Ключевая идея:</b> опустим из $O_2$ перпендикуляр на прямую $O_1T_1$ — получим точку $H$.
<br>Тогда $O_2T_2T_1H$ — <b>прямоугольник</b>, значит $O_2H = T_1T_2$ (то, что ищем).
$$O_1H = O_1T_1 - T_1H = R - r = 9 - 4 = 5\\text{ см}$$
В прямоугольном $\\triangle O_1HO_2$ ($\\angle H = 90°$) — узнаём тройку <b>51213</b>:
$$O_1O_2^2 = O_1H^2 + O_2H^2 \\implies 13^2 = 5^2 + (T_1T_2)^2$$
$$169 = 25 + (T_1T_2)^2 \\implies (T_1T_2)^2 = 144 \\implies T_1T_2 = 12\\text{ см}$$
<div class="sol-ans">Ответ: $12$ см</div>`
},
{
text: `Определите знак выражения $8x_1 - x_2$, где $x_1$, $x_2$ — корни уравнения
$(6 + 2\\sqrt{5})\\,x^2 - 15x - (6 - 2\\sqrt{5}) = 0$ и $x_1 < x_2$.`,
sol: `<b>Шаг 1. Замена переменной.</b>
<br>Пусть $y = (6+2\\sqrt{5})\\,x$, тогда $x = \\dfrac{y}{6+2\\sqrt{5}}$. Подставляем в уравнение и умножаем на $(6+2\\sqrt{5})$:
$$y^2 - 15y - (6+2\\sqrt{5})(6-2\\sqrt{5}) = 0$$
По формуле разности квадратов: $(6+2\\sqrt{5})(6-2\\sqrt{5}) = 36 - 20 = 16$.
$$y^2 - 15y - 16 = 0$$
<b>Шаг 2. Решаем простое уравнение.</b>
$$D = 225 + 64 = 289 = 17^2 \\implies y = \\dfrac{15\\pm17}{2}$$
$$y_1 = -1, \\quad y_2 = 16$$
<b>Шаг 3. Возвращаемся к $x$.</b>&ensp;$x = \\dfrac{y}{6+2\\sqrt{5}}$.
<br>Так как $6+2\\sqrt{5} > 0$, знак $x$ совпадает со знаком $y$. Поэтому $x_1 < 0 < x_2$:
$$x_1 = \\dfrac{-1}{6+2\\sqrt{5}} = -\\dfrac{6-2\\sqrt{5}}{16} \\quad\\text{(домножили на сопряжённое)}$$
$$x_2 = \\dfrac{16}{6+2\\sqrt{5}} = \\dfrac{16(6-2\\sqrt{5})}{16} = 6-2\\sqrt{5}$$
<b>Шаг 4. Считаем $8x_1 - x_2$.</b>
$$8x_1 = 8\\cdot\\left(-\\dfrac{6-2\\sqrt{5}}{16}\\right) = -\\dfrac{6-2\\sqrt{5}}{2}$$
$$8x_1 - x_2 = -\\dfrac{6-2\\sqrt{5}}{2} - (6-2\\sqrt{5}) = -(6-2\\sqrt{5})\\left(\\dfrac{1}{2}+1\\right) = -\\dfrac{3(6-2\\sqrt{5})}{2}$$
Так как $6 > 2\\sqrt{5}$ (потому что $36 > 20$), значит $6-2\\sqrt{5} > 0$, и всё выражение <b>отрицательно</b>.
<div class="sol-ans">Ответ: $8x_1 - x_2 < 0$ (отрицательно)</div>`
},
]
};