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
+198
View File
@@ -0,0 +1,198 @@
VARIANTS[20] = {
label: "Вариант 20",
tasks: [
{
text: `Определите рисунок, на котором изображён график функции $y = (x-1)^2$:`,
figure: `<img src="/img/exam9/v20_t1.png" class="task-fig" />`,
sol: `Функция $y=(x-1)^2$ — это парабола $y=x^2$, сдвинутая на $1$ единицу <b>вправо</b>.
<ul>
<li>Вершина параболы: $(1;\\,0)$ — точка на оси $Ox$</li>
<li>$y$-пересечение: при $x=0$, $y=1$ — точка $(0;\\,1)$</li>
<li>Ветви параболы направлены <b>вверх</b></li>
<li>График симметричен относительно прямой $x=1$</li>
</ul>
На рисунке ищем параболу с вершиной в точке $(1;\\,0)$, ветви направлены вверх.
<div class="sol-ans">Ответ: рисунок с параболой, вершина которой в точке $(1;\\,0)$</div>`
},
{
text: `Какие из данных чисел являются решениями системы неравенств
$$\\left\\{\\begin{array}{l} a > -4, \\\\[4pt] a \\leq 3\\dfrac{1}{2}; \\end{array}\\right.$$`,
opts: [
["а", "$3$"], ["б", "$-4$"], ["в", "$0$"],
["г", "$4{,}5$"], ["д", "$-4{,}5$"],
],
sol: `Решение системы: $-4 < a \\leq 3{,}5$.
<svg viewBox="0 0 240 52" xmlns="http://www.w3.org/2000/svg" style="max-width:240px;width:100%;height:auto;display:block;margin:8px 0">
<defs><marker id="a20t2" viewBox="0 0 7 6" refX="7" refY="3" markerWidth="5" markerHeight="5" orient="auto"><path d="M0,0.5 L7,3 L0,5.5Z" fill="#555"/></marker></defs>
<line x1="8" y1="26" x2="228" y2="26" stroke="#bbb" stroke-width="1.2" marker-end="url(#a20t2)"/>
<line x1="40" y1="22" x2="40" y2="30" stroke="#777" stroke-width="1"/><text x="40" y="44" font-size="10" text-anchor="middle" fill="#555">4</text>
<line x1="100" y1="22" x2="100" y2="30" stroke="#777" stroke-width="1"/><text x="100" y="44" font-size="10" text-anchor="middle" fill="#555">0</text>
<line x1="175" y1="22" x2="175" y2="30" stroke="#777" stroke-width="1"/><text x="175" y="44" font-size="10" text-anchor="middle" fill="#555">3,5</text>
<line x1="40" y1="26" x2="175" y2="26" stroke="#2563eb" stroke-width="4" stroke-linecap="round" opacity="0.55"/>
<circle cx="40" cy="26" r="5" fill="white" stroke="#2563eb" stroke-width="2"/>
<circle cx="175" cy="26" r="5" fill="#2563eb"/>
</svg>
Проверяем каждое:
<ul>
<li>а) $3$: $-4 < 3 \\leq 3{,}5$ ✓</li>
<li>б) $-4$: условие $a>-4$ нарушено ✗</li>
<li>в) $0$: $-4 < 0 \\leq 3{,}5$ ✓</li>
<li>г) $4{,}5 > 3{,}5$ ✗</li>
<li>д) $-4{,}5 < -4$ ✗</li>
</ul>
<div class="sol-ans">Ответ: а) и в)</div>`
},
{
text: `Какое из следующих утверждений <b>НЕ</b> верно:`,
opts: [
["а", "диагонали равнобедренной трапеции точкой пересечения делятся пополам;"],
["б", "периметр квадрата со стороной $6$ см равен $24$ см;"],
["в", "если у четырёхугольника $ABCD$ $\\angle A + \\angle C = 180^{\\circ}$, то около него можно описать окружность;"],
["г", "если у $\\triangle ABC$ $\\angle C = 90^{\\circ}$, $AC = 3$, $BC = 4$, то $\\operatorname{ctg} A = \\dfrac{3}{4}$?"],
],
sol: `<ul>
<li>а) Диагонали равнобедренной трапеции <em>равны</em>, но делятся точкой пересечения <b>не пополам</b> — <b style="color:#dc2626">НЕВЕРНО</b></li>
<li>б) Периметр квадрата со стороной $6$: $4\\cdot6=24$ см — <b>верно</b></li>
<li>в) Условие вписанности четырёхугольника: $\\angle A+\\angle C=180°$ — <b>верно</b></li>
<li>г) $\\operatorname{ctg}A = \\dfrac{AC}{BC}=\\dfrac{3}{4}$ — <b>верно</b></li>
</ul>
Диагонали равнобедренной трапеции равны по длине, но не делятся пополам в точке пересечения (это свойство параллелограмма).
<div class="sol-ans">Ответ: а)</div>`
},
{
text: `Найдите значение выражения $10A$,
если $A = \\sqrt{0{,}49} \\cdot \\sqrt{25} - \\sqrt{1{,}96}$.`,
sol: `Извлекаем корни:
$$\\sqrt{0{,}49}=0{,}7;\\quad \\sqrt{25}=5;\\quad \\sqrt{1{,}96}=1{,}4$$
Подставляем:
$$A = 0{,}7\\cdot 5 - 1{,}4 = 3{,}5 - 1{,}4 = 2{,}1$$
$$10A = 10\\cdot 2{,}1 = 21$$
<div class="sol-ans">Ответ: $21$</div>`
},
{
text: `Первый член арифметической прогрессии равен $-4\\dfrac{1}{2}$,
разность прогрессии равна $-0{,}5$.
Является ли членом данной прогрессии число $-10$? Ответ обоснуйте.`,
sol: `Дано: $a_1 = -4\\dfrac{1}{2} = -\\dfrac{9}{2}$, $d = -0{,}5 = -\\dfrac{1}{2}$.
<br>Формула $n$-го члена: $a_n = a_1 + (n-1)d$.
<br>Если $-10$ — член прогрессии, найдём его номер $n$:
$$-10 = -\\dfrac{9}{2} + (n-1)\\cdot\\left(-\\dfrac{1}{2}\\right)$$
Умножим обе части на $-2$:
$$20 = 9 + (n-1)$$
$$n-1 = 11 \\implies n = 12$$
Получили <b>натуральное число</b> $n=12$, значит $-10$ — это <b>12-й член</b> прогрессии.
<div class="sol-ans">Ответ: да, $-10$ — член прогрессии (12-й по счёту)</div>`
},
{
text: `$ABCD$ — прямоугольник с периметром $36$ см,
сторона $AD$ в $2$ раза больше стороны $AB$.
Найдите площадь прямоугольника.`,
sol: `<b>Формула периметра прямоугольника:</b> $P = 2(a+b)$.
<br><b>Формула площади прямоугольника:</b> $S = a\\cdot b$.
<br><b>Шаг 1.</b> Введём обозначение: пусть $AB = x$ см. Тогда $AD = 2x$ см, так как по условию $AD$ в $2$ раза больше $AB$.
<br><b>Шаг 2.</b> Составим уравнение по формуле периметра:
$$2(AB+AD) = 36 \\;\\implies\\; 2(x+2x) = 36 \\;\\implies\\; 6x = 36 \\;\\implies\\; x = 6$$
<b>Шаг 3.</b> Находим стороны: $AB = 6$ см, $AD = 12$ см.
<svg viewBox="0 0 195 80" xmlns="http://www.w3.org/2000/svg" style="max-width:195px;width:100%;height:auto;display:block;margin:8px 0">
<polygon points="20,65 164,65 164,15 20,15" fill="rgba(37,99,235,0.07)" stroke="#334155" stroke-width="1.8"/>
<text x="6" y="71" font-size="13" font-family="serif" font-style="italic">A</text>
<text x="166" y="71" font-size="13" font-family="serif" font-style="italic">D</text>
<text x="166" y="14" font-size="13" font-family="serif" font-style="italic">C</text>
<text x="6" y="14" font-size="13" font-family="serif" font-style="italic">B</text>
<text x="92" y="76" font-size="11" fill="#334155" text-anchor="middle">AD = 12</text>
<text x="5" y="42" font-size="11" fill="#334155">AB=6</text>
</svg>
<b>Шаг 4.</b> Подставляем в формулу площади:
$$S = AD\\cdot AB = 12\\cdot 6 = 72\\text{ см}^2$$
<div class="sol-ans">Ответ: $72$ см²</div>`
},
{
text: `Оптовая стоимость справочного издания «Образование в Беларуси: истоки, история, современность» $28$ р.
Какое наибольшее количество данных книг по розничной цене можно купить на $5500$ р.,
если розничная цена на $25\\%$ выше оптовой?`,
sol: `<b>Правило увеличения числа на $p$ процентов:</b> новое значение равно $N\\cdot\\left(1+\\dfrac{p}{100}\\right)$.
<br><b>Шаг 1.</b> Найдём розничную цену. Так как она на $25\\%$ выше оптовой:
$$28\\cdot\\left(1+\\dfrac{25}{100}\\right) = 28\\cdot 1{,}25 = 35\\text{ р.}$$
<b>Шаг 2.</b> Делим имеющуюся сумму на цену одной книги, чтобы узнать, сколько книг можно купить:
$$\\dfrac{5500}{35} = 157{,}14\\ldots$$
<b>Шаг 3.</b> Так как количество книг — натуральное число, округляем результат <b>вниз</b>: получаем $157$ книг.
<br><b>Шаг 4.</b> Проверим граничные значения:
<br>$\\bullet$ $157\\cdot 35 = 5495$ р. — меньше $5500$, значит $157$ книг купить можно;
<br>$\\bullet$ $158\\cdot 35 = 5530$ р. — больше $5500$, значит $158$ книг купить уже нельзя.
<div class="sol-ans">Ответ: $157$ книг</div>`
},
{
text: `Упростите выражение
$$\\left(\\dfrac{y+2}{y^2-y-6} - \\dfrac{y}{y^2-6y+9}\\right) : \\dfrac{1}{(2y-6)^2}.$$`,
sol: `<b>Формула квадрата разности:</b> $a^2-2ab+b^2=(a-b)^2$. <b>Разложение квадратного трёхчлена:</b> $y^2-y-6=(y-3)(y+2)$, так как корни $3$ и $-2$. <b>Правило деления дробей:</b> $\\dfrac{A}{B}:\\dfrac{C}{D}=\\dfrac{A}{B}\\cdot\\dfrac{D}{C}$.
<br><b>Шаг 1.</b> Разложим знаменатели на множители:
$$y^2-y-6 = (y-3)(y+2);$$
$$y^2-6y+9 = (y-3)^2;$$
$$(2y-6)^2 = \\bigl(2(y-3)\\bigr)^2 = 4(y-3)^2.$$
<b>Шаг 2.</b> Запишем ОДЗ: знаменатели не равны нулю, значит $y\\neq 3$ и $y\\neq -2$.
<br><b>Шаг 3.</b> Сократим первую дробь в скобках — множитель $(y+2)$ есть в числителе и в знаменателе:
$$\\dfrac{y+2}{(y-3)(y+2)} = \\dfrac{1}{y-3}.$$
<b>Шаг 4.</b> Приведём дроби в скобках к общему знаменателю $(y-3)^2$. Дробь $\\dfrac{1}{y-3}$ умножим на $\\dfrac{y-3}{y-3}$:
$$\\dfrac{y-3}{(y-3)^2} - \\dfrac{y}{(y-3)^2} = \\dfrac{(y-3)-y}{(y-3)^2} = \\dfrac{-3}{(y-3)^2}.$$
<b>Шаг 5.</b> Заменим деление умножением на обратную дробь:
$$\\dfrac{-3}{(y-3)^2} : \\dfrac{1}{(2y-6)^2} = \\dfrac{-3}{(y-3)^2}\\cdot 4(y-3)^2.$$
Сокращаем $(y-3)^2$:
$$\\dfrac{-3}{(y-3)^2}\\cdot 4(y-3)^2 = -3\\cdot 4 = -12.$$
<div class="sol-ans">Ответ: $-12$</div>`
},
{
text: `Найдите сумму координат точки пересечения прямых,
заданных уравнениями $2x + 3y = -23$ и $x - y = 11(10 + y)$.`,
sol: `<b>Метод решения:</b> точка пересечения двух прямых — общее решение их уравнений. Используем метод подстановки.
<br><b>Шаг 1.</b> Упростим второе уравнение, раскрыв скобки в правой части:
$$x - y = 110 + 11y \\;\\implies\\; x = 110 + 12y$$
<b>Шаг 2.</b> Подставим $x = 110+12y$ в первое уравнение и решим относительно $y$:
$$2(110+12y)+3y = -23$$
$$220+24y+3y = -23$$
$$27y = -243 \\;\\implies\\; y = -9$$
<b>Шаг 3.</b> Найдём $x$, подставив $y=-9$:
$$x = 110 + 12\\cdot(-9) = 110 - 108 = 2$$
<b>Шаг 4.</b> Точка пересечения — $(2;\\,-9)$. Сумма координат:
$$x+y = 2+(-9) = -7$$
<div class="sol-ans">Ответ: $-7$</div>`
},
{
text: `Диагонали трапеции $ABCD$ ($AD \\| BC$) пересекаются в точке $O$.
Площади треугольников $AOD$ и $COD$ равны соответственно $54$ см² и $18$ см².
Найдите площадь трапеции.`,
sol: `<svg viewBox="0 0 205 110" xmlns="http://www.w3.org/2000/svg" style="max-width:205px;width:100%;height:auto;display:block;margin:10px 0">
<polygon points="20,90 60,20 100,43" fill="rgba(37,99,235,0.22)" stroke="none"/>
<polygon points="60,20 100,43 140,20" fill="rgba(251,146,60,0.28)" stroke="none"/>
<polygon points="140,20 100,43 180,90" fill="rgba(22,163,74,0.20)" stroke="none"/>
<polygon points="20,90 100,43 180,90" fill="rgba(225,29,72,0.16)" stroke="none"/>
<polygon points="20,90 60,20 140,20 180,90" fill="none" stroke="#334155" stroke-width="1.8"/>
<line x1="20" y1="90" x2="140" y2="20" stroke="#475569" stroke-width="1.2" stroke-dasharray="4,2"/>
<line x1="60" y1="20" x2="180" y2="90" stroke="#475569" stroke-width="1.2" stroke-dasharray="4,2"/>
<circle cx="100" cy="43" r="3.5" fill="#1e293b"/>
<text x="103" y="40" font-size="12" font-family="serif" font-style="italic">O</text>
<text x="6" y="100" font-size="13" font-family="serif" font-style="italic">A</text>
<text x="183" y="100" font-size="13" font-family="serif" font-style="italic">D</text>
<text x="50" y="14" font-size="13" font-family="serif" font-style="italic">B</text>
<text x="142" y="14" font-size="13" font-family="serif" font-style="italic">C</text>
<text x="62" y="58" font-size="11" fill="#1d4ed8" font-weight="bold">18</text>
<text x="98" y="32" font-size="11" fill="#c2410c" font-weight="bold">6</text>
<text x="138" y="58" font-size="11" fill="#15803d" font-weight="bold">54</text>
<text x="98" y="80" font-size="11" fill="#be123c" font-weight="bold">18</text>
</svg>
<b>Шаг 1 — отношение оснований.</b><br>
Треугольники $AOD$ и $COD$ имеют общую вершину $D$, основания $AO$ и $OC$ лежат на диагонали $AC$. Отношение площадей равно отношению оснований:
$$\\dfrac{S_{AOD}}{S_{COD}} = \\dfrac{AO}{OC} = \\dfrac{54}{18} = 3$$
По свойству трапеции $\\dfrac{AO}{OC} = \\dfrac{AD}{BC}$, значит $\\dfrac{AD}{BC} = 3$.
<br><br>
<b>Шаг 2 — площадь треугольника BOC.</b><br>
Треугольники $AOD$ и $BOC$ <b>подобны</b> (т.к. $AD\\parallel BC$), коэффициент подобия $k = 3$. Отношение площадей $= k^2 = 9$:
$$S_{BOC} = \\dfrac{S_{AOD}}{9} = \\dfrac{54}{9} = 6\\text{ см}^2$$
<b>Шаг 3 — площадь треугольника ABO.</b><br>
В трапеции: $S_{ABO} = S_{COD}$ (известное свойство). Значит, $S_{ABO} = 18$ см².
<br><br>
<b>Шаг 4 — итог.</b>
$$S_{ABCD} = S_{ABO}+S_{BOC}+S_{COD}+S_{AOD} = 18+6+18+54 = 96\\text{ см}^2$$
<div class="sol-ans">Ответ: $96$ см²</div>`
},
]
};