diff --git a/frontend/js/trainer/generators.js b/frontend/js/trainer/generators.js index 8897829..855525e 100644 --- a/frontend/js/trainer/generators.js +++ b/frontend/js/trainer/generators.js @@ -20,15 +20,20 @@ ════════════════════════════════════════════════════════════════════════ */ (function (global) { + // Классы по программе наших учебников (Алгебра/Геометрия 7–9). var TOPICS = [ - { key: 'linear-eq', label: 'Уравнения', subject: 'algebra', grade: 7, order: 1 }, - { key: 'proportions', label: 'Пропорции', subject: 'algebra', grade: 7, order: 2 }, - { key: 'percents', label: 'Проценты', subject: 'algebra', grade: 7, order: 3 }, - { key: 'simplify', label: 'Упрощение', subject: 'algebra', grade: 7, order: 4 }, - { key: 'quadratic', label: 'Квадратные', subject: 'algebra', grade: 8, order: 5 }, - { key: 'powers', label: 'Степени', subject: 'algebra', grade: 8, order: 6 }, - { key: 'formulas', label: 'Формулы', subject: 'algebra', grade: 8, order: 7 }, - { key: 'inequalities', label: 'Неравенства', subject: 'algebra', grade: 8, order: 8 } + { key: 'linear-eq', label: 'Уравнения', subject: 'algebra', grade: 7, order: 1 }, + { key: 'proportions', label: 'Пропорции', subject: 'algebra', grade: 6, order: 2 }, + { key: 'percents', label: 'Проценты', subject: 'algebra', grade: 6, order: 3 }, + { key: 'simplify', label: 'Упрощение', subject: 'algebra', grade: 7, order: 4 }, + { key: 'powers', label: 'Степени', subject: 'algebra', grade: 7, order: 5 }, + { key: 'formulas', label: 'Формулы', subject: 'algebra', grade: 7, order: 6 }, + { key: 'inequalities', label: 'Неравенства', subject: 'algebra', grade: 7, order: 7 }, + { key: 'quadratic', label: 'Квадратные', subject: 'algebra', grade: 8, order: 8 }, + { key: 'progressions', label: 'Прогрессии', subject: 'algebra', grade: 9, order: 9 }, + { key: 'g-angles', label: 'Углы', subject: 'geometry', grade: 7, order: 10 }, + { key: 'g-pyth', label: 'Пифагор', subject: 'geometry', grade: 8, order: 11 }, + { key: 'g-area', label: 'Площади', subject: 'geometry', grade: 8, order: 12 } ]; var GENERATORS = [ @@ -442,6 +447,149 @@ { note: 'Переносим {b} вправо:', tex: '-{a}x < {cmb}' }, { note: 'Делим на отрицательное число (−{a}) — знак неравенства МЕНЯЕТСЯ на противоположный:', tex: 'x > {root}' } ] + }, + + /* ═══ Тема: Прогрессии (9 класс) ═══ */ + + /* n-й член арифметической прогрессии */ + { + id: 'prog-arith-term', topic: 'progressions', order: 1, subject: 'algebra', grade: 9, kind: 'compute', + title: 'n-й член арифм. прогрессии', + pick: { a: [-10, 20], d: [-8, 8], n: [3, 12] }, require: 'd != 0', + derive: { val: 'a + (n - 1)*d' }, + lhs: 'x', rhs: '{a} + ({n} - 1)*{d}', display: 'Арифметическая прогрессия: a₁ = {a}, d = {d}. Найдите {n}-й член.', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Формула n-го члена арифметической прогрессии: aₙ = a₁ + (n − 1)·d. Подставляем:', tex: 'x = {a} + ({n} - 1)*{d}' }, + { note: 'Считаем:', tex: 'x = {ans}' } + ] + }, + + /* n-й член геометрической прогрессии */ + { + id: 'prog-geom-term', topic: 'progressions', order: 2, subject: 'algebra', grade: 9, kind: 'compute', + title: 'n-й член геом. прогрессии', + pick: { b: [1, 5], q: [2, 3], n: [2, 4] }, + derive: { val: 'b * q^(n - 1)' }, + lhs: 'x', rhs: '{b} * {q}^({n} - 1)', display: 'Геометрическая прогрессия: b₁ = {b}, q = {q}. Найдите {n}-й член.', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Формула n-го члена геометрической прогрессии: bₙ = b₁·q^(n−1). Подставляем:', tex: 'x = {b} * {q}^({n} - 1)' }, + { note: 'Считаем:', tex: 'x = {ans}' } + ] + }, + + /* ═══ Тема: Углы (геометрия, 7 класс) ═══ */ + + /* третий угол треугольника */ + { + id: 'ang-triangle', topic: 'g-angles', order: 1, subject: 'geometry', grade: 7, kind: 'compute', + title: 'Третий угол треугольника', + pick: { a: [20, 80], b: [20, 80] }, derive: { val: '180 - a - b' }, require: 'val >= 15 && val <= 150', + lhs: 'x', rhs: '180 - {a} - {b}', display: 'В треугольнике два угла равны {a}° и {b}°. Найдите третий угол (в градусах).', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Сумма углов треугольника равна 180°. Значит третий угол:', tex: 'x = 180 - {a} - {b}' }, + { note: 'Считаем:', tex: 'x = {ans}' } + ] + }, + + /* смежный угол */ + { + id: 'ang-adjacent', topic: 'g-angles', order: 2, subject: 'geometry', grade: 7, kind: 'compute', + title: 'Смежный угол', + pick: { a: [25, 155] }, derive: { val: '180 - a' }, + lhs: 'x', rhs: '180 - {a}', display: 'Один из смежных углов равен {a}°. Найдите другой смежный с ним угол.', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Сумма смежных углов равна 180°. Значит:', tex: 'x = 180 - {a}' }, + { note: 'Считаем:', tex: 'x = {ans}' } + ] + }, + + /* внешний угол треугольника */ + { + id: 'ang-exterior', topic: 'g-angles', order: 3, subject: 'geometry', grade: 7, kind: 'compute', + title: 'Внешний угол треугольника', + pick: { a: [20, 80], b: [20, 80] }, derive: { val: 'a + b' }, require: 'val <= 160', + lhs: 'x', rhs: '{a} + {b}', display: 'Внешний угол треугольника равен сумме двух не смежных с ним внутренних углов. Эти углы равны {a}° и {b}°. Найдите внешний угол.', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Внешний угол треугольника равен сумме двух не смежных с ним внутренних углов:', tex: 'x = {a} + {b}' }, + { note: 'Считаем:', tex: 'x = {ans}' } + ] + }, + + /* ═══ Тема: Теорема Пифагора (геометрия, 8 класс) ═══ */ + + /* гипотенуза по катетам (пифагорова тройка m,n) */ + { + id: 'pyth-hyp', topic: 'g-pyth', order: 1, subject: 'geometry', grade: 8, kind: 'compute', + title: 'Гипотенуза (Пифагор)', + pick: { m: [2, 5], n: [1, 4] }, constraint: 'm > n', + derive: { a: 'm*m - n*n', b: '2*m*n', c: 'm*m + n*n' }, + lhs: 'x', rhs: 'sqrt({a}^2 + {b}^2)', display: 'Катеты прямоугольного треугольника равны {a} и {b}. Найдите гипотенузу.', + answerVar: 'x', answer: 'c', integerAnswer: true, + solution: [ + { note: 'По теореме Пифагора c² = a² + b², значит c = √(a² + b²):', tex: 'x = sqrt({a}^2 + {b}^2)' }, + { note: 'Считаем (выходит целое — это пифагорова тройка):', tex: 'x = {ans}' } + ] + }, + + /* катет по гипотенузе и катету */ + { + id: 'pyth-leg', topic: 'g-pyth', order: 2, subject: 'geometry', grade: 8, kind: 'compute', + title: 'Катет (Пифагор)', + pick: { m: [2, 5], n: [1, 4] }, constraint: 'm > n', + derive: { a: 'm*m - n*n', b: '2*m*n', c: 'm*m + n*n' }, + lhs: 'x', rhs: 'sqrt({c}^2 - {a}^2)', display: 'Гипотенуза прямоугольного треугольника {c}, один катет {a}. Найдите второй катет.', + answerVar: 'x', answer: 'b', integerAnswer: true, + solution: [ + { note: 'По теореме Пифагора b² = c² − a², значит b = √(c² − a²):', tex: 'x = sqrt({c}^2 - {a}^2)' }, + { note: 'Считаем:', tex: 'x = {ans}' } + ] + }, + + /* ═══ Тема: Площади (геометрия, 8 класс) ═══ */ + + /* площадь прямоугольника */ + { + id: 'area-rect', topic: 'g-area', order: 1, subject: 'geometry', grade: 8, kind: 'compute', + title: 'Площадь прямоугольника', + pick: { a: [2, 16], b: [2, 16] }, derive: { val: 'a*b' }, + lhs: 'x', rhs: '{a}*{b}', display: 'Стороны прямоугольника {a} и {b}. Найдите его площадь.', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Площадь прямоугольника — произведение его сторон:', tex: 'x = {a}*{b}' }, + { note: 'Считаем:', tex: 'x = {ans}' } + ] + }, + + /* площадь треугольника */ + { + id: 'area-triangle', topic: 'g-area', order: 2, subject: 'geometry', grade: 8, kind: 'compute', + title: 'Площадь треугольника', + pick: { a: [2, 16], h: [2, 16] }, require: 'mod(a*h, 2) == 0', + derive: { val: 'a*h/2' }, + lhs: 'x', rhs: '{a}*{h}/2', display: 'Основание треугольника {a}, высота к нему {h}. Найдите площадь.', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Площадь треугольника — половина произведения основания на высоту:', tex: 'x = {a}*{h}/2' }, + { note: 'Считаем:', tex: 'x = {ans}' } + ] + }, + + /* площадь квадрата */ + { + id: 'area-square', topic: 'g-area', order: 3, subject: 'geometry', grade: 8, kind: 'compute', + title: 'Площадь квадрата', + pick: { a: [2, 20] }, derive: { val: 'a*a' }, + lhs: 'x', rhs: '{a}^2', display: 'Сторона квадрата {a}. Найдите его площадь.', + answerVar: 'x', answer: 'val', integerAnswer: true, + solution: [ + { note: 'Площадь квадрата — сторона, возведённая в квадрат:', tex: 'x = {a}^2' }, + { note: 'Считаем:', tex: 'x = {ans}' } + ] } ]; diff --git a/frontend/trainer.html b/frontend/trainer.html index d4182d3..de984dc 100644 --- a/frontend/trainer.html +++ b/frontend/trainer.html @@ -39,9 +39,16 @@ } .tr-wrap { max-width: 740px; margin: 0 auto; padding: 34px 20px 90px; } @keyframes trUp { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } } - .tr-head, .tr-overall, .tr-mode, .tr-topbar, .tr-skillpanel, .tr-card { animation: trUp .5s var(--ease) both; } + .tr-head, .tr-overall, .tr-mode, .tr-subjects, .tr-topbar, .tr-skillpanel, .tr-card { animation: trUp .5s var(--ease) both; } .tr-overall { animation-delay: .04s; } .tr-mode { animation-delay: .06s; } - .tr-topbar { animation-delay: .1s; } .tr-skillpanel { animation-delay: .13s; } .tr-card { animation-delay: .16s; } + .tr-subjects { animation-delay: .08s; } .tr-topbar { animation-delay: .1s; } .tr-skillpanel { animation-delay: .13s; } .tr-card { animation-delay: .16s; } + + /* ── фильтр по предмету (Алгебра / Геометрия) ── */ + .tr-subjects { display: flex; gap: 7px; margin-bottom: 14px; } + .tr-subjects:empty { display: none; } + .tr-subbtn { font: inherit; font-size: .86rem; font-weight: 800; cursor: pointer; padding: 8px 18px; border-radius: 99px; border: 1px solid rgba(99,102,241,.2); background: #fff; color: var(--ink-soft); transition: .16s var(--ease); } + .tr-subbtn:hover { border-color: var(--g1); color: var(--accent-ink); } + .tr-subbtn.on { color: #fff; border-color: transparent; background: linear-gradient(135deg, var(--g1), var(--g2)); box-shadow: 0 8px 20px rgba(99,102,241,.3); } .tr-head { margin-bottom: 20px; } .tr-h1 { @@ -335,6 +342,7 @@ +