Files
Learn_System/frontend/textbooks/math_5_ch1.html
T
Maxim Dolgolyov 12a08e7d42 feat(math5): Глава 1 ЗАВЕРШЕНА — §15–§17 (вокруг нас, движение, история чисел)
§15 Математика вокруг нас (задачи из жизни + прикидка в уме). §16 Движение/
взвешивание/переливание (s=v·t тренажёр + логические задачи). §17 Исторические
сведения (системы счисления; тренажёр римских цифр + квиз по истории чисел).
Глава 1 целиком: §1–17 + финал, все § наполнены (тест «нет заглушек»). Эталон
для Sonnet по Гл.2–3. Тесты math5: 9/9.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 09:41:17 +03:00

1539 lines
146 KiB
HTML
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.
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>Математика 5 · Глава 1 · Натуральные числа</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"
onload="renderMathInElement(document.body,{delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false})"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Unbounded:wght@700;800;900&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/css/math6.css">
<script src="/js/api.js" defer></script>
<script src="/js/xp.js" defer></script>
<script src="/js/math6_svg.js" defer></script>
<script src="/js/math6_anim.js" defer></script>
<script src="/js/math6_engine.js" defer></script>
<style>:root{--pri:#4f46e5;--pri2:#3730a3;--pri-soft:#e0e7ff;--acc:#6366f1;--acc2:#4f46e5;--acc-soft:#eef2ff}</style>
</head>
<body>
<header class="hdr" data-wm="123">
<div class="hdr-row">
<div>
<h1>Математика 5 · Глава 1</h1>
<div class="hdr-sub">Натуральные числа: запись и разряды · сравнение и округление · действия · делимость · простые числа</div>
</div>
<div class="hdr-side">
<a href="/textbook/math-5" class="hdr-btn" title="Ко всем главам"><svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg> К математике 5</a>
<button id="search-btn" class="hdr-btn" title="Поиск (Ctrl+K)"><svg class="ic" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="m21 21-4-4"/></svg> <span>Поиск</span></button>
<button id="sidebar-btn" class="hdr-btn" title="Шпаргалка"><svg class="ic" viewBox="0 0 24 24"><line x1="4" y1="6" x2="20" y2="6"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="18" x2="14" y2="18"/></svg> Шпаргалка</button>
<button id="theme-btn" class="hdr-btn" title="Сменить тему"><svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg> <span id="theme-lab">Тёмная</span></button>
</div>
</div>
</header>
<main class="main">
<div class="col-main">
<section class="hero" data-wm="123">
<h2>Натуральные числа</h2>
<p>Натуральные числа — те, которыми мы считаем предметы: $1, 2, 3, \dots$ В этой главе мы научимся <b>читать и записывать</b> большие числа по разрядам, <b>сравнивать и округлять</b> их, выполнять <b>все четыре действия</b>, возводить в <b>степень</b>, делить <b>с остатком</b>, а также разберём <b>делимость</b>: делители и кратные, НОД и НОК, признаки делимости, простые и составные числа.</p>
<div class="hero-row">
<button class="btn-primary" onclick="goTo('p1')"><svg class="ic" viewBox="0 0 24 24"><polygon points="6 4 20 12 6 20 6 4" fill="currentColor" stroke="none"/></svg> Начать § 1</button>
<div class="hero-progress"><span class="hp-label">Прогресс по главе</span><div class="hp-bar"><div id="hero-hp-fill" class="hp-fill"></div></div><span id="hero-hp-text" class="hp-text">0%</span></div>
<div id="hero-xp-badge" class="hero-xp-badge" title="Опыт" data-gamified></div>
</div>
</section>
<section class="psel"><div class="psel-title">Параграфы главы</div><div id="psel-grid" class="psel-grid"></div></section>
<div id="sections"></div>
</div>
<aside class="col-side" id="col-side"><div id="sidebar-content"></div></aside>
<div class="col-side-backdrop" id="col-side-backdrop"></div>
</main>
<footer class="foot" id="m6-foot">Интерактивный учебник «Математика 5» · Глава 1 · Натуральные числа · LearnSpace</footer>
<div id="ach-popup" class="ach-popup"><svg class="ic" viewBox="0 0 24 24" style="width:22px;height:22px"><polygon points="12,2 22,20 2,20"/></svg><span id="ach-text">Достижение!</span></div>
<div id="gloss-tip" class="gloss-tip"></div>
<div id="search-modal" class="search-modal" role="dialog" aria-label="Поиск по главе">
<div class="search-box">
<input type="text" id="search-input" class="search-input" placeholder="Поиск: понятие, действие, параграф…" autocomplete="off">
<div id="search-results" class="search-results"></div>
<div class="search-foot"><span><kbd>&#8593;&#8595;</kbd> навигация</span><span><kbd>Enter</kbd> открыть</span><span><kbd>Esc</kbd> закрыть</span></div>
</div>
</div>
<script>
'use strict';
window.M6 = {
slug: 'math-5-ch1', lsPrefix: 'math5_ch1', xpKey: 'math5_xp', wm: '123',
paras: [
{ id:'p1', num:'§ 1', name:'Как решать задачу', sub:'Условие, план, решение, проверка' },
{ id:'p2', num:'§ 2', name:'Натуральные числа и нуль. Чтение и запись', sub:'Разряды и классы' },
{ id:'p3', num:'§ 3', name:'Сравнение натуральных чисел', sub:'Что больше' },
{ id:'p4', num:'§ 4', name:'Точка, прямая, луч, отрезок, плоскость', sub:'Начала геометрии' },
{ id:'p5', num:'§ 5', name:'Измерение отрезков. Длина отрезка', sub:'Линейка и единицы длины' },
{ id:'p6', num:'§ 6', name:'Координатный луч', sub:'Число как точка на луче' },
{ id:'p7', num:'§ 7', name:'Округление натуральных чисел', sub:'До нужного разряда' },
{ id:'p8', num:'§ 8', name:'Сложение и вычитание', sub:'В столбик' },
{ id:'p9', num:'§ 9', name:'Умножение и деление', sub:'В столбик и уголком' },
{ id:'p10', num:'§ 10', name:'Степень числа', sub:'Квадрат и куб' },
{ id:'p11', num:'§ 11', name:'Деление с остатком', sub:'a = b·q + r' },
{ id:'p12', num:'§ 12', name:'Делители и кратные. НОД и НОК', sub:'Общие делители и кратные' },
{ id:'p13', num:'§ 13', name:'Признаки делимости', sub:'На 2, 3, 4, 5, 9, 10' },
{ id:'p14', num:'§ 14', name:'Простые и составные числа', sub:'Разложение на множители' },
{ id:'p15', num:'§ 15', name:'Математика вокруг нас', sub:'Числа в жизни', applied:true },
{ id:'p16', num:'§ 16', name:'Движение, взвешивание, переливание', sub:'Задачи-головоломки', applied:true },
{ id:'p17', num:'§ 17', name:'Исторические сведения о числах', sub:'Как считали разные народы', applied:true },
{ id:'final', num:'★', name:'Финал главы', sub:'Тест · боссы главы 1', final:true }
],
achLabels: {
start:'Начало главы 1!', p1_done:'Решаю задачи по плану!', p2_done:'Читаю и пишу большие числа!',
p3_done:'Сравниваю числа!', p4_done:'Геометрия: точка, прямая, луч!', p5_done:'Измеряю отрезки!',
p6_done:'Координатный луч покорён!', p7_done:'Округляю уверенно!', p8_done:'Сложение и вычитание!',
p9_done:'Умножение и деление!', p10_done:'Степень числа!', p11_done:'Деление с остатком!',
p12_done:'НОД и НОК!', p13_done:'Признаки делимости!', p14_done:'Простые числа!',
p15_done:'Математика вокруг нас!', p16_done:'Задачи-головоломки!', p17_done:'Истории о числах!',
ch1_done:'Глава 1 «Натуральные числа» пройдена!'
},
startAch: ['start','Начало главы 1!'],
finalAch: ['ch1_done', 'Глава 1 «Натуральные числа» пройдена!'],
sidebars: {}, tips: [], glossary: [], searchRows: [], builders: {},
footer: 'Интерактивный учебник «Математика 5» · Глава 1 · Натуральные числа · LearnSpace'
};
/* ===================== ВСПОМОГАТЕЛЬНОЕ ===================== */
function _ri(a,b){ return a + Math.floor(Math.random()*(b-a+1)); }
function _pick(a){ return a[_ri(0,a.length-1)]; }
function _kf(x){ return String(x).replace('.','{,}'); }
function _grp(s){ s=String(s); var o='',c=0; for(var i=s.length-1;i>=0;i--){ o=s[i]+o; if(++c%3===0&&i>0)o='\\,'+o; } return o; }
/* ===================== § 1. КАК РЕШАТЬ ЗАДАЧУ ===================== */
function buildP1(){
var box=document.getElementById('p1-body'); var h='';
h+=makeCard('oral','Где это в жизни','1.0',
'<p>Решать задачи приходится не только на уроке. Распланировать карманные деньги, прикинуть, хватит ли времени дойти до школы, разделить пиццу поровну — всё это задачи. Хороший «решатель» сначала <b>понимает</b>, чего от него хотят, и только потом считает.</p>');
h+=makeCard('rule','Четыре шага решения','1.1',
'<p>Любую задачу удобно решать по плану из четырёх шагов:</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li><b>Понять условие.</b> Что дано? Что нужно найти? Сделать рисунок или краткую запись.</li>'
+'<li><b>Составить план.</b> Какие действия и в каком порядке приведут к ответу?</li>'
+'<li><b>Выполнить план.</b> Аккуратно сделать вычисления.</li>'
+'<li><b>Проверить.</b> Подходит ли ответ по смыслу? Сошлось ли?</li>'
+'</ol>');
h+=makeCard('example','Разбор по шагам','1.2',
'<p>Задача: в двух коробках $40$ карандашей. В первой на $6$ больше, чем во второй. Сколько карандашей в каждой коробке?</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li><b>Понять.</b> Дано: всего $40$, разница $6$. Найти: сколько в каждой коробке.</li>'
+'<li><b>План.</b> Уберём «лишние» $6$ из суммы, разделим остаток поровну, потом вернём $6$ в первую.</li>'
+'<li><b>Решение.</b> $(40-6):2=17$ — во второй; $17+6=23$ — в первой.</li>'
+'<li><b>Проверка.</b> $17+23=40$ и $23-17=6$. Верно!</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','1.3',
'<p>Математик <b>Дьёрдь Пойа</b> в 1945 году написал знаменитую книгу «Как решать задачу». Именно он описал эти четыре шага. Его главный совет: «Если не получается решить задачу — реши сначала более простую похожую задачу».</p>');
h+='<div class="wg" id="p1-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">На каком шаге ученик?</div></div>'
+'<div class="wg-help">Прочитай фразу ученика и определи, какому из четырёх шагов она соответствует.</div>'
+'<div class="score-display"><span>Вопрос <b id="p1-i">1</b> / 5</span><span>Очки: <b id="p1-s">0</b> / 5</span></div>'
+'<div id="p1-q" class="qbox" style="font-size:1.05rem"></div>'
+'<div style="display:flex;gap:8px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-step="1">Понять условие</button><button class="btn primary" data-step="2">Составить план</button><button class="btn primary" data-step="3">Выполнить</button><button class="btn primary" data-step="4">Проверить</button></div>'
+'<div class="feedback" id="p1-fb"></div></div>';
h+='<div class="wg" id="p1-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Реши задачу</div></div>'
+'<div class="wg-help">Реши задачу по плану и введи ответ числом (без единиц).</div>'
+'<div class="score-display"><span>Задача <b id="p1-pi">1</b> / 6</span><span>Очки: <b id="p1-ps">0</b> / 6</span></div>'
+'<div id="p1-pq" class="qbox" style="font-size:1rem;text-align:left"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p1-pa" class="tinp" style="width:120px;text-align:center" placeholder="ответ"><button class="btn primary" id="p1-pgo">Проверить</button></div>'
+'<div class="feedback" id="p1-pfb"></div></div>';
h+=secNav(null,'p2')+readBtn('p1');
box.innerHTML=h; renderMath(box);
(function(){
var Q=[
{t:'«Сделаю краткую запись: дано $40$, разница $6$.»', s:1},
{t:'«Сначала вычту $6$, потом разделю остаток на $2$.»', s:2},
{t:'«$40-6=34$, затем $34:2=17$.»', s:3},
{t:'«Проверю: $17+23=40$ — сходится.»', s:4},
{t:'«Что именно нужно найти в задаче?»', s:1},
{t:'«Запишу ответ и подумаю, разумен ли он.»', s:4},
{t:'«Каким действием это решается?»', s:2},
{t:'«Аккуратно посчитаю столбиком.»', s:3}
];
var order=[],i=0,score=0,cur=null;
function reorder(){ order=Q.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){ var k=_ri(0,j),t=order[j];order[j]=order[k];order[k]=t; } }
reorder();
function show(){ if(i>=5){ document.getElementById('p1-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; if(score>=4){addXp(15,'p1-iv1');bumpProgress('p1',30);}else if(score>=2){addXp(8,'p1-iv1');bumpProgress('p1',16);} return; }
cur=Q[order[i]]; document.getElementById('p1-i').textContent=i+1;
document.getElementById('p1-q').innerHTML=cur.t; renderMath(document.getElementById('p1-q'));
document.getElementById('p1-fb').style.display='none'; }
function ans(s){ if(i>=5)return; var names=['','Понять условие','Составить план','Выполнить','Проверить']; var fb=document.getElementById('p1-fb');
if(s===cur.s){ score++; feedback(fb,true,'✓ Верно — это шаг «'+names[cur.s]+'».'); } else feedback(fb,false,'✗ Нет. Это шаг «'+names[cur.s]+'».');
document.getElementById('p1-s').textContent=score; i++; setTimeout(show,1100); }
document.querySelectorAll('#p1-iv1 [data-step]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-step')); }); });
show();
})();
(function(){
var PROB=[
{q:'В двух корзинах $30$ яблок. В первой на $4$ больше, чем во второй. Сколько яблок во второй?',a:13},
{q:'Книга стоит $7$ р., тетрадь — на $5$ р. дешевле. Сколько стоит тетрадь?',a:2},
{q:'Купили $3$ ручки по $2$ р. Сколько заплатили?',a:6},
{q:'У Маши $24$ наклейки, она отдала треть. Сколько наклеек она отдала?',a:8},
{q:'В классе $28$ учеников, девочек $15$. Сколько мальчиков?',a:13},
{q:'За $5$ дней прочитали $45$ страниц поровну. Сколько страниц в день?',a:9},
{q:'Ленту $200$ см разрезали на части по $25$ см. Сколько получилось частей?',a:8},
{q:'Было $50$ р., потратили $18$ р. и $12$ р. Сколько осталось?',a:20}
];
var order=[],i=0,score=0,cur=null;
function reorder(){ order=PROB.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){ var k=_ri(0,j),t=order[j];order[j]=order[k];order[k]=t; } }
reorder();
function show(){ if(i>=6){ document.getElementById('p1-pq').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p1-iv2');bumpProgress('p1',30);}else if(score>=3){addXp(8,'p1-iv2');bumpProgress('p1',16);} return; }
cur=PROB[order[i]]; document.getElementById('p1-pi').textContent=i+1;
document.getElementById('p1-pq').innerHTML=cur.q; renderMath(document.getElementById('p1-pq'));
document.getElementById('p1-pa').value=''; document.getElementById('p1-pfb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p1-pfb'), v=parseFloat(document.getElementById('p1-pa').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(v===cur.a){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.a+'.'); } else feedback(fb,false,'✗ Нет. Правильный ответ: '+cur.a+'.');
document.getElementById('p1-ps').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p1-pgo').addEventListener('click',go);
document.getElementById('p1-pa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 2. ЧТЕНИЕ И ЗАПИСЬ. РАЗРЯДЫ ===================== */
function buildP2(){
var box=document.getElementById('p2-body'); var h='';
h+=makeCard('oral','Где это в жизни','2.0',
'<p>Большие числа окружают нас: на Земле живёт около $8\\,000\\,000\\,000$ человек, до Луны примерно $384\\,000$ км, а у современного смартфона памяти $128\\,000\\,000\\,000$ байт. Чтобы не запутаться в нулях, числа разбивают на <b>классы</b> по три цифры.</p>');
h+=makeCard('theory','Натуральные числа и нуль','2.1',
'<p><b>Натуральные числа</b> — это числа, которыми считают предметы: $1, 2, 3, 4, \\dots$ Их ряд бесконечен: какое бы число ни взяли, всегда есть следующее.</p>'
+'<p>Число <b>нуль</b> $(0)$ натуральным не считают, но без него не записать, например, число $108$. Множество натуральных чисел обозначают буквой $\\mathbb{N}$.</p>');
h+=makeCard('rule','Классы и разряды','2.2',
'<p>Запись числа читают <b>справа налево</b> по разрядам и группируют по три — в <b>классы</b>:</p>'
+'<table class="tbl"><tr><th colspan="3">Миллионы</th><th colspan="3">Тысячи</th><th colspan="3">Единицы</th></tr>'
+'<tr><td>сот</td><td>дес</td><td>ед</td><td>сот</td><td>дес</td><td>ед</td><td>сот</td><td>дес</td><td>ед</td></tr>'
+'<tr><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr></table>'
+'<p>Это число $12\\,345\\,678$ — «двенадцать миллионов триста сорок пять тысяч шестьсот семьдесят восемь».</p>');
h+=makeCard('example','Читаем число','2.3',
'<p>$5\\,204$ — пять тысяч двести четыре. &nbsp; $70\\,030$ — семьдесят тысяч тридцать. &nbsp; $300\\,000$ — триста тысяч.</p>'
+'<p>Нуль в разряде означает, что этого разряда «нет»: в числе $70\\,030$ нет ни сотен, ни единиц тысяч, ни единиц.</p>');
h+=makeCard('example','Разбор по шагам','2.4',
'<p>Запишем цифрами число «двести три тысячи сорок».</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Находим классы: «двести три <b>тысячи</b>» — класс тысяч $=203$; «сорок» — класс единиц $=40$.</li>'
+'<li>Каждый класс — ровно $3$ цифры: тысячи $\\to 203$, единицы $\\to 040$.</li>'
+'<li>Соединяем: $203\\,040$.</li>'
+'<li>Проверка: читаем обратно — «двести три тысячи сорок». Верно!</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','2.5',
'<p>Число $10^{100}$ (единица со ста нулями) называется <b>гугол</b>. Это слово придумал девятилетний племянник математика Эдварда Каснера. От него же произошло название поисковика Google. А гуголов в одном гуголплексе — гугол!</p>');
h+='<div class="wg" id="p2-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Разрядная таблица</div></div>'
+'<div class="wg-help">Введи натуральное число (до 9 цифр) — оно разложится по классам и разрядам.</div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap;margin-bottom:8px"><input type="text" id="p2-pv-in" class="tinp" style="width:170px;text-align:center" value="12345678" placeholder="например 305040"><button class="btn primary" id="p2-pv-go">Разложить</button></div>'
+'<div id="p2-pv-out" style="overflow-x:auto"></div></div>';
h+='<div class="wg" id="p2-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Какая цифра в разряде?</div></div>'
+'<div class="wg-help">Назови цифру в указанном разряде данного числа. Введи одну цифру (09).</div>'
+'<div class="score-display"><span>Вопрос <b id="p2-qi">1</b> / 6</span><span>Очки: <b id="p2-qs">0</b> / 6</span></div>'
+'<div id="p2-qq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p2-qa" class="tinp" style="width:90px;text-align:center" min="0" max="9"><button class="btn primary" id="p2-qgo">Проверить</button></div>'
+'<div class="feedback" id="p2-qfb"></div></div>';
h+=secNav('p1','p3')+readBtn('p2');
box.innerHTML=h; renderMath(box);
(function(){
var CLS=[['Миллионы','#4f46e5'],['Тысячи','#0d9488'],['Единицы','#e11d48']];
var LAB=['сот','дес','ед','сот','дес','ед','сот','дес','ед'];
function render(){
var raw=(document.getElementById('p2-pv-in').value||'').replace(/\D/g,'');
if(!raw)raw='0'; if(raw.length>9)raw=raw.slice(-9);
var num=parseInt(raw,10); var s=raw.padStart(9,'0');
var firstSig=s.search(/[1-9]/); if(firstSig<0)firstSig=8;
var th='<table class="tbl" style="margin:0 auto"><tr>';
for(var c=0;c<3;c++) th+='<th colspan="3" style="color:'+CLS[c][1]+'">'+CLS[c][0]+'</th>';
th+='</tr><tr>';
for(var k=0;k<9;k++) th+='<td style="font-size:.62rem;color:var(--muted)">'+LAB[k]+'</td>';
th+='</tr><tr>';
for(var d=0;d<9;d++){ var grp=Math.floor(d/3),dim=d<firstSig; th+='<td style="font-size:1.4rem;font-weight:800;color:'+CLS[grp][1]+';opacity:'+(dim?0.18:1)+'">'+s[d]+'</td>'; }
th+='</tr></table>';
th+='<div style="text-align:center;margin-top:10px;font-size:1.1rem;font-weight:700">$'+_grp(num)+'$</div>';
var out=document.getElementById('p2-pv-out'); out.innerHTML=th; renderMath(out);
}
document.getElementById('p2-pv-go').addEventListener('click',render);
document.getElementById('p2-pv-in').addEventListener('keydown',function(e){ if(e.key==='Enter')render(); });
render();
})();
(function(){
var PL=[['единиц',0],['десятков',1],['сотен',2],['единиц тысяч',3],['десятков тысяч',4],['сотен тысяч',5]];
var i=0,score=0,cur=null;
function gen(){ var n=_ri(100000,999999), s=String(n), pl=_pick(PL); cur={n:n, s:s, place:pl[0], digit:+s[s.length-1-pl[1]]}; }
function show(){ if(i>=6){ document.getElementById('p2-qq').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p2-iv2');bumpProgress('p2',30);}else if(score>=3){addXp(8,'p2-iv2');bumpProgress('p2',18);} return; }
gen(); document.getElementById('p2-qi').textContent=i+1;
document.getElementById('p2-qq').innerHTML='Число $'+_grp(cur.n)+'$. Какая цифра в разряде <b>'+cur.place+'</b>?'; renderMath(document.getElementById('p2-qq'));
document.getElementById('p2-qa').value=''; document.getElementById('p2-qfb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p2-qfb'), a=parseInt(document.getElementById('p2-qa').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи одну цифру 0–9.'); return; }
if(a===cur.digit){ score++; feedback(fb,true,'✓ Верно! В разряде '+cur.place+' стоит '+cur.digit+'.'); } else feedback(fb,false,'✗ Нет. Правильный ответ: '+cur.digit+'.');
document.getElementById('p2-qs').textContent=score; i++; setTimeout(show,1100); }
document.getElementById('p2-qgo').addEventListener('click',go);
document.getElementById('p2-qa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== ФИНАЛ ГЛАВЫ ===================== */
function buildFinal(){
var box=document.getElementById('final-body'); var h='';
h+=makeCard('theory','Финал главы 1','★',
'<p>Пять боссов проверят владение натуральными числами: разряды, округление, действия и степень. Побей не меньше четырёх — и глава покорена!</p>');
h+='<div class="wg" id="fin"><div class="wg-header"><span class="wg-badge">Боссы</span><div class="wg-title">Сразись с главой 1</div></div>'
+'<div class="hp-boss"><div class="hp-boss-fill" id="fin-hp" style="width:100%"></div></div>'
+'<div class="score-display"><span>Босс <b id="fin-i">1</b> / 5</span><span>Побеждено: <b id="fin-s">0</b> / 5</span></div>'
+'<div id="fin-name" style="font-weight:800;color:#b91c1c;text-align:center;margin-bottom:6px"></div>'
+'<div id="fin-q" class="boss-q"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="fin-a" class="tinp" style="width:160px;text-align:center" placeholder="ответ"><button class="btn primary" id="fin-go">Удар!</button></div>'
+'<div class="feedback" id="fin-fb"></div></div>';
h+=secNav('p17',null)+readBtn('final','Завершить главу 1 (+10 XP)');
box.innerHTML=h; renderMath(box);
(function(){
var bosses=[
function(){ var n=_ri(100000,999999), s=String(n); return {name:'Страж Разрядов', q:'В числе $'+_grp(n)+'$ назови цифру в разряде <b>тысяч</b>.', ans:+s[s.length-4]}; },
function(){ var n=_ri(1200,9800); return {name:'Округлитель', q:'Округли $'+_grp(n)+'$ до <b>сотен</b>.', ans:Math.round(n/100)*100}; },
function(){ var a=_ri(2400,8600), b=_ri(1100,2300); return {name:'Сумматор', q:'Вычисли $'+_grp(a)+' + '+_grp(b)+'$.', ans:a+b}; },
function(){ var a=_ri(13,40), b=_ri(11,30); return {name:'Множитель', q:'Вычисли $'+a+' \\cdot '+b+'$.', ans:a*b}; },
function(){ var p=_pick([[2,5,32],[3,4,81],[5,3,125],[2,8,256],[4,3,64],[6,2,36]]); return {name:'Повелитель Степеней', q:'Вычисли $'+p[0]+'^{'+p[1]+'}$.', ans:p[2]}; }
];
var i=0,score=0,cur=null,done=false;
function show(){
if(i>=5){ done=true; document.getElementById('fin-name').textContent=''; document.getElementById('fin-q').innerHTML=(score>=4?'<b>Победа!</b> Глава 1 пройдена. ':'<b>Бой окончен.</b> ')+'Побеждено боссов: '+score+' / 5.';
document.getElementById('fin-hp').style.width=(score>=4?0:40)+'%';
if(score>=4){ addXp(40,'final'); bumpProgress('final',100); if(window.confetti)try{confetti();}catch(e){} } else { bumpProgress('final',60); }
return; }
cur=bosses[i](); document.getElementById('fin-i').textContent=i+1; document.getElementById('fin-s').textContent=score;
document.getElementById('fin-name').textContent='Босс '+(i+1)+': '+cur.name;
document.getElementById('fin-hp').style.width=(100-i*20)+'%';
document.getElementById('fin-q').innerHTML=cur.q; renderMath(document.getElementById('fin-q'));
document.getElementById('fin-a').value=''; document.getElementById('fin-fb').style.display='none';
}
function go(){ if(done||i>=5)return; var fb=document.getElementById('fin-fb'), v=parseFloat(document.getElementById('fin-a').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.ans)<1e-9){ score++; feedback(fb,true,'✓ Босс повержен! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Босс устоял. Верный ответ: '+cur.ans+'.');
document.getElementById('fin-s').textContent=score; i++; setTimeout(show,1400); }
document.getElementById('fin-go').addEventListener('click',go);
document.getElementById('fin-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 3. СРАВНЕНИЕ НАТУРАЛЬНЫХ ЧИСЕЛ ===================== */
function buildP3(){
var box=document.getElementById('p3-body'); var h='';
h+=makeCard('oral','Где это в жизни','3.0',
'<p>Сравнивать числа приходится постоянно: где цена ниже, у какого телефона больше памяти, в каком городе больше жителей, чей результат в игре выше. Натуральные числа сравнивать легко — нужно лишь знать два простых правила.</p>');
h+=makeCard('rule','Как сравнивать натуральные числа','3.1',
'<p>1) Из двух чисел больше то, в записи которого <b>больше цифр</b> (без лишних нулей слева): $1000>999$.</p>'
+'<p>2) Если цифр <b>поровну</b> — сравнивают <b>поразрядно слева направо</b>: на первом же различии больше то число, у которого цифра больше.</p>'
+'<p>Знаки: $<$ «меньше», $>$ «больше», $=$ «равно». Острый угол знака всегда «смотрит» на меньшее число.</p>');
h+=makeCard('example','Примеры','3.2',
'<p>$58>9$ (две цифры против одной). &nbsp; $347<352$ (сотни равны, десятки $4<5$). &nbsp; $1\\,200>1\\,199$.</p>');
h+=makeCard('example','Разбор по шагам','3.3',
'<p>Сравним $4\\,019$ и $4\\,190$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Цифр поровну — по $4$. Сравниваем поразрядно.</li>'
+'<li>Тысячи: $4=4$. Сотни: $0<1$ — на этом различии всё решается.</li>'
+'<li>Значит $4\\,019<4\\,190$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','3.4',
'<p>Знаки $>$ и $<$ придумал английский математик <b>Томас Хэрриот</b> (изданы в $1631$ году). А знак равенства $=$ ещё раньше, в $1557$ году, предложил Роберт Рекорд: «нет двух вещей более равных, чем две параллельные чёрточки».</p>');
h+='<div class="wg" id="p3-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Поставь знак</div></div>'
+'<div class="wg-help">Сравни два числа и выбери верный знак.</div>'
+'<div class="score-display"><span>Вопрос <b id="p3-i">1</b> / 6</span><span>Очки: <b id="p3-s">0</b> / 6</span></div>'
+'<div id="p3-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-cmp="&gt;">&gt;</button><button class="btn primary" data-cmp="=">=</button><button class="btn primary" data-cmp="&lt;">&lt;</button></div>'
+'<div class="feedback" id="p3-fb"></div></div>';
h+='<div class="wg" id="p3-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Выбери наибольшее</div></div>'
+'<div class="wg-help">Из четырёх чисел нажми самое большое.</div>'
+'<div class="score-display"><span>Вопрос <b id="p3-mi">1</b> / 5</span><span>Очки: <b id="p3-ms">0</b> / 5</span></div>'
+'<div id="p3-mq" style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin:10px 0"></div>'
+'<div class="feedback" id="p3-mfb"></div></div>';
h+=secNav('p2','p4')+readBtn('p3');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ var a,b; if(_ri(0,3)===0){ a=_ri(10,9999); b=a; } else { a=_ri(10,9999); b=_ri(10,9999); } cur={a:a,b:b}; }
function show(){ if(i>=6){ document.getElementById('p3-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p3-iv1');bumpProgress('p3',30);}else if(score>=3){addXp(8,'p3-iv1');bumpProgress('p3',16);} return; }
gen(); document.getElementById('p3-i').textContent=i+1;
document.getElementById('p3-q').innerHTML='$'+_grp(cur.a)+' \\;\\square\\; '+_grp(cur.b)+'$'; renderMath(document.getElementById('p3-q'));
document.getElementById('p3-fb').style.display='none'; }
function ans(sym){ if(i>=6)return; var fb=document.getElementById('p3-fb'), correct=cur.a>cur.b?'>':(cur.a<cur.b?'<':'=');
if(sym===correct){ score++; feedback(fb,true,'✓ Верно: $'+_grp(cur.a)+' '+correct+' '+_grp(cur.b)+'$.'); } else feedback(fb,false,'✗ Нет. Верно: $'+_grp(cur.a)+' '+correct+' '+_grp(cur.b)+'$.');
document.getElementById('p3-s').textContent=score; i++; setTimeout(show,1100); }
document.querySelectorAll('#p3-iv1 [data-cmp]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-cmp')); }); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var arr=[],mx=_ri(1000,99999); arr.push(mx); while(arr.length<4){ var x=_ri(100,99999); if(x!==mx&&arr.indexOf(x)<0)arr.push(x); } for(var j=arr.length-1;j>0;j--){ var k=_ri(0,j),t=arr[j];arr[j]=arr[k];arr[k]=t; } cur={arr:arr,max:mx}; }
function show(){ if(i>=5){ document.getElementById('p3-mq').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p3-iv2');bumpProgress('p3',30);}else if(score>=2){addXp(8,'p3-iv2');bumpProgress('p3',16);} return; }
gen(); document.getElementById('p3-mi').textContent=i+1;
var html=''; cur.arr.forEach(function(x){ html+='<button class="btn primary" data-x="'+x+'">'+x.toLocaleString('ru-RU')+'</button>'; });
document.getElementById('p3-mq').innerHTML=html;
document.querySelectorAll('#p3-mq [data-x]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-x')); }); });
document.getElementById('p3-mfb').style.display='none'; }
function ans(x){ if(i>=5)return; var fb=document.getElementById('p3-mfb');
if(x===cur.max){ score++; feedback(fb,true,'✓ Верно! Наибольшее — '+cur.max.toLocaleString('ru-RU')+'.'); } else feedback(fb,false,'✗ Нет. Наибольшее — '+cur.max.toLocaleString('ru-RU')+'.');
document.getElementById('p3-ms').textContent=score; i++; setTimeout(show,1100); }
show();
})();
}
/* ===================== § 4. ТОЧКА, ПРЯМАЯ, ЛУЧ, ОТРЕЗОК, ПЛОСКОСТЬ ===================== */
function buildP4(){
var box=document.getElementById('p4-body'); var h='';
h+=makeCard('oral','Где это в жизни','4.0',
'<p>Геометрия начинается с простых образов. Натянутая нить — это <b>отрезок</b>, луч прожектора уходит в небо как <b>луч</b>, ровная гладь озера — кусочек <b>плоскости</b>, а кончик карандаша оставляет <b>точку</b>. Из этих «кирпичиков» строят все чертежи.</p>');
h+=makeCard('theory','Главные геометрические фигуры','4.1',
'<p><b>Точка</b> — самая простая фигура, у неё нет размеров. Обозначают большой буквой: $A$, $B$.</p>'
+'<p><b>Прямая</b> бесконечна в обе стороны. Обозначают малой буквой $a$ или двумя точками: прямая $AB$.</p>'
+'<p><b>Луч</b> имеет начало и уходит в бесконечность в одну сторону. Обозначают $OA$ (первой ставят <b>начало</b> $O$).</p>'
+'<p><b>Отрезок</b> — часть прямой между двумя точками-концами: отрезок $AB$.</p>'
+'<p><b>Плоскость</b> — бесконечная ровная поверхность (например, поверхность стола, продолженная во все стороны).</p>');
h+=makeCard('rule','Сколько фигур можно провести','4.2',
'<p>Через одну точку можно провести <b>сколько угодно</b> прямых. А через <b>две</b> точки — <b>только одну</b> прямую. Это важное свойство прямой.</p>');
h+=makeCard('example','Разбор по шагам','4.3',
'<p>На прямой отметили $4$ точки: $A, B, C, D$. Сколько получилось отрезков?</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Отрезок задаётся <b>двумя</b> точками-концами.</li>'
+'<li>Считаем пары: $AB, AC, AD, BC, BD, CD$.</li>'
+'<li>Получилось $6$ отрезков.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','4.4',
'<p>Около $2300$ лет назад древнегреческий учёный <b>Евклид</b> написал книгу «Начала», с которой и начинается геометрия. Он первым строго описал точку, прямую и плоскость. По «Началам» учились более двух тысяч лет — это один из самых издаваемых учебников в истории!</p>');
h+='<div class="wg" id="p4-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Что изображено?</div></div>'
+'<div class="wg-help">Определи фигуру по рисунку.</div>'
+'<div class="score-display"><span>Вопрос <b id="p4-i">1</b> / 5</span><span>Очки: <b id="p4-s">0</b> / 5</span></div>'
+'<div id="p4-fig" style="text-align:center;margin:8px 0"></div>'
+'<div style="display:flex;gap:8px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-f="точка">точка</button><button class="btn primary" data-f="прямая">прямая</button><button class="btn primary" data-f="луч">луч</button><button class="btn primary" data-f="отрезок">отрезок</button></div>'
+'<div class="feedback" id="p4-fb"></div></div>';
h+='<div class="wg" id="p4-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Сколько отрезков?</div></div>'
+'<div class="wg-help">На прямой отмечено несколько точек. Сколько всего отрезков они задают?</div>'
+'<div class="score-display"><span>Вопрос <b id="p4-ci">1</b> / 5</span><span>Очки: <b id="p4-cs">0</b> / 5</span></div>'
+'<div id="p4-cfig" style="text-align:center;margin:8px 0"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p4-ca" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p4-cgo">Проверить</button></div>'
+'<div class="feedback" id="p4-cfb"></div></div>';
h+=secNav('p3','p5')+readBtn('p4');
box.innerHTML=h; renderMath(box);
function figSVG(type){
var W=300,H=70,y=40;
var s='<svg viewBox="0 0 '+W+' '+H+'" width="300" style="max-width:100%"><defs></defs>';
if(type==='точка'){ s+='<circle cx="150" cy="'+y+'" r="5" fill="#4f46e5"/><text x="160" y="'+(y-6)+'" font-size="13" font-weight="700" fill="#4f46e5">A</text>'; }
else if(type==='прямая'){ s+='<line x1="14" y1="'+y+'" x2="286" y2="'+y+'" stroke="#4f46e5" stroke-width="2.4"/><polygon points="14,'+y+' 22,'+(y-4)+' 22,'+(y+4)+'" fill="#4f46e5"/><polygon points="286,'+y+' 278,'+(y-4)+' 278,'+(y+4)+'" fill="#4f46e5"/>'; }
else if(type==='луч'){ s+='<line x1="60" y1="'+y+'" x2="286" y2="'+y+'" stroke="#0d9488" stroke-width="2.4"/><circle cx="60" cy="'+y+'" r="4.5" fill="#0d9488"/><polygon points="286,'+y+' 278,'+(y-4)+' 278,'+(y+4)+'" fill="#0d9488"/><text x="50" y="'+(y-8)+'" font-size="13" font-weight="700" fill="#0d9488">O</text>'; }
else { s+='<line x1="70" y1="'+y+'" x2="230" y2="'+y+'" stroke="#e11d48" stroke-width="2.6"/><circle cx="70" cy="'+y+'" r="4.5" fill="#e11d48"/><circle cx="230" cy="'+y+'" r="4.5" fill="#e11d48"/><text x="62" y="'+(y-8)+'" font-size="13" font-weight="700" fill="#e11d48">A</text><text x="224" y="'+(y-8)+'" font-size="13" font-weight="700" fill="#e11d48">B</text>'; }
return s+'</svg>';
}
(function(){
var T=['точка','прямая','луч','отрезок'];
var i=0,score=0,cur=null;
function gen(){ cur=_pick(T); }
function show(){ if(i>=5){ document.getElementById('p4-fig').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p4-iv1');bumpProgress('p4',30);}else if(score>=2){addXp(8,'p4-iv1');bumpProgress('p4',16);} return; }
gen(); document.getElementById('p4-i').textContent=i+1;
document.getElementById('p4-fig').innerHTML=figSVG(cur);
document.getElementById('p4-fb').style.display='none'; }
function ans(f){ if(i>=5)return; var fb=document.getElementById('p4-fb');
if(f===cur){ score++; feedback(fb,true,'✓ Верно — это '+cur+'.'); } else feedback(fb,false,'✗ Нет. Это '+cur+'.');
document.getElementById('p4-s').textContent=score; i++; setTimeout(show,1100); }
document.querySelectorAll('#p4-iv1 [data-f]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-f')); }); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var n=_ri(3,6); cur={n:n, ans:n*(n-1)/2}; }
function show(){ if(i>=5){ document.getElementById('p4-cfig').innerHTML='<b>Готово! '+score+' / 5</b>'; document.getElementById('p4-cq')&&0; if(score>=4){addXp(15,'p4-iv2');bumpProgress('p4',30);}else if(score>=2){addXp(8,'p4-iv2');bumpProgress('p4',16);} return; }
gen(); document.getElementById('p4-ci').textContent=i+1;
var W=300,y=30,names=['A','B','C','D','E','F'],s='<svg viewBox="0 0 '+W+' 50" width="300" style="max-width:100%"><line x1="20" y1="'+y+'" x2="280" y2="'+y+'" stroke="#94a3b8" stroke-width="2"/>';
for(var k=0;k<cur.n;k++){ var x=20+260*k/(cur.n-1); s+='<circle cx="'+x+'" cy="'+y+'" r="4.5" fill="#4f46e5"/><text x="'+x+'" y="'+(y-9)+'" font-size="12" font-weight="700" fill="#4f46e5" text-anchor="middle">'+names[k]+'</text>'; }
s+='</svg>';
document.getElementById('p4-cfig').innerHTML=s;
document.getElementById('p4-ca').value=''; document.getElementById('p4-cfb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p4-cfb'), a=parseInt(document.getElementById('p4-ca').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! '+cur.n+' точки задают '+cur.ans+' отрезков.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+' (пары из '+cur.n+' точек).');
document.getElementById('p4-cs').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p4-cgo').addEventListener('click',go);
document.getElementById('p4-ca').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 5. ИЗМЕРЕНИЕ ОТРЕЗКОВ. ДЛИНА ===================== */
function buildP5(){
var box=document.getElementById('p5-body'); var h='';
h+=makeCard('oral','Где это в жизни','5.0',
'<p>Длину измеряют каждый день: рост на медосмотре, размер стола, расстояние до школы, длину доски при ремонте. Чтобы понять друг друга, люди договорились о единых <b>единицах длины</b>.</p>');
h+=makeCard('rule','Единицы длины','5.1',
'<p>$1$ см $=10$ мм, &nbsp; $1$ дм $=10$ см, &nbsp; $1$ м $=10$ дм $=100$ см $=1000$ мм, &nbsp; $1$ км $=1000$ м.</p>'
+'<p><b>Длина отрезка</b> — это число, которое показывает, сколько раз в нём укладывается единичный отрезок (например, $1$ см). Равные отрезки имеют равные длины.</p>');
h+=makeCard('example','Примеры перевода','5.2',
'<p>$3$ см $=30$ мм. &nbsp; $250$ см $=2$ м $50$ см. &nbsp; $1$ м $7$ см $=107$ см.</p>');
h+=makeCard('example','Разбор по шагам','5.3',
'<p>Вырази $3$ м $5$ см в сантиметрах.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>$1$ м $=100$ см, значит $3$ м $=300$ см.</li>'
+'<li>Добавляем оставшиеся $5$ см: $300+5$.</li>'
+'<li>Ответ: $3$ м $5$ см $=305$ см.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','5.4',
'<p>Раньше длину мерили частями тела: локоть, ладонь, фут («ступня»). Но у всех они разные! Поэтому в $1799$ году ввели <b>метр</b>. Сегодня метр определяют через скорость света — это самый точный эталон длины в мире.</p>');
h+='<div class="wg" id="p5-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Измерь отрезок линейкой</div></div>'
+'<div class="wg-help">Посмотри, до какого деления линейки доходит цветной отрезок, и введи его длину в сантиметрах.</div>'
+'<div class="score-display"><span>Вопрос <b id="p5-i">1</b> / 5</span><span>Очки: <b id="p5-s">0</b> / 5</span></div>'
+'<div id="p5-fig" style="text-align:center;margin:8px 0;overflow-x:auto"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p5-a" class="tinp" style="width:90px;text-align:center" min="0"><span>см</span><button class="btn primary" id="p5-go">Проверить</button></div>'
+'<div class="feedback" id="p5-fb"></div></div>';
h+='<div class="wg" id="p5-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Перевод единиц длины</div></div>'
+'<div class="wg-help">Вырази длину в указанных единицах. Ответ — число.</div>'
+'<div class="score-display"><span>Вопрос <b id="p5-ui">1</b> / 6</span><span>Очки: <b id="p5-us">0</b> / 6</span></div>'
+'<div id="p5-uq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p5-ua" class="tinp" style="width:110px;text-align:center"><button class="btn primary" id="p5-ugo">Проверить</button></div>'
+'<div class="feedback" id="p5-ufb"></div></div>';
h+=secNav('p4','p6')+readBtn('p5');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ cur=_ri(2,14); }
function show(){ if(i>=5){ document.getElementById('p5-fig').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p5-iv1');bumpProgress('p5',30);}else if(score>=2){addXp(8,'p5-iv1');bumpProgress('p5',16);} return; }
gen(); document.getElementById('p5-i').textContent=i+1;
var x0=20,unit=18,W=x0+15*unit+24,H=64,yr=44;
var s='<svg viewBox="0 0 '+W+' '+H+'" width="'+W+'" style="max-width:100%"><rect x="'+x0+'" y="'+yr+'" width="'+(15*unit)+'" height="16" fill="#fef3c7" stroke="#d97706"/>';
for(var k=0;k<=15;k++){ var x=x0+k*unit; s+='<line x1="'+x+'" y1="'+yr+'" x2="'+x+'" y2="'+(yr+(k%5===0?16:9))+'" stroke="#92400e" stroke-width="1"/>'; if(k%5===0)s+='<text x="'+x+'" y="'+(yr-3)+'" font-size="9" fill="#92400e" text-anchor="middle">'+k+'</text>'; }
s+='<line x1="'+x0+'" y1="32" x2="'+(x0+cur*unit)+'" y2="32" stroke="#4f46e5" stroke-width="5" stroke-linecap="round"/>';
s+='</svg>';
document.getElementById('p5-fig').innerHTML=s;
document.getElementById('p5-a').value=''; document.getElementById('p5-fb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p5-fb'), a=parseInt(document.getElementById('p5-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur){ score++; feedback(fb,true,'✓ Верно! Длина '+cur+' см.'); } else feedback(fb,false,'✗ Нет. Отрезок доходит до '+cur+' см.');
document.getElementById('p5-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p5-go').addEventListener('click',go);
document.getElementById('p5-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var t=_ri(0,3),a;
if(t===0){ a=_ri(2,9); cur={q:a+'\\text{ см} = \\square \\text{ мм}',ans:a*10}; }
else if(t===1){ a=_ri(2,9); cur={q:a+'\\text{ м} = \\square \\text{ см}',ans:a*100}; }
else if(t===2){ var m=_ri(1,5),c=_ri(5,95); cur={q:m+'\\text{ м } '+c+'\\text{ см} = \\square \\text{ см}',ans:m*100+c}; }
else { a=_ri(2,9); cur={q:a+'\\text{ км} = \\square \\text{ м}',ans:a*1000}; } }
function show(){ if(i>=6){ document.getElementById('p5-uq').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p5-iv2');bumpProgress('p5',30);}else if(score>=3){addXp(8,'p5-iv2');bumpProgress('p5',16);} return; }
gen(); document.getElementById('p5-ui').textContent=i+1;
document.getElementById('p5-uq').innerHTML='$'+cur.q+'$'; renderMath(document.getElementById('p5-uq'));
document.getElementById('p5-ua').value=''; document.getElementById('p5-ufb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p5-ufb'), a=parseInt(document.getElementById('p5-ua').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
document.getElementById('p5-us').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p5-ugo').addEventListener('click',go);
document.getElementById('p5-ua').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 6. КООРДИНАТНЫЙ ЛУЧ ===================== */
function buildP6(){
var box=document.getElementById('p6-body'); var h='';
h+=makeCard('oral','Где это в жизни','6.0',
'<p>Линейка, шкала термометра, разметка на стадионе, числовая ось в играх-«ходилках» — всё это <b>координатные лучи</b>. Каждому числу соответствует своя точка, и наоборот.</p>');
h+=makeCard('theory','Что такое координатный луч','6.1',
'<p><b>Координатный луч</b> — это луч, на котором выбрали: начало $O$ (ему соответствует число $0$), <b>направление</b> (обычно вправо) и <b>единичный отрезок</b>.</p>'
+'<p>Число, соответствующее точке, называют её <b>координатой</b>. Запись $A(3)$ означает: точка $A$ имеет координату $3$.</p>');
h+=makeCard('rule','Как отметить число','6.2',
'<p>Чтобы отметить число $5$, откладывают от начала $O$ пять единичных отрезков вправо. Чем больше число — тем правее точка. Поэтому на луче из двух чисел больше то, что <b>правее</b>.</p>');
h+=makeCard('example','Разбор по шагам','6.3',
'<p>Отметим число $7$ на координатном луче с единичным отрезком в одну клетку.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Ставим начало $O$ и число $0$.</li>'
+'<li>Откладываем вправо $7$ единичных отрезков.</li>'
+'<li>В конце ставим точку и подписываем $A(7)$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','6.4',
'<p>Идею изображать числа точками на прямой развил французский математик <b>Рене Декарт</b> в XVII веке. Позже из координатного луча выросла целая координатная плоскость — её ты изучишь в $6$ классе.</p>');
h+='<div class="wg" id="p6-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Назови координату</div></div>'
+'<div class="wg-help">Какое число соответствует отмеченной точке?</div>'
+'<div class="score-display"><span>Вопрос <b id="p6-i">1</b> / 6</span><span>Очки: <b id="p6-s">0</b> / 6</span></div>'
+'<div id="p6-fig"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p6-a" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p6-go">Проверить</button></div>'
+'<div class="feedback" id="p6-fb"></div></div>';
h+='<div class="wg" id="p6-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Расстояние между точками</div></div>'
+'<div class="wg-help">На сколько единичных отрезков одна точка дальше другой?</div>'
+'<div class="score-display"><span>Вопрос <b id="p6-di">1</b> / 5</span><span>Очки: <b id="p6-ds">0</b> / 5</span></div>'
+'<div id="p6-dfig"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p6-da" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p6-dgo">Проверить</button></div>'
+'<div class="feedback" id="p6-dfb"></div></div>';
h+=secNav('p5','p7')+readBtn('p6');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ cur=_ri(1,10); }
function show(){ if(i>=6){ document.getElementById('p6-fig').innerHTML=''; document.getElementById('p6-fb').className='feedback'; document.getElementById('p6-fb').style.display='block'; document.getElementById('p6-fb').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p6-iv1');bumpProgress('p6',30);}else if(score>=3){addXp(8,'p6-iv1');bumpProgress('p6',16);} return; }
gen(); document.getElementById('p6-i').textContent=i+1;
document.getElementById('p6-fig').innerHTML=Math6.numberLine({min:0,max:11,minor:1,major:1,width:560,ray:true,marks:[{v:cur,label:'A',color:'#4f46e5'}]});
document.getElementById('p6-a').value=''; document.getElementById('p6-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p6-fb'), a=parseInt(document.getElementById('p6-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur){ score++; feedback(fb,true,'✓ Верно! Координата точки A равна '+cur+'.'); } else feedback(fb,false,'✗ Нет. Координата A равна '+cur+'.');
document.getElementById('p6-s').textContent=score; i++; setTimeout(show,1100); }
document.getElementById('p6-go').addEventListener('click',go);
document.getElementById('p6-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var a=_ri(1,5), b=_ri(6,11); cur={a:a,b:b,d:b-a}; }
function show(){ if(i>=5){ document.getElementById('p6-dfig').innerHTML=''; var fb0=document.getElementById('p6-dfb'); fb0.className='feedback'; fb0.style.display='block'; fb0.innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p6-iv2');bumpProgress('p6',30);}else if(score>=2){addXp(8,'p6-iv2');bumpProgress('p6',16);} return; }
gen(); document.getElementById('p6-di').textContent=i+1;
document.getElementById('p6-dfig').innerHTML=Math6.numberLine({min:0,max:11,minor:1,major:1,width:560,ray:true,marks:[{v:cur.a,label:'A',color:'#4f46e5'},{v:cur.b,label:'B',color:'#e11d48',above:false}]});
document.getElementById('p6-da').value=''; document.getElementById('p6-dfb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p6-dfb'), a=parseInt(document.getElementById('p6-da').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.d){ score++; feedback(fb,true,'✓ Верно! Расстояние '+cur.d+' (от '+cur.a+' до '+cur.b+').'); } else feedback(fb,false,'✗ Нет. Расстояние '+cur.d+' = '+cur.b+' '+cur.a+'.');
document.getElementById('p6-ds').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p6-dgo').addEventListener('click',go);
document.getElementById('p6-da').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 7. ОКРУГЛЕНИЕ НАТУРАЛЬНЫХ ЧИСЕЛ ===================== */
function buildP7(){
var box=document.getElementById('p7-body'); var h='';
h+=makeCard('oral','Где это в жизни','7.0',
'<p>Точные числа в новостях встречаются редко: говорят «около $8$ миллиардов человек», «примерно $300$ км до моря», «в зале почти $1000$ зрителей». Это <b>округлённые</b> числа — так их проще воспринимать и запоминать.</p>');
h+=makeCard('rule','Правило округления','7.1',
'<p>Чтобы округлить число до некоторого разряда, смотрят на <b>следующую</b> (младшую) цифру:</p>'
+'<ul style="padding-left:22px;line-height:1.9"><li>если она $0,1,2,3,4$ — разряд <b>оставляют</b>;</li>'
+'<li>если она $5,6,7,8,9$ — разряд <b>увеличивают на 1</b>.</li></ul>'
+'<p>Все цифры младших разрядов заменяют <b>нулями</b>. Знак приближённого равенства — $\\approx$.</p>');
h+=makeCard('example','Примеры','7.2',
'<p>$47\\approx 50$ (до десятков). &nbsp; $432\\approx 400$ (до сотен). &nbsp; $6\\,500\\approx 7\\,000$ (до тысяч).</p>');
h+=makeCard('example','Разбор по шагам','7.3',
'<p>Округлим $3\\,472$ до сотен.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Разряд сотен — цифра $4$ (в $3\\,\\underline{4}72$).</li>'
+'<li>Следующая цифра — десятки $7$. Так как $7\\ge 5$, сотни увеличиваем: $4\\to 5$.</li>'
+'<li>Младшие разряды — нули: $3\\,500$.</li>'
+'<li>Ответ: $3\\,472\\approx 3\\,500$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','7.4',
'<p>Округление помогает быстро <b>прикинуть</b> ответ и проверить себя. Если в магазине $19$ товаров примерно по $50$ копеек, то в уме: $20\\cdot 50=1000$ к. $=10$ руб. — значит, итог должен быть около $10$ рублей.</p>');
h+='<div class="wg" id="p7-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Округли до десятков</div></div>'
+'<div class="wg-help">Точка показывает число на луче. Округли его до ближайшего десятка.</div>'
+'<div class="score-display"><span>Вопрос <b id="p7-i">1</b> / 6</span><span>Очки: <b id="p7-s">0</b> / 6</span></div>'
+'<div id="p7-fig"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p7-a" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p7-go">Проверить</button></div>'
+'<div class="feedback" id="p7-fb"></div></div>';
h+='<div class="wg" id="p7-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Округли до разряда</div></div>'
+'<div class="wg-help">Округли большое число до указанного разряда.</div>'
+'<div class="score-display"><span>Вопрос <b id="p7-ri">1</b> / 6</span><span>Очки: <b id="p7-rs">0</b> / 6</span></div>'
+'<div id="p7-rq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p7-ra" class="tinp" style="width:120px;text-align:center"><button class="btn primary" id="p7-rgo">Проверить</button></div>'
+'<div class="feedback" id="p7-rfb"></div></div>';
h+=secNav('p6','p8')+readBtn('p7');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ cur=_ri(11,89); }
function show(){ if(i>=6){ document.getElementById('p7-fig').innerHTML=''; var fb0=document.getElementById('p7-fb'); fb0.className='feedback'; fb0.style.display='block'; fb0.innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p7-iv1');bumpProgress('p7',30);}else if(score>=3){addXp(8,'p7-iv1');bumpProgress('p7',16);} return; }
gen(); document.getElementById('p7-i').textContent=i+1;
document.getElementById('p7-fig').innerHTML=Math6.numberLine({min:0,max:100,minor:10,major:10,width:560,marks:[{v:cur,label:''+cur,color:'#4f46e5'}]});
document.getElementById('p7-a').value=''; document.getElementById('p7-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p7-fb'), a=parseInt(document.getElementById('p7-a').value,10), correct=Math.round(cur/10)*10;
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===correct){ score++; feedback(fb,true,'✓ Верно! $'+cur+'\\approx '+correct+'$.'); renderMath(fb); } else { feedback(fb,false,'✗ Нет. $'+cur+'\\approx '+correct+'$.'); renderMath(fb); }
document.getElementById('p7-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p7-go').addEventListener('click',go);
document.getElementById('p7-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var t=_ri(0,1); if(t===0){ var n=_ri(1050,8950); cur={n:n,pl:'сотен',ans:Math.round(n/100)*100}; } else { var m=_ri(11500,98500); cur={n:m,pl:'тысяч',ans:Math.round(m/1000)*1000}; } }
function show(){ if(i>=6){ document.getElementById('p7-rq').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p7-iv2');bumpProgress('p7',30);}else if(score>=3){addXp(8,'p7-iv2');bumpProgress('p7',16);} return; }
gen(); document.getElementById('p7-ri').textContent=i+1;
document.getElementById('p7-rq').innerHTML='Округли $'+_grp(cur.n)+'$ до <b>'+cur.pl+'</b>.'; renderMath(document.getElementById('p7-rq'));
document.getElementById('p7-ra').value=''; document.getElementById('p7-rfb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p7-rfb'), a=parseInt(document.getElementById('p7-ra').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
document.getElementById('p7-rs').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p7-rgo').addEventListener('click',go);
document.getElementById('p7-ra').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 8. СЛОЖЕНИЕ И ВЫЧИТАНИЕ ===================== */
function buildP8(){
var box=document.getElementById('p8-body'); var h='';
h+=makeCard('oral','Где это в жизни','8.0',
'<p>Сложение и вычитание — самые частые действия: сложить стоимость покупок, посчитать сдачу, узнать, на сколько один город больше другого, сколько осталось денег после трат.</p>');
h+=makeCard('rule','Сложение и вычитание «в столбик»','8.1',
'<p>Числа записывают <b>разряд под разрядом</b> (единицы под единицами). Складывают справа налево; если в разряде получилось $10$ или больше — <b>переносят</b> единицу в следующий разряд.</p>'
+'<p>При вычитании, если цифр не хватает, <b>занимают</b> единицу у старшего разряда.</p>');
h+=makeCard('rule','Полезные свойства','8.2',
'<p><b>Переместительное:</b> $a+b=b+a$. &nbsp; <b>Сочетательное:</b> $(a+b)+c=a+(b+c)$.</p>'
+'<p>Ими удобно пользоваться для быстрого счёта: $37+99=37+100-1=136$.</p>');
h+=makeCard('example','Разбор по шагам','8.3',
'<p>Вычислим $3\\,472+1\\,859$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Единицы: $2+9=11$ — пишем $1$, переносим $1$.</li>'
+'<li>Десятки: $7+5+1=13$ — пишем $3$, переносим $1$.</li>'
+'<li>Сотни: $4+8+1=13$ — пишем $3$, переносим $1$.</li>'
+'<li>Тысячи: $3+1+1=5$. Ответ: $5\\,331$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','8.4',
'<p>Знаки $+$ и $-$ впервые напечатал немецкий математик Иоганн Видман в $1489$ году в книге по торговым расчётам. До этого сложение писали словом «et» (по-латыни «и»).</p>');
h+='<div class="wg" id="p8-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Сложение и вычитание</div></div>'
+'<div class="wg-help">Вычисли значение выражения и введи ответ.</div>'
+'<div class="score-display"><span>Пример <b id="p8-i">1</b> / 6</span><span>Очки: <b id="p8-s">0</b> / 6</span></div>'
+'<div id="p8-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p8-a" class="tinp" style="width:130px;text-align:center"><button class="btn primary" id="p8-go">Проверить</button></div>'
+'<div class="feedback" id="p8-fb"></div></div>';
h+='<div class="wg" id="p8-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Найди неизвестное</div></div>'
+'<div class="wg-help">Найди число, спрятанное под квадратом. Это подготовка к уравнениям!</div>'
+'<div class="score-display"><span>Вопрос <b id="p8-xi">1</b> / 5</span><span>Очки: <b id="p8-xs">0</b> / 5</span></div>'
+'<div id="p8-xq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p8-xa" class="tinp" style="width:110px;text-align:center"><button class="btn primary" id="p8-xgo">Проверить</button></div>'
+'<div class="feedback" id="p8-xfb"></div></div>';
h+=secNav('p7','p9')+readBtn('p8');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ var a=_ri(150,4800), b=_ri(120,3900); if(_ri(0,1)===0)cur={t:'+',a:a,b:b,ans:a+b}; else { if(b>a){var x=a;a=b;b=x;} cur={t:'',a:a,b:b,ans:a-b}; } }
function show(){ if(i>=6){ document.getElementById('p8-q').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p8-iv1');bumpProgress('p8',30);}else if(score>=3){addXp(8,'p8-iv1');bumpProgress('p8',16);} return; }
gen(); document.getElementById('p8-i').textContent=i+1;
document.getElementById('p8-q').innerHTML='$'+_grp(cur.a)+' '+cur.t+' '+_grp(cur.b)+'$'; renderMath(document.getElementById('p8-q'));
document.getElementById('p8-a').value=''; document.getElementById('p8-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p8-fb'), a=parseInt(document.getElementById('p8-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
document.getElementById('p8-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p8-go').addEventListener('click',go);
document.getElementById('p8-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var a=_ri(12,80), x=_ri(13,90); var t=_ri(0,2);
if(t===0)cur={q:'\\square + '+a+' = '+(a+x),ans:x};
else if(t===1)cur={q:a+' + \\square = '+(a+x),ans:x};
else cur={q:'\\square - '+a+' = '+x,ans:a+x}; }
function show(){ if(i>=5){ document.getElementById('p8-xq').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p8-iv2');bumpProgress('p8',30);}else if(score>=2){addXp(8,'p8-iv2');bumpProgress('p8',16);} return; }
gen(); document.getElementById('p8-xi').textContent=i+1;
document.getElementById('p8-xq').innerHTML='$'+cur.q+'$'; renderMath(document.getElementById('p8-xq'));
document.getElementById('p8-xa').value=''; document.getElementById('p8-xfb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p8-xfb'), a=parseInt(document.getElementById('p8-xa').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Под квадратом '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
document.getElementById('p8-xs').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p8-xgo').addEventListener('click',go);
document.getElementById('p8-xa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 9. УМНОЖЕНИЕ И ДЕЛЕНИЕ ===================== */
function buildP9(){
var box=document.getElementById('p9-body'); var h='';
h+=makeCard('oral','Где это в жизни','9.0',
'<p>Умножение — это быстрое сложение одинаковых слагаемых: $6$ пачек по $8$ карандашей — это $6\\cdot 8=48$. Деление — обратное действие: $48$ карандашей разложить в $6$ пачек поровну — по $8$.</p>');
h+=makeCard('rule','Умножение и деление','9.1',
'<p><b>Умножение «в столбик»:</b> умножают на каждую цифру второго множителя, потом складывают со сдвигом.</p>'
+'<p><b>Деление «уголком»:</b> делят старшие разряды, сносят следующие цифры. Проверка: $\\text{частное}\\cdot\\text{делитель}=\\text{делимое}$.</p>'
+'<p><b>Свойства:</b> $a\\cdot b=b\\cdot a$; &nbsp; $a\\cdot(b+c)=a\\cdot b+a\\cdot c$ (распределительное).</p>');
h+=makeCard('example','Разбор по шагам','9.2',
'<p>Вычислим $156:12$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>$15$ десятков делим на $12$ — по $1$ десятку ($12$), остаток $3$ десятка.</li>'
+'<li>Сносим $6$: получаем $36$ единиц.</li>'
+'<li>$36:12=3$. Записываем рядом.</li>'
+'<li>Ответ: $156:12=13$. Проверка: $13\\cdot 12=156$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','9.3',
'<p>Знак умножения «крестиком» $\\times$ ввёл Уильям Отред в $1631$ году, а точку $\\cdot$ предложил Готфрид Лейбниц, чтобы крестик не путали с буквой $x$. Поэтому в алгебре чаще пишут точку.</p>');
h+='<div class="wg" id="p9-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Умножение как прямоугольник</div></div>'
+'<div class="wg-help">Точки выстроены в прямоугольник: $a$ строк по $b$ точек. Сколько всего?</div>'
+'<div class="score-display"><span>Вопрос <b id="p9-i">1</b> / 6</span><span>Очки: <b id="p9-s">0</b> / 6</span></div>'
+'<div id="p9-fig" style="text-align:center;margin:8px 0;overflow-x:auto"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p9-a" class="tinp" style="width:90px;text-align:center"><button class="btn primary" id="p9-go">Проверить</button></div>'
+'<div class="feedback" id="p9-fb"></div></div>';
h+='<div class="wg" id="p9-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Умножай и дели</div></div>'
+'<div class="wg-help">Вычисли значение выражения.</div>'
+'<div class="score-display"><span>Пример <b id="p9-mi">1</b> / 6</span><span>Очки: <b id="p9-ms">0</b> / 6</span></div>'
+'<div id="p9-mq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p9-ma" class="tinp" style="width:120px;text-align:center"><button class="btn primary" id="p9-mgo">Проверить</button></div>'
+'<div class="feedback" id="p9-mfb"></div></div>';
h+=secNav('p8','p10')+readBtn('p9');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function arrSVG(a,b){ var u=16,x0=14,y0=12,W=x0*2+b*u,H=y0*2+a*u; var s='<svg viewBox="0 0 '+W+' '+H+'" width="'+Math.min(W,360)+'" style="max-width:100%">';
for(var r=0;r<a;r++)for(var c=0;c<b;c++){ s+='<circle cx="'+(x0+c*u)+'" cy="'+(y0+r*u)+'" r="4.5" fill="#4f46e5"/>'; } return s+'</svg>'; }
function gen(){ cur={a:_ri(2,9), b:_ri(2,9)}; cur.ans=cur.a*cur.b; }
function show(){ if(i>=6){ document.getElementById('p9-fig').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p9-iv1');bumpProgress('p9',30);}else if(score>=3){addXp(8,'p9-iv1');bumpProgress('p9',16);} return; }
gen(); document.getElementById('p9-i').textContent=i+1;
document.getElementById('p9-fig').innerHTML=arrSVG(cur.a,cur.b)+'<div style="margin-top:4px;color:var(--muted);font-size:.9rem">'+cur.a+' строк × '+cur.b+' точек</div>';
document.getElementById('p9-a').value=''; document.getElementById('p9-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p9-fb'), a=parseInt(document.getElementById('p9-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! '+cur.a+'·'+cur.b+'='+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. '+cur.a+'·'+cur.b+'='+cur.ans+'.');
document.getElementById('p9-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p9-go').addEventListener('click',go);
document.getElementById('p9-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ if(_ri(0,1)===0){ var a=_ri(12,99),b=_ri(11,40); cur={q:a+' \\cdot '+b,ans:a*b}; } else { var q=_ri(11,40),d=_ri(2,12),n=q*d; cur={q:n+' : '+d,ans:q}; } }
function show(){ if(i>=6){ document.getElementById('p9-mq').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p9-iv2');bumpProgress('p9',30);}else if(score>=3){addXp(8,'p9-iv2');bumpProgress('p9',16);} return; }
gen(); document.getElementById('p9-mi').textContent=i+1;
document.getElementById('p9-mq').innerHTML='$'+cur.q+'$'; renderMath(document.getElementById('p9-mq'));
document.getElementById('p9-ma').value=''; document.getElementById('p9-mfb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p9-mfb'), a=parseInt(document.getElementById('p9-ma').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
document.getElementById('p9-ms').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p9-mgo').addEventListener('click',go);
document.getElementById('p9-ma').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 10. СТЕПЕНЬ ЧИСЛА ===================== */
function buildP10(){
var box=document.getElementById('p10-body'); var h='';
h+=makeCard('oral','Где это в жизни','10.0',
'<p>Степень прячется там, где что-то многократно повторяется. Площадь квадратного ковра со стороной $3$ м — это $3^2=9$ м². Объём кубика со стороной $2$ см — $2^3=8$ см³. А если каждый день репост видят вдвое больше людей — рост идёт степенями двойки.</p>');
h+=makeCard('theory','Что такое степень','10.1',
'<p><b>Степенью</b> числа $a$ с натуральным показателем $n$ называют произведение $n$ одинаковых множителей $a$:</p>'
+'<p>$a^n=\\underbrace{a\\cdot a\\cdot \\ldots \\cdot a}_{n}$. &nbsp; Здесь $a$ — <b>основание</b>, $n$ — <b>показатель</b>.</p>'
+'<p>$a^2$ читают «$a$ в квадрате», $a^3$ — «$a$ в кубе». Принято $a^1=a$.</p>');
h+=makeCard('example','Примеры','10.2',
'<p>$2^3=2\\cdot2\\cdot2=8$. &nbsp; $5^2=25$. &nbsp; $10^4=10\\,000$. &nbsp; $1^{100}=1$.</p>');
h+=makeCard('example','Разбор по шагам','10.3',
'<p>Вычислим $2^4$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Показатель $4$ — берём $4$ множителя: $2\\cdot2\\cdot2\\cdot2$.</li>'
+'<li>$2\\cdot2=4$, затем $4\\cdot2=8$, затем $8\\cdot2=16$.</li>'
+'<li>Ответ: $2^4=16$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','10.4',
'<p>По легенде, изобретатель шахмат попросил у правителя «всего лишь» зёрнышко за первую клетку, $2$ за вторую, $4$ за третью и так далее — удваивая. На $64$-й клетке вышло $2^{63}$ зёрен — больше, чем во всех амбарах мира! Вот как быстро растут степени двойки.</p>');
h+='<div class="wg" id="p10-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Квадрат числа</div></div>'
+'<div class="wg-help">Клетки образуют квадрат со стороной $a$. Сколько всего клеток ($a^2$)?</div>'
+'<div class="score-display"><span>Вопрос <b id="p10-i">1</b> / 5</span><span>Очки: <b id="p10-s">0</b> / 5</span></div>'
+'<div id="p10-fig" style="text-align:center;margin:8px 0"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p10-a" class="tinp" style="width:90px;text-align:center"><button class="btn primary" id="p10-go">Проверить</button></div>'
+'<div class="feedback" id="p10-fb"></div></div>';
h+='<div class="wg" id="p10-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Вычисли степень</div></div>'
+'<div class="wg-help">Вычисли значение степени.</div>'
+'<div class="score-display"><span>Пример <b id="p10-pi">1</b> / 6</span><span>Очки: <b id="p10-ps">0</b> / 6</span></div>'
+'<div id="p10-pq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p10-pa" class="tinp" style="width:120px;text-align:center"><button class="btn primary" id="p10-pgo">Проверить</button></div>'
+'<div class="feedback" id="p10-pfb"></div></div>';
h+=secNav('p9','p11')+readBtn('p10');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function sqSVG(a){ var u=Math.min(26,Math.floor(150/a)),x0=4,W=x0*2+a*u; var s='<svg viewBox="0 0 '+W+' '+W+'" width="'+Math.min(W,220)+'" style="max-width:100%">';
for(var r=0;r<a;r++)for(var c=0;c<a;c++) s+='<rect x="'+(x0+c*u)+'" y="'+(x0+r*u)+'" width="'+(u-2)+'" height="'+(u-2)+'" rx="2" fill="#a5b4fc" stroke="#4f46e5"/>';
return s+'</svg>'; }
function gen(){ cur=_ri(2,9); }
function show(){ if(i>=5){ document.getElementById('p10-fig').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p10-iv1');bumpProgress('p10',30);}else if(score>=2){addXp(8,'p10-iv1');bumpProgress('p10',16);} return; }
gen(); document.getElementById('p10-i').textContent=i+1;
document.getElementById('p10-fig').innerHTML=sqSVG(cur)+'<div style="margin-top:4px;color:var(--muted);font-size:.9rem">сторона '+cur+', значит '+cur+'<sup>2</sup></div>';
document.getElementById('p10-a').value=''; document.getElementById('p10-fb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p10-fb'), a=parseInt(document.getElementById('p10-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur*cur){ score++; feedback(fb,true,'✓ Верно! $'+cur+'^2='+(cur*cur)+'$.'); renderMath(fb); } else { feedback(fb,false,'✗ Нет. $'+cur+'^2='+(cur*cur)+'$.'); renderMath(fb); }
document.getElementById('p10-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p10-go').addEventListener('click',go);
document.getElementById('p10-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var a=_ri(2,7), n=_pick([2,2,3,3,4]); if(a>=6)n=_pick([2,3]); cur={a:a,n:n,ans:Math.pow(a,n)}; }
function show(){ if(i>=6){ document.getElementById('p10-pq').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p10-iv2');bumpProgress('p10',30);}else if(score>=3){addXp(8,'p10-iv2');bumpProgress('p10',16);} return; }
gen(); document.getElementById('p10-pi').textContent=i+1;
document.getElementById('p10-pq').innerHTML='Вычисли $'+cur.a+'^{'+cur.n+'}$'; renderMath(document.getElementById('p10-pq'));
document.getElementById('p10-pa').value=''; document.getElementById('p10-pfb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p10-pfb'), a=parseInt(document.getElementById('p10-pa').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
document.getElementById('p10-ps').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p10-pgo').addEventListener('click',go);
document.getElementById('p10-pa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 11. ДЕЛЕНИЕ С ОСТАТКОМ ===================== */
function buildP11(){
var box=document.getElementById('p11-body'); var h='';
h+=makeCard('oral','Где это в жизни','11.0',
'<p>Разделить $25$ конфет на $4$ детей поровну не получится — по $6$ и ещё одна лишняя. Эта «лишняя» — <b>остаток</b>. Деление с остатком повсюду: дни недели, страницы по тетрадям, ученики по командам.</p>');
h+=makeCard('rule','Деление с остатком','11.1',
'<p>Разделить $a$ на $b$ с остатком — значит найти такие числа $q$ и $r$, что</p>'
+'<p style="text-align:center;font-size:1.1rem">$a = b\\cdot q + r$, &nbsp; где $0\\le r < b$.</p>'
+'<p>$q$ — <b>неполное частное</b>, $r$ — <b>остаток</b>. Остаток всегда <b>меньше делителя</b>.</p>');
h+=makeCard('example','Примеры','11.2',
'<p>$47:5=9$ (ост. $2$), ведь $5\\cdot9+2=47$. &nbsp; $30:6=5$ (ост. $0$) — делится нацело.</p>');
h+=makeCard('example','Разбор по шагам','11.3',
'<p>Разделим $47$ на $5$ с остатком.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Ищем наибольшее число «пятёрок» в $47$: $5\\cdot9=45$, а $5\\cdot10=50$ — уже много.</li>'
+'<li>Значит неполное частное $q=9$.</li>'
+'<li>Остаток: $47-45=2$. Проверяем: $2<5$. Верно.</li>'
+'<li>Ответ: $47=5\\cdot9+2$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','11.4',
'<p>Часы — это деление с остатком! Если сейчас $10$ часов, то через $5$ часов будет не $15$, а $3$ часа: $15:12=1$ (ост. $3$). Математики называют такой счёт «арифметикой остатков», и на ней держится вся компьютерная защита данных.</p>');
h+='<div class="wg" id="p11-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Найди остаток</div></div>'
+'<div class="wg-help">Точки раскладывают по $b$ в ряд. Сколько точек останется в неполном ряду?</div>'
+'<div class="score-display"><span>Вопрос <b id="p11-i">1</b> / 6</span><span>Очки: <b id="p11-s">0</b> / 6</span></div>'
+'<div id="p11-fig" style="text-align:center;margin:8px 0;overflow-x:auto"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p11-a" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p11-go">Проверить</button></div>'
+'<div class="feedback" id="p11-fb"></div></div>';
h+='<div class="wg" id="p11-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Неполное частное</div></div>'
+'<div class="wg-help">Найди неполное частное $q$ (сколько целых раз делитель помещается в делимом).</div>'
+'<div class="score-display"><span>Вопрос <b id="p11-qi">1</b> / 5</span><span>Очки: <b id="p11-qs">0</b> / 5</span></div>'
+'<div id="p11-qq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p11-qa" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p11-qgo">Проверить</button></div>'
+'<div class="feedback" id="p11-qfb"></div></div>';
h+=secNav('p10','p12')+readBtn('p11');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function dotsSVG(a,b){ var u=15,x0=6,cols=b,rows=Math.ceil(a/b),W=x0*2+cols*u,H=x0*2+rows*u; var s='<svg viewBox="0 0 '+W+' '+H+'" width="'+Math.min(W,360)+'" style="max-width:100%">',k=0;
for(var r=0;r<rows;r++)for(var c=0;c<cols;c++){ if(k>=a)break; var rem=k>=a-(a%b||b)&&(a%b)!==0&&r===rows-1; s+='<circle cx="'+(x0+c*u+u/2)+'" cy="'+(x0+r*u+u/2)+'" r="5" fill="'+(rem?'#e11d48':'#4f46e5')+'"/>'; k++; } return s+'</svg>'; }
function gen(){ var b=_ri(3,7), q=_ri(3,8), r=_ri(1,b-1); cur={a:b*q+r,b:b,r:r}; }
function show(){ if(i>=6){ document.getElementById('p11-fig').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p11-iv1');bumpProgress('p11',30);}else if(score>=3){addXp(8,'p11-iv1');bumpProgress('p11',16);} return; }
gen(); document.getElementById('p11-i').textContent=i+1;
document.getElementById('p11-fig').innerHTML=dotsSVG(cur.a,cur.b)+'<div style="margin-top:4px;color:var(--muted);font-size:.9rem">'+cur.a+' точек по '+cur.b+' в ряд</div>';
document.getElementById('p11-a').value=''; document.getElementById('p11-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p11-fb'), a=parseInt(document.getElementById('p11-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.r){ score++; feedback(fb,true,'✓ Верно! Остаток '+cur.r+' (красные точки).'); } else feedback(fb,false,'✗ Нет. Остаток '+cur.r+'.');
document.getElementById('p11-s').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p11-go').addEventListener('click',go);
document.getElementById('p11-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var b=_ri(3,12), q=_ri(4,15), r=_ri(0,b-1); cur={a:b*q+r,b:b,q:q}; }
function show(){ if(i>=5){ document.getElementById('p11-qq').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p11-iv2');bumpProgress('p11',30);}else if(score>=2){addXp(8,'p11-iv2');bumpProgress('p11',16);} return; }
gen(); document.getElementById('p11-qi').textContent=i+1;
document.getElementById('p11-qq').innerHTML='Раздели $'+cur.a+'$ на $'+cur.b+'$ с остатком. Чему равно <b>неполное частное</b>?'; renderMath(document.getElementById('p11-qq'));
document.getElementById('p11-qa').value=''; document.getElementById('p11-qfb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p11-qfb'), a=parseInt(document.getElementById('p11-qa').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.q){ score++; feedback(fb,true,'✓ Верно! '+cur.a+'='+cur.b+'·'+cur.q+'+'+(cur.a-cur.b*cur.q)+'.'); } else feedback(fb,false,'✗ Нет. Неполное частное '+cur.q+'.');
document.getElementById('p11-qs').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p11-qgo').addEventListener('click',go);
document.getElementById('p11-qa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 12. ДЕЛИТЕЛИ И КРАТНЫЕ. НОД И НОК ===================== */
function buildP12(){
var box=document.getElementById('p12-body'); var h='';
h+=makeCard('oral','Где это в жизни','12.0',
'<p>Чтобы рассадить $24$ ученика за столы поровну, нужны <b>делители</b> числа $24$. Чтобы два светофора, мигающие через $4$ и $6$ секунд, мигнули одновременно, ищут общее <b>кратное</b>. Эти понятия — основа всей работы с дробями.</p>');
h+=makeCard('theory','Делители и кратные','12.1',
'<p><b>Делитель</b> числа $a$ — число, на которое $a$ делится нацело. Делители $12$: $1,2,3,4,6,12$.</p>'
+'<p><b>Кратное</b> числа $a$ — число, которое делится на $a$ нацело. Кратные $4$: $4,8,12,16,\\dots$</p>');
h+=makeCard('rule','НОД и НОК','12.2',
'<p><b>НОД</b> (наибольший общий делитель) — самое большое число, на которое делятся <b>оба</b> числа.</p>'
+'<p><b>НОК</b> (наименьшее общее кратное) — самое маленькое число, которое делится на <b>каждое</b> из них.</p>'
+'<p>Полезно: $\\text{НОД}(a,b)\\cdot\\text{НОК}(a,b)=a\\cdot b$.</p>');
h+=makeCard('example','Разбор по шагам','12.3',
'<p>Найдём НОД$(12,18)$ и НОК$(12,18)$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Делители $12$: $1,2,3,4,6,12$. Делители $18$: $1,2,3,6,9,18$.</li>'
+'<li>Общие: $1,2,3,6$. Наибольший — $6$. Значит НОД$=6$.</li>'
+'<li>НОК: кратные $18$: $18,36,54,\\dots$; $36$ делится на $12$. Значит НОК$=36$.</li>'
+'<li>Проверка: $6\\cdot36=216=12\\cdot18$. Верно!</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','12.4',
'<p>Быстрый способ найти НОД придумал ещё Евклид $2300$ лет назад: большее число заменяют остатком от деления на меньшее — и так, пока остаток не станет нулём. Это один из древнейших алгоритмов, и он до сих пор работает в компьютерах!</p>');
h+='<div class="wg" id="p12-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Найди НОД</div></div>'
+'<div class="wg-help">Общие делители подсвечены. Введи наибольший из них (НОД).</div>'
+'<div class="score-display"><span>Вопрос <b id="p12-i">1</b> / 5</span><span>Очки: <b id="p12-s">0</b> / 5</span></div>'
+'<div id="p12-fig" style="margin:8px 0"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p12-a" class="tinp" style="width:90px;text-align:center"><button class="btn primary" id="p12-go">Проверить</button></div>'
+'<div class="feedback" id="p12-fb"></div></div>';
h+='<div class="wg" id="p12-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Найди НОК</div></div>'
+'<div class="wg-help">Найди наименьшее общее кратное двух чисел.</div>'
+'<div class="score-display"><span>Вопрос <b id="p12-ki">1</b> / 5</span><span>Очки: <b id="p12-ks">0</b> / 5</span></div>'
+'<div id="p12-kq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p12-ka" class="tinp" style="width:90px;text-align:center"><button class="btn primary" id="p12-kgo">Проверить</button></div>'
+'<div class="feedback" id="p12-kfb"></div></div>';
h+=secNav('p11','p13')+readBtn('p12');
box.innerHTML=h; renderMath(box);
function divisors(n){ var d=[]; for(var k=1;k<=n;k++)if(n%k===0)d.push(k); return d; }
function gcd(a,b){ while(b){ var t=b; b=a%b; a=t; } return a; }
(function(){
var i=0,score=0,cur=null;
function gen(){ var pairs=[[12,18],[8,12],[16,24],[15,20],[18,24],[14,21],[20,30],[9,12]]; cur=_pick(pairs); cur=cur.slice(); cur.g=gcd(cur[0],cur[1]); }
function chips(n,common){ var ds=divisors(n),s='<div style="margin:4px 0"><b>Делители '+n+':</b> '; ds.forEach(function(d){ var hot=common.indexOf(d)>=0; s+='<span style="display:inline-block;margin:2px;padding:2px 8px;border-radius:6px;font-weight:700;'+(hot?'background:#fde68a;color:#92400e':'background:var(--pri-soft);color:var(--pri2)')+'">'+d+'</span>'; }); return s+'</div>'; }
function show(){ if(i>=5){ document.getElementById('p12-fig').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p12-iv1');bumpProgress('p12',30);}else if(score>=2){addXp(8,'p12-iv1');bumpProgress('p12',16);} return; }
gen(); document.getElementById('p12-i').textContent=i+1;
var common=divisors(cur[0]).filter(function(d){ return cur[1]%d===0; });
document.getElementById('p12-fig').innerHTML=chips(cur[0],common)+chips(cur[1],common);
document.getElementById('p12-a').value=''; document.getElementById('p12-fb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p12-fb'), a=parseInt(document.getElementById('p12-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.g){ score++; feedback(fb,true,'✓ Верно! НОД('+cur[0]+','+cur[1]+')='+cur.g+'.'); } else feedback(fb,false,'✗ Нет. НОД='+cur.g+' (наибольший общий делитель).');
document.getElementById('p12-s').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p12-go').addEventListener('click',go);
document.getElementById('p12-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var pairs=[[4,6],[6,9],[8,12],[3,5],[10,15],[4,10],[6,8],[9,12]]; var p=_pick(pairs); cur={a:p[0],b:p[1],ans:p[0]*p[1]/gcd(p[0],p[1])}; }
function show(){ if(i>=5){ document.getElementById('p12-kq').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p12-iv2');bumpProgress('p12',30);}else if(score>=2){addXp(8,'p12-iv2');bumpProgress('p12',16);} return; }
gen(); document.getElementById('p12-ki').textContent=i+1;
document.getElementById('p12-kq').innerHTML='Найди НОК$('+cur.a+';\\,'+cur.b+')$'; renderMath(document.getElementById('p12-kq'));
document.getElementById('p12-ka').value=''; document.getElementById('p12-kfb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p12-kfb'), a=parseInt(document.getElementById('p12-ka').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! НОК='+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. НОК('+cur.a+','+cur.b+')='+cur.ans+'.');
document.getElementById('p12-ks').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p12-kgo').addEventListener('click',go);
document.getElementById('p12-ka').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 13. ПРИЗНАКИ ДЕЛИМОСТИ ===================== */
function buildP13(){
var box=document.getElementById('p13-body'); var h='';
h+=makeCard('oral','Где это в жизни','13.0',
'<p>Иногда нужно быстро понять: разделится ли число нацело — <b>не выполняя деления</b>. Можно ли $87$ конфет раздать поровну троим? А $90$? Признаки делимости дают ответ за секунду.</p>');
h+=makeCard('rule','Признаки делимости','13.1',
'<p><b>На 2</b> — если последняя цифра чётная ($0,2,4,6,8$).</p>'
+'<p><b>На 5</b> — если последняя цифра $0$ или $5$.</p>'
+'<p><b>На 10</b> — если последняя цифра $0$.</p>'
+'<p><b>На 3</b> — если сумма цифр делится на $3$.</p>'
+'<p><b>На 9</b> — если сумма цифр делится на $9$.</p>'
+'<p><b>На 4</b> — если число из двух последних цифр делится на $4$.</p>');
h+=makeCard('example','Примеры','13.2',
'<p>$540$ делится на $2,5,10$ (оканчивается на $0$) и на $3$ (сумма цифр $5+4+0=9$).</p>'
+'<p>$123$ делится на $3$ ($1+2+3=6$), но не на $2$ и не на $9$.</p>');
h+=makeCard('example','Разбор по шагам','13.3',
'<p>Проверим, делится ли $5\\,814$ на $2$, $3$ и $9$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>На $2$: последняя цифра $4$ — чётная. <b>Делится.</b></li>'
+'<li>Сумма цифр: $5+8+1+4=18$.</li>'
+'<li>На $3$: $18$ делится на $3$. <b>Делится.</b></li>'
+'<li>На $9$: $18$ делится на $9$. <b>Делится.</b></li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','13.4',
'<p>Есть признак и для $11$: складывают цифры через одну и вычитают суммы. Если разность делится на $11$ — и число делится. Например, $2\\,728$: $(8+7)-(2+2)=11$ — делится на $11$!</p>');
h+='<div class="wg" id="p13-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Проверка делимости</div></div>'
+'<div class="wg-help">Введи число — увидишь, на что оно делится, и почему.</div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap;margin-bottom:8px"><input type="number" id="p13-in" class="tinp" style="width:150px;text-align:center" value="540"><button class="btn primary" id="p13-chk">Проверить</button></div>'
+'<div id="p13-out"></div></div>';
h+='<div class="wg" id="p13-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Делится ли нацело?</div></div>'
+'<div class="wg-help">Используй признак делимости и ответь «да» или «нет».</div>'
+'<div class="score-display"><span>Вопрос <b id="p13-i">1</b> / 6</span><span>Очки: <b id="p13-s">0</b> / 6</span></div>'
+'<div id="p13-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-yn="1">Да</button><button class="btn primary" data-yn="0">Нет</button></div>'
+'<div class="feedback" id="p13-fb"></div></div>';
h+=secNav('p12','p14')+readBtn('p13');
box.innerHTML=h; renderMath(box);
(function(){
function check(){
var raw=(document.getElementById('p13-in').value||'').replace(/\D/g,''); if(!raw)raw='0'; var n=parseInt(raw,10);
var ds=raw.split('').reduce(function(a,c){return a+(+c);},0);
var rules=[
['на 2', n%2===0, 'последняя цифра '+raw[raw.length-1]],
['на 3', n%3===0, 'сумма цифр '+ds],
['на 4', n%4===0, 'две последние: '+raw.slice(-2)],
['на 5', n%5===0, 'последняя цифра '+raw[raw.length-1]],
['на 9', n%9===0, 'сумма цифр '+ds],
['на 10', n%10===0, 'последняя цифра '+raw[raw.length-1]]
];
var s='<div style="display:flex;flex-wrap:wrap;gap:8px;justify-content:center">';
rules.forEach(function(r){ s+='<div style="padding:8px 12px;border-radius:9px;font-weight:700;min-width:120px;text-align:center;'+(r[1]?'background:#d1fae5;color:#065f46':'background:#fee2e2;color:#7f1d1d')+'">'+(r[1]?'✓ ':'✗ ')+r[0]+'<div style="font-size:.72rem;font-weight:500;opacity:.85;margin-top:2px">'+r[2]+'</div></div>'; });
document.getElementById('p13-out').innerHTML=s+'</div>';
}
document.getElementById('p13-chk').addEventListener('click',check);
document.getElementById('p13-in').addEventListener('keydown',function(e){ if(e.key==='Enter')check(); });
check();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var d=_pick([2,3,5,9,4,10]), n=_ri(100,999); cur={n:n,d:d,yes:n%d===0}; }
function show(){ if(i>=6){ document.getElementById('p13-q').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p13-iv2');bumpProgress('p13',30);}else if(score>=3){addXp(8,'p13-iv2');bumpProgress('p13',16);} return; }
gen(); document.getElementById('p13-i').textContent=i+1;
document.getElementById('p13-q').innerHTML='Делится ли $'+cur.n+'$ нацело на $'+cur.d+'$?'; renderMath(document.getElementById('p13-q'));
document.getElementById('p13-fb').style.display='none'; }
function ans(yn){ if(i>=6)return; var fb=document.getElementById('p13-fb');
if((yn===1)===cur.yes){ score++; feedback(fb,true,'✓ Верно! '+cur.n+(cur.yes?' делится':' не делится')+' на '+cur.d+'.'); } else feedback(fb,false,'✗ Нет. '+cur.n+(cur.yes?' делится':' не делится')+' на '+cur.d+'.');
document.getElementById('p13-s').textContent=score; i++; setTimeout(show,1200); }
document.querySelectorAll('#p13-iv2 [data-yn]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-yn')); }); });
show();
})();
}
/* ===================== § 14. ПРОСТЫЕ И СОСТАВНЫЕ ЧИСЛА ===================== */
function buildP14(){
var box=document.getElementById('p14-body'); var h='';
h+=makeCard('oral','Где это в жизни','14.0',
'<p>Простые числа — «кирпичики», из которых умножением складываются все остальные числа. На свойствах простых чисел держится защита банковских карт и переписки в интернете: огромное число легко перемножить, но почти невозможно разложить обратно.</p>');
h+=makeCard('theory','Простые и составные','14.1',
'<p><b>Простое число</b> имеет ровно <b>два</b> делителя: $1$ и само себя ($2,3,5,7,11,13,\\dots$).</p>'
+'<p><b>Составное число</b> имеет <b>больше двух</b> делителей ($4,6,8,9,\\dots$).</p>'
+'<p>Число $1$ — <b>ни простое, ни составное</b> (у него один делитель). $2$ — единственное чётное простое.</p>');
h+=makeCard('rule','Разложение на простые множители','14.2',
'<p>Любое составное число можно представить как произведение простых множителей — единственным образом. Делят на наименьшие простые: $2,3,5,7,\\dots$</p>');
h+=makeCard('example','Разбор по шагам','14.3',
'<p>Разложим $60$ на простые множители.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>$60:2=30$.</li>'
+'<li>$30:2=15$.</li>'
+'<li>$15:3=5$.</li>'
+'<li>$5$ — простое. Итог: $60=2\\cdot2\\cdot3\\cdot5=2^2\\cdot3\\cdot5$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','14.4',
'<p>Простых чисел бесконечно много — это доказал ещё Евклид. А самое большое известное простое число содержит более $41$ миллиона цифр! Его нашли в $2024$ году с помощью тысяч компьютеров по всему миру.</p>');
h+='<div class="wg" id="p14-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Решето Эратосфена</div></div>'
+'<div class="wg-help">Нажми на все <b>простые</b> числа от 2 до 30, затем проверь себя.</div>'
+'<div id="p14-grid" style="display:grid;grid-template-columns:repeat(8,1fr);gap:6px;max-width:360px;margin:8px auto"></div>'
+'<div class="actions" style="justify-content:center"><button class="btn primary" id="p14-chk">Проверить</button><button class="btn" id="p14-rst">Сбросить</button></div>'
+'<div class="feedback" id="p14-fb"></div></div>';
h+='<div class="wg" id="p14-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Простое или составное?</div></div>'
+'<div class="wg-help">Определи, простое число или составное.</div>'
+'<div class="score-display"><span>Вопрос <b id="p14-i">1</b> / 6</span><span>Очки: <b id="p14-s">0</b> / 6</span></div>'
+'<div id="p14-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-p="1">простое</button><button class="btn primary" data-p="0">составное</button></div>'
+'<div class="feedback" id="p14-qfb"></div></div>';
h+=secNav('p13','p15')+readBtn('p14');
box.innerHTML=h; renderMath(box);
function isPrime(n){ if(n<2)return false; for(var k=2;k*k<=n;k++)if(n%k===0)return false; return true; }
(function(){
var sel={};
var grid=document.getElementById('p14-grid'),html='';
for(var n=2;n<=30;n++) html+='<button class="btn" data-n="'+n+'" style="padding:8px 0;font-weight:700">'+n+'</button>';
grid.innerHTML=html;
grid.querySelectorAll('[data-n]').forEach(function(b){ b.addEventListener('click',function(){ var n=+b.getAttribute('data-n'); if(sel[n]){ delete sel[n]; b.classList.remove('primary'); } else { sel[n]=1; b.classList.add('primary'); } }); });
document.getElementById('p14-chk').addEventListener('click',function(){ var fb=document.getElementById('p14-fb'),ok=0,bad=0,miss=0;
for(var n=2;n<=30;n++){ var p=isPrime(n),s=!!sel[n]; if(p&&s)ok++; else if(!p&&s)bad++; else if(p&&!s)miss++; }
if(bad===0&&miss===0){ feedback(fb,true,'✓ Идеально! Все простые числа до 30 найдены. +15 XP'); addXp(15,'p14-iv1'); bumpProgress('p14',35); }
else feedback(fb,false,'✗ Верных: '+ok+'. Лишних: '+bad+', пропущено: '+miss+'. Простые до 30: 2,3,5,7,11,13,17,19,23,29.'); });
document.getElementById('p14-rst').addEventListener('click',function(){ sel={}; grid.querySelectorAll('[data-n]').forEach(function(b){ b.classList.remove('primary'); }); document.getElementById('p14-fb').style.display='none'; });
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var n; if(_ri(0,1)===0){ var pr=[2,3,5,7,11,13,17,19,23,29,31,37,41,43]; n=_pick(pr); } else { n=_ri(4,49); while(isPrime(n))n=_ri(4,49); } cur={n:n,prime:isPrime(n)}; }
function show(){ if(i>=6){ document.getElementById('p14-q').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p14-iv2');bumpProgress('p14',30);}else if(score>=3){addXp(8,'p14-iv2');bumpProgress('p14',16);} return; }
gen(); document.getElementById('p14-i').textContent=i+1;
document.getElementById('p14-q').innerHTML='Число $'+cur.n+'$ — простое или составное?'; renderMath(document.getElementById('p14-q'));
document.getElementById('p14-qfb').style.display='none'; }
function ans(p){ if(i>=6)return; var fb=document.getElementById('p14-qfb');
if((p===1)===cur.prime){ score++; feedback(fb,true,'✓ Верно! '+cur.n+' — '+(cur.prime?'простое':'составное')+'.'); } else feedback(fb,false,'✗ Нет. '+cur.n+' — '+(cur.prime?'простое':'составное')+'.');
document.getElementById('p14-s').textContent=score; i++; setTimeout(show,1200); }
document.querySelectorAll('#p14-iv2 [data-p]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-p')); }); });
show();
})();
}
/* ===================== § 15. МАТЕМАТИКА ВОКРУГ НАС ===================== */
function buildP15(){
var box=document.getElementById('p15-body'); var h='';
h+=makeCard('oral','Где это в жизни','15.0',
'<p>Этот параграф — про то, как натуральные числа работают вне учебника. Покупки, расписание, расход топлива, спортивный счёт — везде нужно складывать, умножать и делить. Попробуй решить задачи так, будто это реальная ситуация.</p>');
h+=makeCard('theory','Числа в жизни','15.1',
'<p>Чтобы решить практическую задачу, выпиши, что <b>дано</b>, и определи, каким <b>действием</b> искать ответ: «всего» — сложение, «осталось» — вычитание, «во столько раз / по стольку» — умножение или деление.</p>');
h+=makeCard('example','Разбор по шагам','15.2',
'<p>В школу привезли $6$ коробок по $24$ учебника и $4$ коробки по $30$ тетрадей. Сколько всего предметов?</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Учебники: $6\\cdot24=144$.</li>'
+'<li>Тетради: $4\\cdot30=120$.</li>'
+'<li>Всего: $144+120=264$.</li>'
+'<li>Ответ: $264$ предмета.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','15.3',
'<p>Умение быстро прикидывать в уме экономит время и деньги. В супермаркете округли цены до рублей — и ты заранее знаешь примерную сумму в чеке, ещё не дойдя до кассы.</p>');
h+='<div class="wg" id="p15-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Задачи из жизни</div></div>'
+'<div class="wg-help">Реши практическую задачу. Ответ — число, без единиц.</div>'
+'<div class="score-display"><span>Задача <b id="p15-i">1</b> / 6</span><span>Очки: <b id="p15-s">0</b> / 6</span></div>'
+'<div id="p15-q" class="qbox" style="font-size:1rem;text-align:left"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p15-a" class="tinp" style="width:120px;text-align:center"><button class="btn primary" id="p15-go">Проверить</button></div>'
+'<div class="feedback" id="p15-fb"></div></div>';
h+='<div class="wg" id="p15-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Прикинь в уме</div></div>'
+'<div class="wg-help">Округли числа и выбери самую близкую оценку ответа.</div>'
+'<div class="score-display"><span>Вопрос <b id="p15-ei">1</b> / 5</span><span>Очки: <b id="p15-es">0</b> / 5</span></div>'
+'<div id="p15-eq" class="qbox"></div>'
+'<div id="p15-eopt" style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"></div>'
+'<div class="feedback" id="p15-efb"></div></div>';
h+=secNav('p14','p16')+readBtn('p15');
box.innerHTML=h; renderMath(box);
(function(){
var PROB=[
{q:'В кинотеатре 18 рядов по 25 мест. Сколько всего мест?',a:450},
{q:'Купили 3 кг конфет по 12 руб. и торт за 20 руб. Сколько заплатили?',a:56},
{q:'Турист прошёл 36 км за 3 дня поровну. Сколько км в день?',a:12},
{q:'В пачке 500 листов. Сколько листов в 8 пачках?',a:4000},
{q:'Было 1000 руб., купили 4 книги по 150 руб. Сколько осталось?',a:400},
{q:'Бак вмещает 50 л. Сколько литров в 6 таких баках?',a:300},
{q:'Поезд из 12 вагонов по 54 места. Сколько всего мест?',a:648},
{q:'240 яблок разложили в ящики по 30. Сколько ящиков?',a:8}
];
var order=[],i=0,score=0,cur=null;
function reorder(){ order=PROB.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){ var k=_ri(0,j),t=order[j];order[j]=order[k];order[k]=t; } }
reorder();
function show(){ if(i>=6){ document.getElementById('p15-q').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p15-iv1');bumpProgress('p15',30);}else if(score>=3){addXp(8,'p15-iv1');bumpProgress('p15',16);} return; }
cur=PROB[order[i]]; document.getElementById('p15-i').textContent=i+1;
document.getElementById('p15-q').innerHTML=cur.q;
document.getElementById('p15-a').value=''; document.getElementById('p15-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p15-fb'), a=parseInt(document.getElementById('p15-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.a){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.a+'.'); } else feedback(fb,false,'✗ Нет. Правильный ответ: '+cur.a+'.');
document.getElementById('p15-s').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p15-go').addEventListener('click',go);
document.getElementById('p15-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var a=_ri(18,42), b=_ri(18,42), exact=a*b, rb=Math.round(a/10)*10*(Math.round(b/10)*10); var opts=[rb, rb+ (Math.round(a/10)*10*10), Math.max(100,rb-(Math.round(b/10)*10*10))]; opts=opts.filter(function(x,k){return opts.indexOf(x)===k;}); while(opts.length<3)opts.push(rb+100*opts.length); var best=opts.reduce(function(p,c){return Math.abs(c-exact)<Math.abs(p-exact)?c:p;}); for(var j=opts.length-1;j>0;j--){var k=_ri(0,j),t=opts[j];opts[j]=opts[k];opts[k]=t;} cur={a:a,b:b,exact:exact,opts:opts,best:best}; }
function show(){ if(i>=5){ document.getElementById('p15-eq').innerHTML='<b>Готово! '+score+' / 5</b>'; document.getElementById('p15-eopt').innerHTML=''; if(score>=4){addXp(15,'p15-iv2');bumpProgress('p15',30);}else if(score>=2){addXp(8,'p15-iv2');bumpProgress('p15',16);} return; }
gen(); document.getElementById('p15-ei').textContent=i+1;
document.getElementById('p15-eq').innerHTML='Оцени примерно: $'+cur.a+'\\cdot'+cur.b+'\\approx\\;?$'; renderMath(document.getElementById('p15-eq'));
var html=''; cur.opts.forEach(function(o){ html+='<button class="btn primary" data-o="'+o+'">'+o+'</button>'; });
document.getElementById('p15-eopt').innerHTML=html;
document.querySelectorAll('#p15-eopt [data-o]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-o')); }); });
document.getElementById('p15-efb').style.display='none'; }
function ans(o){ if(i>=5)return; var fb=document.getElementById('p15-efb');
if(o===cur.best){ score++; feedback(fb,true,'✓ Верно! Точное значение '+cur.exact+', ближе всего '+cur.best+'.'); } else feedback(fb,false,'✗ Ближе всего '+cur.best+' (точно '+cur.exact+').');
document.getElementById('p15-es').textContent=score; i++; setTimeout(show,1400); }
show();
})();
}
/* ===================== § 16. ДВИЖЕНИЕ, ВЗВЕШИВАНИЕ, ПЕРЕЛИВАНИЕ ===================== */
function buildP16(){
var box=document.getElementById('p16-body'); var h='';
h+=makeCard('oral','Где это в жизни','16.0',
'<p>Задачи на движение, взвешивание и переливание развивают смекалку. Их любят на олимпиадах, ведь готовой формулы часто нет — нужно <b>придумать план</b>.</p>');
h+=makeCard('rule','Три типа задач','16.1',
'<p><b>Движение:</b> путь $=$ скорость $\\cdot$ время, $s=v\\cdot t$. Отсюда $v=s:t$ и $t=s:v$.</p>'
+'<p><b>Взвешивание:</b> ищут фальшивую монету за наименьшее число взвешиваний на чашечных весах.</p>'
+'<p><b>Переливание:</b> получают нужный объём, переливая воду между сосудами разной ёмкости.</p>');
h+=makeCard('example','Разбор по шагам','16.2',
'<p>Велосипедист едет со скоростью $12$ км/ч. Какой путь он проедет за $3$ часа?</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Формула пути: $s=v\\cdot t$.</li>'
+'<li>Подставляем: $s=12\\cdot3$.</li>'
+'<li>Ответ: $s=36$ км.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','16.3',
'<p>Задача о переливании из фильма «Крепкий орешек»: как отмерить ровно $4$ литра, имея кувшины на $3$ и $5$ литров? Наполни $5$-литровый, перелей в $3$-литровый — останется $2$ л; вылей тройку, перелей туда эти $2$ л, снова наполни пятёрку и долей доверху — в пятёрке станет ровно $4$ л!</p>');
h+='<div class="wg" id="p16-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Задачи на движение</div></div>'
+'<div class="wg-help">Используй $s=v\\cdot t$. Ответ — число.</div>'
+'<div class="score-display"><span>Задача <b id="p16-i">1</b> / 6</span><span>Очки: <b id="p16-s">0</b> / 6</span></div>'
+'<div id="p16-q" class="qbox" style="font-size:1rem;text-align:left"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p16-a" class="tinp" style="width:110px;text-align:center"><button class="btn primary" id="p16-go">Проверить</button></div>'
+'<div class="feedback" id="p16-fb"></div></div>';
h+='<div class="wg" id="p16-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Логические задачи</div></div>'
+'<div class="wg-help">Подумай и введи ответ числом.</div>'
+'<div class="score-display"><span>Задача <b id="p16-li">1</b> / 5</span><span>Очки: <b id="p16-ls">0</b> / 5</span></div>'
+'<div id="p16-lq" class="qbox" style="font-size:1rem;text-align:left"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p16-la" class="tinp" style="width:110px;text-align:center"><button class="btn primary" id="p16-lgo">Проверить</button></div>'
+'<div class="feedback" id="p16-lfb"></div></div>';
h+=secNav('p15','p17')+readBtn('p16');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ var t=_ri(0,2),v,tm,s;
if(t===0){ v=_ri(8,20); tm=_ri(2,6); cur={q:'Скорость '+v+' км/ч, время '+tm+' ч. Найди путь (км).',a:v*tm}; }
else if(t===1){ v=_ri(5,15); s=v*_ri(2,6); cur={q:'Путь '+s+' км пройден со скоростью '+v+' км/ч. Сколько часов в пути?',a:s/v}; }
else { tm=_ri(2,6); s=_ri(6,18)*tm; cur={q:'Путь '+s+' км пройден за '+tm+' ч. Какова скорость (км/ч)?',a:s/tm}; } }
function show(){ if(i>=6){ document.getElementById('p16-q').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p16-iv1');bumpProgress('p16',30);}else if(score>=3){addXp(8,'p16-iv1');bumpProgress('p16',16);} return; }
gen(); document.getElementById('p16-i').textContent=i+1;
document.getElementById('p16-q').innerHTML=cur.q;
document.getElementById('p16-a').value=''; document.getElementById('p16-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p16-fb'), a=parseInt(document.getElementById('p16-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.a){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.a+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.a+'.');
document.getElementById('p16-s').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p16-go').addEventListener('click',go);
document.getElementById('p16-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var PROB=[
{q:'Верёвку разрезали на части. Сделали 5 разрезов. Сколько получилось кусков?',a:6},
{q:'На столбе сидели 7 птиц. 3 улетели, 2 прилетели. Сколько птиц стало?',a:6},
{q:'Сколько взвешиваний на чашечных весах нужно, чтобы среди 3 монет найти 1 фальшивую (лёгкую)?',a:1},
{q:'Бревно пилят на 4 части. Каждый распил — 2 минуты. Сколько минут уйдёт?',a:6},
{q:'Кувшины 3 л и 5 л. За сколько переливаний из 5-литрового получить ровно 4 л? (по разбору)',a:6},
{q:'Часы бьют 6 ударов за 5 секунд. За сколько секунд они пробьют 12 ударов?',a:11}
];
var order=[],i=0,score=0,cur=null;
function reorder(){ order=PROB.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){ var k=_ri(0,j),t=order[j];order[j]=order[k];order[k]=t; } }
reorder();
function show(){ if(i>=5){ document.getElementById('p16-lq').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p16-iv2');bumpProgress('p16',30);}else if(score>=2){addXp(8,'p16-iv2');bumpProgress('p16',16);} return; }
cur=PROB[order[i]]; document.getElementById('p16-li').textContent=i+1;
document.getElementById('p16-lq').innerHTML=cur.q;
document.getElementById('p16-la').value=''; document.getElementById('p16-lfb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p16-lfb'), a=parseInt(document.getElementById('p16-la').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur.a){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.a+'.'); } else feedback(fb,false,'✗ Подумай ещё. Правильно: '+cur.a+'.');
document.getElementById('p16-ls').textContent=score; i++; setTimeout(show,1400); }
document.getElementById('p16-lgo').addEventListener('click',go);
document.getElementById('p16-la').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 17. ИСТОРИЧЕСКИЕ СВЕДЕНИЯ О ЧИСЛАХ ===================== */
function buildP17(){
var box=document.getElementById('p17-body'); var h='';
h+=makeCard('oral','Где это в жизни','17.0',
'<p>Числа были у всех народов, но записывали их по-разному. Эти древние системы счисления до сих пор встречаются: римские цифры — на циферблатах часов, в нумерации глав и веков.</p>');
h+=makeCard('theory','Как считали разные народы','17.1',
'<p><b>Древний Египет:</b> для единиц — палочки, для тысячи — цветок лотоса, для $100\\,000$ — лягушка.</p>'
+'<p><b>Рим:</b> буквами — $I=1$, $V=5$, $X=10$, $L=50$, $C=100$, $D=500$, $M=1000$.</p>'
+'<p><b>Индия:</b> около $1500$ лет назад появились знакомые нам цифры $0$–$9$ — их называют «арабскими», потому что в Европу они попали через арабов.</p>');
h+=makeCard('rule','Чтение римских чисел','17.2',
'<p>Цифры складывают слева направо: $XVI=10+5+1=16$. Но если меньшая стоит <b>перед</b> большей — её вычитают: $IV=5-1=4$, $IX=9$, $XL=40$, $XC=90$.</p>');
h+=makeCard('example','Разбор по шагам','17.3',
'<p>Прочитаем $XXVII$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>$X+X=20$.</li>'
+'<li>$V=5$, итого $25$.</li>'
+'<li>$I+I=2$, итого $27$.</li>'
+'<li>$XXVII=27$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','17.4',
'<p>Самое важное «изобретение» в истории чисел — это <b>нуль</b>. Без него не было бы позиционной записи. Нуль как полноценное число первыми стали использовать в Индии около $1500$ лет назад. Римляне же нуля не знали вовсе!</p>');
h+='<div class="wg" id="p17-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Римские цифры</div></div>'
+'<div class="wg-help">Запиши римское число обычными (арабскими) цифрами.</div>'
+'<div class="score-display"><span>Вопрос <b id="p17-i">1</b> / 6</span><span>Очки: <b id="p17-s">0</b> / 6</span></div>'
+'<div id="p17-q" class="qbox" style="font-size:1.6rem;font-weight:800;letter-spacing:2px"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p17-a" class="tinp" style="width:100px;text-align:center"><button class="btn primary" id="p17-go">Проверить</button></div>'
+'<div class="feedback" id="p17-fb"></div></div>';
h+='<div class="wg" id="p17-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">История чисел</div></div>'
+'<div class="wg-help">Выбери верный ответ.</div>'
+'<div class="score-display"><span>Вопрос <b id="p17-hi">1</b> / 5</span><span>Очки: <b id="p17-hs">0</b> / 5</span></div>'
+'<div id="p17-hq" class="qbox"></div>'
+'<div id="p17-hopt" style="display:flex;gap:8px;justify-content:center;flex-wrap:wrap"></div>'
+'<div class="feedback" id="p17-hfb"></div></div>';
h+=secNav('p16','final')+readBtn('p17');
box.innerHTML=h; renderMath(box);
function toRoman(n){ var m=[[100,'C'],[90,'XC'],[50,'L'],[40,'XL'],[10,'X'],[9,'IX'],[5,'V'],[4,'IV'],[1,'I']],s=''; m.forEach(function(p){ while(n>=p[0]){s+=p[1];n-=p[0];} }); return s; }
(function(){
var i=0,score=0,cur=null;
function gen(){ cur=_ri(1,89); }
function show(){ if(i>=6){ document.getElementById('p17-q').innerHTML='<b style="font-size:1rem">Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p17-iv1');bumpProgress('p17',30);}else if(score>=3){addXp(8,'p17-iv1');bumpProgress('p17',16);} return; }
gen(); document.getElementById('p17-i').textContent=i+1;
document.getElementById('p17-q').textContent=toRoman(cur);
document.getElementById('p17-a').value=''; document.getElementById('p17-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p17-fb'), a=parseInt(document.getElementById('p17-a').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
if(a===cur){ score++; feedback(fb,true,'✓ Верно! '+toRoman(cur)+' = '+cur+'.'); } else feedback(fb,false,'✗ Нет. '+toRoman(cur)+' = '+cur+'.');
document.getElementById('p17-s').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p17-go').addEventListener('click',go);
document.getElementById('p17-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var QZ=[
{q:'Какие цифры мы называем «арабскими»?', o:['09','римские','египетские'], a:0},
{q:'Чему равно римское число L?', o:['50','100','500'], a:0},
{q:'В какой стране впервые использовали нуль как число?', o:['Индия','Рим','Греция'], a:0},
{q:'Что обозначала лягушка в египетской записи?', o:['100 000','1000','10'], a:0},
{q:'Чему равно IX?', o:['9','11','6'], a:0},
{q:'Знали ли римляне нуль?', o:['нет','да','только жрецы'], a:0},
{q:'Чему равно римское M?', o:['1000','100','500'], a:0}
];
var order=[],i=0,score=0,cur=null;
function reorder(){ order=QZ.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){ var k=_ri(0,j),t=order[j];order[j]=order[k];order[k]=t; } }
reorder();
function show(){ if(i>=5){ document.getElementById('p17-hq').innerHTML='<b>Готово! '+score+' / 5</b>'; document.getElementById('p17-hopt').innerHTML=''; if(score>=4){addXp(15,'p17-iv2');bumpProgress('p17',30);}else if(score>=2){addXp(8,'p17-iv2');bumpProgress('p17',16);} return; }
cur=QZ[order[i]]; document.getElementById('p17-hi').textContent=i+1;
document.getElementById('p17-hq').innerHTML=cur.q;
var idx=[0,1,2]; for(var j=idx.length-1;j>0;j--){var k=_ri(0,j),t=idx[j];idx[j]=idx[k];idx[k]=t;}
var html=''; idx.forEach(function(oi){ html+='<button class="btn primary" data-oi="'+oi+'">'+cur.o[oi]+'</button>'; });
document.getElementById('p17-hopt').innerHTML=html;
document.querySelectorAll('#p17-hopt [data-oi]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-oi')); }); });
document.getElementById('p17-hfb').style.display='none'; }
function ans(oi){ if(i>=5)return; var fb=document.getElementById('p17-hfb');
if(oi===cur.a){ score++; feedback(fb,true,'✓ Верно!'); } else feedback(fb,false,'✗ Нет. Верный ответ: '+cur.o[cur.a]+'.');
document.getElementById('p17-hs').textContent=score; i++; setTimeout(show,1300); }
show();
})();
}
/* ===================== ДАННЫЕ САЙДБАРА / ГЛОССАРИЯ ===================== */
var SIDEBARS = {
p1:{ title:'Шпаргалка § 1', rows:[
['Шаг 1','понять условие: что дано, что найти'],
['Шаг 2','составить план действий'],
['Шаг 3','выполнить вычисления'],
['Шаг 4','проверить ответ'] ]},
p2:{ title:'Шпаргалка § 2', rows:[
['Натуральные','$1,2,3,\\dots$ — для счёта'],
['Нуль','не натуральное, но нужно в записи'],
['Класс','группа из 3 разрядов'],
['Классы','единицы, тысячи, миллионы…'] ]},
p3:{ title:'Шпаргалка § 3', rows:[
['Больше цифр','то число и больше: $1000>999$'],
['Поровну цифр','сравниваем поразрядно слева'],
['Знаки','$<$ меньше, $>$ больше, $=$ равно'],
['Острый угол','смотрит на меньшее число'] ]},
p4:{ title:'Шпаргалка § 4', rows:[
['Точка','нет размеров; $A$'],
['Прямая','бесконечна в обе стороны; $a$'],
['Луч','начало $O$ + бесконечность в одну сторону'],
['Отрезок','часть прямой между концами $AB$'],
['Через 2 точки','ровно одна прямая'] ]},
p5:{ title:'Шпаргалка § 5', rows:[
['1 см','$=10$ мм'],
['1 дм','$=10$ см'],
['1 м','$=100$ см $=1000$ мм'],
['1 км','$=1000$ м'] ]},
p6:{ title:'Шпаргалка § 6', rows:[
['Начало','$O$ — это число $0$'],
['Единичный отрезок','задаёт «шаг»'],
['Координата','число точки: $A(3)$'],
['Правее','значит больше'] ]},
p7:{ title:'Шпаргалка § 7', rows:[
['Смотрим','на следующую (младшую) цифру'],
['$<5$','разряд оставляем'],
['$\\ge 5$','разряд +1'],
['Младшие','заменяем нулями; знак $\\approx$'] ]},
p8:{ title:'Шпаргалка § 8', rows:[
['Столбик','разряд под разрядом'],
['$\\ge 10$','переносим в старший разряд'],
['Не хватает','занимаем у старшего'],
['$37+99$','$=37+100-1=136$'] ]},
p9:{ title:'Шпаргалка § 9', rows:[
['Умножение','быстрое сложение слагаемых'],
['Деление','обратно умножению'],
['Проверка','частное · делитель = делимое'],
['Распределит.','$a(b+c)=ab+ac$'] ]},
p10:{ title:'Шпаргалка § 10', rows:[
['Степень','$a^n=a\\cdot a\\cdots a$ ($n$ раз)'],
['Основание','$a$ — что умножаем'],
['Показатель','$n$ — сколько множителей'],
['$a^2$ / $a^3$','квадрат / куб'] ]},
p11:{ title:'Шпаргалка § 11', rows:[
['Формула','$a=b\\cdot q+r$'],
['$q$','неполное частное'],
['$r$','остаток, всегда $r<b$'],
['$47:5$','$=9$ (ост. $2$)'] ]},
p12:{ title:'Шпаргалка § 12', rows:[
['Делитель','делит число нацело'],
['Кратное','делится на число нацело'],
['НОД','наибольший общий делитель'],
['НОК','наименьшее общее кратное'] ]},
p13:{ title:'Шпаргалка § 13', rows:[
['на 2','последняя цифра чётная'],
['на 5 / 10','оканчивается на 0/5 · на 0'],
['на 3 / 9','сумма цифр делится на 3 / 9'],
['на 4','две последние делятся на 4'] ]},
p14:{ title:'Шпаргалка § 14', rows:[
['Простое','ровно 2 делителя'],
['Составное','больше 2 делителей'],
['1','ни простое, ни составное'],
['Разложение','$60=2^2\\cdot3\\cdot5$'] ]},
p15:{ title:'Шпаргалка § 15', rows:[
['«всего»','складываем'],
['«осталось»','вычитаем'],
['«по / в … раз»','умножаем или делим'],
['Прикидка','округли и оцени ответ'] ]},
p16:{ title:'Шпаргалка § 16', rows:[
['Путь','$s=v\\cdot t$'],
['Скорость','$v=s:t$'],
['Время','$t=s:v$'],
['Смекалка','сначала придумай план'] ]},
p17:{ title:'Шпаргалка § 17', rows:[
['Рим','$I,V,X,L,C,D,M$'],
['Меньшая перед большей','вычитаем: $IV=4$'],
['Арабские','цифры $0$–$9$, родом из Индии'],
['Нуль','изобретён в Индии'] ]},
final:{ title:'Финал главы 1', rows:[
['5 боссов','разряды, округление, действия, степень'],
['Победа','4 из 5 и больше'],
['Награда','+40 XP и достижение «Глава 1 пройдена»'] ]}
};
var TIPS = [
{ sec:'p1', html:'Не бросайся считать сразу. Сначала спроси себя: «что дано?» и «что нужно найти?» — половина дела готова.' },
{ sec:'p2', html:'Разбивай длинное число на классы по три цифры справа: $12\\,345\\,678$. Так его легко прочитать.' },
{ sec:'p3', html:'Сначала глянь на длину записи: где цифр больше — то число и больше. Если поровну — сравнивай поразрядно слева направо.' },
{ sec:'p4', html:'Запоминай по концам: у отрезка два конца, у луча — один (его начало), у прямой — ни одного.' },
{ sec:'p5', html:'Переводя единицы, держи в голове «лесенку»: мм → см → дм → м, каждый шаг в 10 раз. От м до км — в 1000 раз.' },
{ sec:'p6', html:'Координата — это сколько единичных отрезков от нуля. Чем правее точка, тем больше её координата.' },
{ sec:'final', html:'Перед ударом прикинь ответ в уме. Для степени $a^n$ — это $a$, умноженное само на себя $n$ раз.' }
];
var GLOSSARY = [
{ term:'натуральное число', def:'Число, которым считают предметы: $1,2,3,\\dots$ Нуль натуральным не считают.', sec:'p2', aliases:['натуральное число','натуральные числа','натуральных чисел','натурального числа'] },
{ term:'разряд', def:'Место цифры в записи числа: единицы, десятки, сотни и т. д.', sec:'p2', aliases:['разряд','разряда','разряде','разряды','разрядов'] },
{ term:'класс', def:'Группа из трёх соседних разрядов: единицы, тысячи, миллионы.', sec:'p2', aliases:['класс','класса','классе','классы','классов'] }
];
var BUILDERS = { p1:buildP1, p2:buildP2, p3:buildP3, p4:buildP4, p5:buildP5, p6:buildP6, p7:buildP7, p8:buildP8, p9:buildP9, p10:buildP10, p11:buildP11, p12:buildP12, p13:buildP13, p14:buildP14, p15:buildP15, p16:buildP16, p17:buildP17, final:buildFinal };
Object.assign(window.M6, { sidebars:SIDEBARS, tips:TIPS, glossary:GLOSSARY, builders:BUILDERS });
</script>
</body>
</html>