fix(trainer): сложность = структура задачи, а не масштаб чисел

Пользователь верно заметил: масштабирование чисел (больше/меньше) — не настоящая сложность. Настоящая = больше действий, скобки, дроби, переменная в обеих частях.

- генераторы размечены структурным level 1-3 (generators.js, LEVELS): напр. Уравнения ax+b=c (1) -> a(x+b)=c (2) -> a(x+b)=c(x+d) (3); Степени: вычислить -> произведение -> степень степени
- контрол сложности выбирает ВАРИАНТ-генератор нужного уровня в теме (pickByLevel с клампом к доступным), а не масштабирует числа
- клик по чипу навыка закрепляет конкретный вариант (pinned); Авто = адаптивный подбор (умная тренировка от простого к сложному) + показ ур.N текущего
- кросс-тематический адаптив pickNext — только в Авто без закрепления
- движковое _scaleRange/level оставлено как capability (T18), страница его НЕ использует
- смоук движка 682/682, страница 36/36 (Сложный->ген ур.3, Лёгкий->ур.1); эмодзи/eval 0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-25 16:24:31 +03:00
parent d07cb2a434
commit f0af2079c3
3 changed files with 87 additions and 19 deletions
+32
View File
@@ -594,6 +594,38 @@
];
// Структурная сложность генератора (1 — простейшая форма, 3 — больше действий /
// скобки / дроби / переменная в обеих частях). Определяет, какой ВАРИАНТ внутри
// темы даётся на выбранном уровне сложности (не просто масштаб чисел).
var LEVELS = {
// Уравнения: ax+b=c → скобки/обе части/дроби → (ax+b)/c=d
'lin-basic': 1, 'lin-paren': 2, 'lin-both-sides': 2, 'lin-frac-denom': 2,
'lin-coef-frac': 2, 'lin-paren-both': 3, 'lin-frac-eq': 3,
// Пропорции
'prop-x-right': 1, 'prop-x-left': 1, 'prop-x-denom': 2,
// Проценты
'pct-of': 1, 'pct-what': 2, 'pct-whole': 2,
// Упрощение
'simp-like': 1, 'simp-expand': 2,
// Степени
'pow-eval': 1, 'pow-mult': 2, 'pow-pow': 3,
// Формулы сокр. умножения
'sq-sum': 2, 'sq-diff': 2, 'diff-sq': 3,
// Неравенства (смена знака — сложнее)
'ineq-lt': 1, 'ineq-ge': 1, 'ineq-flip': 3,
// Квадратные
'quad-diff': 2, 'quad-factored': 3,
// Прогрессии
'prog-arith-term': 2, 'prog-geom-term': 3,
// Геометрия — Углы
'ang-adjacent': 1, 'ang-triangle': 2, 'ang-exterior': 2,
// Геометрия — Пифагор
'pyth-hyp': 2, 'pyth-leg': 3,
// Геометрия — Площади
'area-square': 1, 'area-rect': 1, 'area-triangle': 2
};
GENERATORS.forEach(function (g) { g.level = LEVELS[g.id] || 1; });
function get(id) {
for (var i = 0; i < GENERATORS.length; i++) if (GENERATORS[i].id === id) return GENERATORS[i];
return null;