From bcc6c7e79b160de6c01f0912b592742376fcb0cc Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 3 Jun 2026 09:18:41 +0300 Subject: [PATCH] =?UTF-8?q?feat(math5):=20=D0=93=D0=BB=D0=B0=D0=B2=D0=B0?= =?UTF-8?q?=201=20=E2=80=94=20=C2=A71=20=C2=AB=D0=9A=D0=B0=D0=BA=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B0=D1=82=D1=8C=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D1=83=C2=BB,=20=C2=A72=20=C2=AB=D0=A7=D1=82=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B8=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8C.=20?= =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D1=80=D1=8F=D0=B4=D1=8B=C2=BB,=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §1: 4 шага решения (Пойа) + тренажёр «на каком шаге ученик» + решатель задач. §2: натуральные числа и нуль, классы/разряды, интерактивная разрядная таблица (ввод числа → раскладка по классам единицы/тысячи/миллионы) + тренажёр «цифра в разряде». Финал главы 1 — 5 боссов (разряды/округление/действия/степень). Шпаргалки/типсы/глоссарий для §1/§2/финала. §3–17 пока заглушки движка. Тесты math5: 8/8. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/tests/math5-page.test.js | 26 ++- frontend/textbooks/math_5_ch1.html | 264 ++++++++++++++++++++++++++++- 2 files changed, 287 insertions(+), 3 deletions(-) diff --git a/backend/tests/math5-page.test.js b/backend/tests/math5-page.test.js index 2c6f6fd..0eec409 100644 --- a/backend/tests/math5-page.test.js +++ b/backend/tests/math5-page.test.js @@ -62,7 +62,7 @@ test('engine: init() вызывается ПОСЛЕ экспортов (общ }); for (const ch of CHAPTERS) { - test(`${ch.file}: SPA без ошибок, ${ch.cards} карточек, активен § 1, заглушка`, async () => { + test(`${ch.file}: SPA без ошибок, ${ch.cards} карточек, активен § 1`, async () => { const { doc, errors } = await loadDom(ch.file); assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | ')); assert.equal(doc.querySelectorAll('#psel-grid .psel-card').length, ch.cards, ch.cards + ' карточек'); @@ -70,12 +70,34 @@ for (const ch of CHAPTERS) { assert.ok(active && active.id === 'sec-p1', 'активен sec-p1'); const body = doc.querySelector('#p1-body'); assert.ok(body && body.children.length > 0, 'тело § 1 заполнено'); - assert.ok(doc.querySelector('#p1-body .m6-placeholder'), 'заглушка § 1 (нет билдера — ожидаемо в каркасе)'); assert.ok(doc.querySelector('#p1-body [data-read]'), 'кнопка прочтения § 1'); assert.ok(doc.querySelector('#psel-grid .psel-card.final'), 'есть карточка финала'); }); } +test('ch2/ch3: §§ без билдеров — заглушка движка (каркас ждёт наполнения)', async () => { + for (const f of ['math_5_ch2.html', 'math_5_ch3.html']) { + const { doc } = await loadDom(f); + assert.ok(doc.querySelector('#p1-body .m6-placeholder'), f + ': заглушка § 1'); + } +}); + +test('ch1: §1 «как решать задачу», §2 «разрядная таблица», финал-боссы', async () => { + const { doc, errors } = await loadDom('math_5_ch1.html'); + const win = doc.defaultView; + assert.ok(!doc.querySelector('#p1-body .m6-placeholder'), '§1 наполнен (не заглушка)'); + assert.equal(doc.querySelectorAll('#p1-iv1 [data-step]').length, 4, '§1: 4 кнопки шагов'); + assert.ok(doc.querySelector('#p1-iv2 #p1-pa'), '§1: тренажёр-решатель задач'); + win.goTo('p2'); await wait(80); + assert.ok(doc.querySelector('#p2-pv-out table'), '§2: разрядная таблица построена'); + assert.ok(doc.querySelector('#p2-iv2 #p2-qa'), '§2: тренажёр «цифра в разряде»'); + win.goTo('final'); await wait(80); + assert.ok(doc.querySelector('#fin-go'), 'финал: арена боссов'); + win.bumpProgress('final', 100); await wait(20); + assert.ok(win.M6STATE.achievements.has('ch1_done'), 'достижение «Глава 1 пройдена»'); + assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | ')); +}); + test('хаб math-5: 3 главы, курсовой финал, ачивка-полоса', async () => { const { doc, errors } = await loadDom('math_5_hub.html'); assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | ')); diff --git a/frontend/textbooks/math_5_ch1.html b/frontend/textbooks/math_5_ch1.html index 339c20e..29d1f86 100644 --- a/frontend/textbooks/math_5_ch1.html +++ b/frontend/textbooks/math_5_ch1.html @@ -95,11 +95,273 @@ window.M6 = { { id:'p17', num:'§ 17', name:'Исторические сведения о числах', sub:'Как считали разные народы', applied:true }, { id:'final', num:'★', name:'Финал главы', sub:'Тест · боссы главы 1', final:true } ], - achLabels: { final_done:'Глава 1 пройдена!' }, + 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', + '

Решать задачи приходится не только на уроке. Распланировать карманные деньги, прикинуть, хватит ли времени дойти до школы, разделить пиццу поровну — всё это задачи. Хороший «решатель» сначала понимает, чего от него хотят, и только потом считает.

'); + h+=makeCard('rule','Четыре шага решения','1.1', + '

Любую задачу удобно решать по плану из четырёх шагов:

' + +'
    ' + +'
  1. Понять условие. Что дано? Что нужно найти? Сделать рисунок или краткую запись.
  2. ' + +'
  3. Составить план. Какие действия и в каком порядке приведут к ответу?
  4. ' + +'
  5. Выполнить план. Аккуратно сделать вычисления.
  6. ' + +'
  7. Проверить. Подходит ли ответ по смыслу? Сошлось ли?
  8. ' + +'
'); + h+=makeCard('example','Разбор по шагам','1.2', + '

Задача: в двух коробках $40$ карандашей. В первой на $6$ больше, чем во второй. Сколько карандашей в каждой коробке?

' + +'
    ' + +'
  1. Понять. Дано: всего $40$, разница $6$. Найти: сколько в каждой коробке.
  2. ' + +'
  3. План. Уберём «лишние» $6$ из суммы, разделим остаток поровну, потом вернём $6$ в первую.
  4. ' + +'
  5. Решение. $(40-6):2=17$ — во второй; $17+6=23$ — в первой.
  6. ' + +'
  7. Проверка. $17+23=40$ и $23-17=6$. Верно!
  8. ' + +'
'); + h+=makeCard('theory','А знаешь ли ты?','1.3', + '

Математик Дьёрдь Пойа в 1945 году написал знаменитую книгу «Как решать задачу». Именно он описал эти четыре шага. Его главный совет: «Если не получается решить задачу — реши сначала более простую похожую задачу».

'); + h+='
Интерактив 1
На каком шаге ученик?
' + +'
Прочитай фразу ученика и определи, какому из четырёх шагов она соответствует.
' + +'
Вопрос 1 / 5Очки: 0 / 5
' + +'
' + +'
' + +'
'; + h+='
Интерактив 2
Реши задачу
' + +'
Реши задачу по плану и введи ответ числом (без единиц).
' + +'
Задача 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + 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='Готово! Результат: '+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='Готово! Результат: '+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', + '

Большие числа окружают нас: на Земле живёт около $8\\,000\\,000\\,000$ человек, до Луны примерно $384\\,000$ км, а у современного смартфона памяти $128\\,000\\,000\\,000$ байт. Чтобы не запутаться в нулях, числа разбивают на классы по три цифры.

'); + h+=makeCard('theory','Натуральные числа и нуль','2.1', + '

Натуральные числа — это числа, которыми считают предметы: $1, 2, 3, 4, \\dots$ Их ряд бесконечен: какое бы число ни взяли, всегда есть следующее.

' + +'

Число нуль $(0)$ натуральным не считают, но без него не записать, например, число $108$. Множество натуральных чисел обозначают буквой $\\mathbb{N}$.

'); + h+=makeCard('rule','Классы и разряды','2.2', + '

Запись числа читают справа налево по разрядам и группируют по три — в классы:

' + +'' + +'' + +'
МиллионыТысячиЕдиницы
сотдеседсотдеседсотдесед
012345678
' + +'

Это число $12\\,345\\,678$ — «двенадцать миллионов триста сорок пять тысяч шестьсот семьдесят восемь».

'); + h+=makeCard('example','Читаем число','2.3', + '

$5\\,204$ — пять тысяч двести четыре.   $70\\,030$ — семьдесят тысяч тридцать.   $300\\,000$ — триста тысяч.

' + +'

Нуль в разряде означает, что этого разряда «нет»: в числе $70\\,030$ нет ни сотен, ни единиц тысяч, ни единиц.

'); + h+=makeCard('example','Разбор по шагам','2.4', + '

Запишем цифрами число «двести три тысячи сорок».

' + +'
    ' + +'
  1. Находим классы: «двести три тысячи» — класс тысяч $=203$; «сорок» — класс единиц $=40$.
  2. ' + +'
  3. Каждый класс — ровно $3$ цифры: тысячи $\\to 203$, единицы $\\to 040$.
  4. ' + +'
  5. Соединяем: $203\\,040$.
  6. ' + +'
  7. Проверка: читаем обратно — «двести три тысячи сорок». Верно!
  8. ' + +'
'); + h+=makeCard('theory','А знаешь ли ты?','2.5', + '

Число $10^{100}$ (единица со ста нулями) называется гугол. Это слово придумал девятилетний племянник математика Эдварда Каснера. От него же произошло название поисковика Google. А гуголов в одном гуголплексе — гугол!

'); + h+='
Интерактив 1
Разрядная таблица
' + +'
Введи натуральное число (до 9 цифр) — оно разложится по классам и разрядам.
' + +'
' + +'
'; + h+='
Интерактив 2
Какая цифра в разряде?
' + +'
Назови цифру в указанном разряде данного числа. Введи одну цифру (0–9).
' + +'
Вопрос 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + 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=''; + for(var c=0;c<3;c++) th+=''; + th+=''; + for(var k=0;k<9;k++) th+=''; + th+=''; + for(var d=0;d<9;d++){ var grp=Math.floor(d/3),dim=d'+s[d]+''; } + th+='
'+CLS[c][0]+'
'+LAB[k]+'
'; + th+='
$'+_grp(num)+'$
'; + 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='Готово! Результат: '+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)+'$. Какая цифра в разряде '+cur.place+'?'; 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','★', + '

Пять боссов проверят владение натуральными числами: разряды, округление, действия и степень. Побей не меньше четырёх — и глава покорена!

'); + h+='
Боссы
Сразись с главой 1
' + +'
' + +'
Босс 1 / 5Побеждено: 0 / 5
' + +'
' + +'
' + +'
' + +'
'; + 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)+'$ назови цифру в разряде тысяч.', ans:+s[s.length-4]}; }, + function(){ var n=_ri(1200,9800); return {name:'Округлитель', q:'Округли $'+_grp(n)+'$ до сотен.', 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?'Победа! Глава 1 пройдена. ':'Бой окончен. ')+'Побеждено боссов: '+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(); + })(); +} + +/* ===================== ДАННЫЕ САЙДБАРА / ГЛОССАРИЯ ===================== */ +var SIDEBARS = { + p1:{ title:'Шпаргалка § 1', rows:[ + ['Шаг 1','понять условие: что дано, что найти'], + ['Шаг 2','составить план действий'], + ['Шаг 3','выполнить вычисления'], + ['Шаг 4','проверить ответ'] ]}, + p2:{ title:'Шпаргалка § 2', rows:[ + ['Натуральные','$1,2,3,\\dots$ — для счёта'], + ['Нуль','не натуральное, но нужно в записи'], + ['Класс','группа из 3 разрядов'], + ['Классы','единицы, тысячи, миллионы…'] ]}, + final:{ title:'Финал главы 1', rows:[ + ['5 боссов','разряды, округление, действия, степень'], + ['Победа','4 из 5 и больше'], + ['Награда','+40 XP и достижение «Глава 1 пройдена»'] ]} +}; +var TIPS = [ + { sec:'p1', html:'Не бросайся считать сразу. Сначала спроси себя: «что дано?» и «что нужно найти?» — половина дела готова.' }, + { sec:'p2', html:'Разбивай длинное число на классы по три цифры справа: $12\\,345\\,678$. Так его легко прочитать.' }, + { 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, final:buildFinal }; +Object.assign(window.M6, { sidebars:SIDEBARS, tips:TIPS, glossary:GLOSSARY, builders:BUILDERS });