feat(trainer): НОД/НОК с нормальными числами; универсальная шапка; НОК теперь появляется
НОД/НОК (числа больше + без степеней):
- движок: фича factorize ({name, of}) кладёт в шаги решения СТРОКУ разложения на простые множители без степеней (36 -> «2*2*3*3»); helper primeFactorString
- генераторы: a=g·m, b=g·n (g,m,n из 2..9) -> нормальные числа (14, 35, 16, 112…), общий множитель гарантирован; решение показывает разложение обоих + НОД/НОК = произведение множителей
- пример: 16 = 2·2·2·2, НОК = 2·2·2·2·7 = 112
НОК теперь появляется (раньше показывался только НОД):
- причина: smart-подбор брал первый неосвоенный навык ГЛОБАЛЬНО -> из НОД прыгал на lin-basic, НОК не доходил
- фикс: умная тренировка теперь адаптируется В ПРЕДЕЛАХ выбранной темы (pickNext scope = skillsOf(curTopic)) -> в теме «НОД и НОК» ведёт по обоим навыкам; тему выбирает ученик в рейле
Шапка: пилюля стала универсальной и динамической (updateSubjectPill: «Алгебра · 5–9 класс» / «Геометрия · 7–8 класс» по текущему предмету), вместо статичной «Алгебра · 7–8 класс».
Смоук движка 1154/1154, страница 42/42; эмодзи 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -68,6 +68,17 @@
|
||||
}
|
||||
function randInt(rng, lo, hi) { return lo + Math.floor(rng() * (hi - lo + 1)); }
|
||||
|
||||
/* Разложение числа на простые множители как строка «2*2*3» (без степеней, по
|
||||
возрастанию). Для отображения в шагах решения (НОД/НОК и т.п.). */
|
||||
function primeFactorString(n) {
|
||||
n = Math.abs(Math.round(n));
|
||||
if (!isFinite(n) || n < 2) return String(n || 0);
|
||||
var fs = [], d = 2;
|
||||
while (d * d <= n) { while (n % d === 0) { fs.push(d); n = n / d; } d++; }
|
||||
if (n > 1) fs.push(n);
|
||||
return fs.join('*');
|
||||
}
|
||||
|
||||
/* ── Уровни сложности: масштабирование диапазона pick ──
|
||||
level 2 — базовый (как задано); 1 — легче (меньше магнитуды, меньше
|
||||
отрицательных); 3 — сложнее (шире магнитуды). Универсально для всех
|
||||
@@ -322,6 +333,15 @@
|
||||
var lhsExpr = render(gen.lhs || 'x', env);
|
||||
var rhsExpr = render(gen.rhs || 'x', env);
|
||||
var sEnv = assign(env, { ans: answer });
|
||||
// factorize: добавляет в шаги решения СТРОКУ разложения на простые множители
|
||||
// (повторяющиеся простые, без степеней: «36» -> «2*2*3*3»). gen.factorize —
|
||||
// массив { name, of }: name — ключ для {name} в шагах, of — выражение-число.
|
||||
if (gen.factorize) {
|
||||
for (var fzi = 0; fzi < gen.factorize.length; fzi++) {
|
||||
var fz = gen.factorize[fzi];
|
||||
sEnv[fz.name] = primeFactorString(evalExpr(fz.of, env));
|
||||
}
|
||||
}
|
||||
var answerExpr = gen.answerExpr ? render(gen.answerExpr, env) : null;
|
||||
var answerRel = (kind === 'inequality') ? { op: gen.relOp || '<', bound: evalExpr(gen.bound, env) } : null;
|
||||
// latex: уравнение (solve/roots) | выражение (simplify) | неравенство (inequality)
|
||||
|
||||
Reference in New Issue
Block a user