feat(trainer): обозначения по темам вместо «x» — движение S/t/v, проценты p, прибыль/смесь p

Расширил answerSym на темы, где есть стандартная латинская буква (где это уместно
и не конфликтует с обозначением из условия):
- Движение: app-move-dist→S (путь), app-move-time→t, app-move-speed→v,
  app-meet→t, app-overtake→t, app-work-joint→t.
- Проценты: pct-what→p, pct-change→p; смеси app-mix-blend→p; прибыль app-profit-pct→p.
Линейные/пропорции/неравенства/системы оставлены на x/y (это и есть переменные);
углы — x (греческая буква ломала бы KaTeX); НОД/дроби/десятичные — x (нет чистого
однобуквенного обозначения). app-upstream и n-й член прогрессии оставлены на x
(буква совпала бы с данным из условия: v собств. скорости, a₁/b₁).

Итого 42 генератора с обозначением искомой (S/P/C/L/d/p/t/v/b/c/k/n/q). Префикс
ввода, подпись ответа и шаги решения используют его. Проверка: 1680 экземпляров,
0 проблем (latex валиден, нет остаточного x/кириллицы, ответ принимается);
смоук v41 99634.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-29 19:30:23 +03:00
parent a835c94d65
commit 753bd7e289
+10 -10
View File
@@ -245,7 +245,7 @@
/* сколько % составляет a от b */ /* сколько % составляет a от b */
{ {
id: 'pct-what', topic: 'percents', order: 2, subject: 'algebra', grade: 7, kind: 'compute', id: 'pct-what', topic: 'percents', order: 2, subject: 'algebra', grade: 7, kind: 'compute',
title: 'Сколько процентов', title: 'Сколько процентов', answerSym: 'p',
pick: { pidx: [2, 10], bbase: [1, 8] }, pick: { pidx: [2, 10], bbase: [1, 8] },
derive: { p: 'pidx*5', b: 'bbase*20', a: 'pidx*bbase' }, derive: { p: 'pidx*5', b: 'bbase*20', a: 'pidx*bbase' },
lhs: 'x', rhs: '100*{a}/{b}', display: 'Сколько процентов составляет {a} от {b}?', lhs: 'x', rhs: '100*{a}/{b}', display: 'Сколько процентов составляет {a} от {b}?',
@@ -673,7 +673,7 @@
/* путь = скорость × время */ /* путь = скорость × время */
{ {
id: 'app-move-dist', topic: 'applied', order: 1, subject: 'algebra', grade: 7, kind: 'compute', id: 'app-move-dist', topic: 'applied', order: 1, subject: 'algebra', grade: 7, kind: 'compute',
title: 'Путь (движение)', title: 'Путь (движение)', answerSym: 'S',
pick: { v: [10, 90], t: [2, 9] }, derive: { val: 'v*t' }, pick: { v: [10, 90], t: [2, 9] }, derive: { val: 'v*t' },
lhs: 'x', rhs: '{v}*{t}', display: 'Автомобиль ехал {t} ч со скоростью {v} км/ч. Какой путь он проехал (в км)?', lhs: 'x', rhs: '{v}*{t}', display: 'Автомобиль ехал {t} ч со скоростью {v} км/ч. Какой путь он проехал (в км)?',
answerVar: 'x', answer: 'val', integerAnswer: true, answerVar: 'x', answer: 'val', integerAnswer: true,
@@ -686,7 +686,7 @@
/* время = путь / скорость */ /* время = путь / скорость */
{ {
id: 'app-move-time', topic: 'applied', order: 2, subject: 'algebra', grade: 7, kind: 'compute', id: 'app-move-time', topic: 'applied', order: 2, subject: 'algebra', grade: 7, kind: 'compute',
title: 'Время (движение)', title: 'Время (движение)', answerSym: 't',
pick: { v: [10, 90], t: [2, 9] }, derive: { S: 'v*t', val: 't' }, pick: { v: [10, 90], t: [2, 9] }, derive: { S: 'v*t', val: 't' },
lhs: 'x', rhs: '{S}/{v}', display: 'Расстояние между городами {S} км. Автомобиль едет со скоростью {v} км/ч. За сколько часов он доедет?', lhs: 'x', rhs: '{S}/{v}', display: 'Расстояние между городами {S} км. Автомобиль едет со скоростью {v} км/ч. За сколько часов он доедет?',
answerVar: 'x', answer: 'val', integerAnswer: true, answerVar: 'x', answer: 'val', integerAnswer: true,
@@ -699,7 +699,7 @@
/* скорость = путь / время */ /* скорость = путь / время */
{ {
id: 'app-move-speed', topic: 'applied', order: 3, subject: 'algebra', grade: 7, kind: 'compute', id: 'app-move-speed', topic: 'applied', order: 3, subject: 'algebra', grade: 7, kind: 'compute',
title: 'Скорость (движение)', title: 'Скорость (движение)', answerSym: 'v',
pick: { v: [10, 90], t: [2, 9] }, derive: { S: 'v*t', val: 'v' }, pick: { v: [10, 90], t: [2, 9] }, derive: { S: 'v*t', val: 'v' },
lhs: 'x', rhs: '{S}/{t}', display: 'Поезд прошёл {S} км за {t} ч. Найдите его среднюю скорость (км/ч).', lhs: 'x', rhs: '{S}/{t}', display: 'Поезд прошёл {S} км за {t} ч. Найдите его среднюю скорость (км/ч).',
answerVar: 'x', answer: 'val', integerAnswer: true, answerVar: 'x', answer: 'val', integerAnswer: true,
@@ -1459,7 +1459,7 @@
/* на сколько процентов изменилось */ /* на сколько процентов изменилось */
{ {
id: 'pct-change', topic: 'percents', order: 6, subject: 'algebra', grade: 7, kind: 'compute', id: 'pct-change', topic: 'percents', order: 6, subject: 'algebra', grade: 7, kind: 'compute',
title: 'На сколько процентов выросло', title: 'На сколько процентов выросло', answerSym: 'p',
pick: { abase: [2, 12], pidx: [1, 10] }, pick: { abase: [2, 12], pidx: [1, 10] },
derive: { a: 'abase*20', p: 'pidx*5', b: 'abase*(100 + pidx*5)/5', val: 'pidx*5' }, derive: { a: 'abase*20', p: 'pidx*5', b: 'abase*(100 + pidx*5)/5', val: 'pidx*5' },
lhs: 'x', rhs: '100*({b} - {a})/{a}', display: 'Цена выросла с {a} руб до {b} руб. На сколько процентов выросла цена?', lhs: 'x', rhs: '100*({b} - {a})/{a}', display: 'Цена выросла с {a} руб до {b} руб. На сколько процентов выросла цена?',
@@ -1521,7 +1521,7 @@
/* встречное движение */ /* встречное движение */
{ {
id: 'app-meet', topic: 'applied', order: 6, subject: 'algebra', grade: 7, kind: 'compute', id: 'app-meet', topic: 'applied', order: 6, subject: 'algebra', grade: 7, kind: 'compute',
title: 'Встречное движение', title: 'Встречное движение', answerSym: 't',
pick: { u: [20, 70], v: [20, 70], t: [2, 6] }, pick: { u: [20, 70], v: [20, 70], t: [2, 6] },
derive: { S: '(u + v)*t', val: 't' }, derive: { S: '(u + v)*t', val: 't' },
lhs: 'x', rhs: '{S}/({u}+{v})', display: 'Из двух городов навстречу выехали машины со скоростями {u} и {v} км/ч. Расстояние между городами {S} км. Через сколько часов они встретятся?', lhs: 'x', rhs: '{S}/({u}+{v})', display: 'Из двух городов навстречу выехали машины со скоростями {u} и {v} км/ч. Расстояние между городами {S} км. Через сколько часов они встретятся?',
@@ -1536,7 +1536,7 @@
/* движение вдогонку */ /* движение вдогонку */
{ {
id: 'app-overtake', topic: 'applied', order: 7, subject: 'algebra', grade: 8, kind: 'compute', id: 'app-overtake', topic: 'applied', order: 7, subject: 'algebra', grade: 8, kind: 'compute',
title: 'Движение вдогонку', title: 'Движение вдогонку', answerSym: 't',
pick: { u: [10, 40], g: [5, 30], t: [2, 6] }, pick: { u: [10, 40], g: [5, 30], t: [2, 6] },
derive: { v: 'u + g', d: 'g*t', val: 't' }, derive: { v: 'u + g', d: 'g*t', val: 't' },
lhs: 'x', rhs: '{d}/({v}-{u})', display: 'Велосипедист едет со скоростью {u} км/ч, мотоциклист — со скоростью {v} км/ч, отставая на {d} км. Через сколько часов мотоциклист догонит велосипедиста?', lhs: 'x', rhs: '{d}/({v}-{u})', display: 'Велосипедист едет со скоростью {u} км/ч, мотоциклист — со скоростью {v} км/ч, отставая на {d} км. Через сколько часов мотоциклист догонит велосипедиста?',
@@ -1565,7 +1565,7 @@
/* совместная работа */ /* совместная работа */
{ {
id: 'app-work-joint', topic: 'applied', order: 9, subject: 'algebra', grade: 8, kind: 'compute', id: 'app-work-joint', topic: 'applied', order: 9, subject: 'algebra', grade: 8, kind: 'compute',
title: 'Совместная работа', title: 'Совместная работа', answerSym: 't',
pick: { t: [2, 6], a: [3, 14] }, constraint: 'a > t', pick: { t: [2, 6], a: [3, 14] }, constraint: 'a > t',
derive: { b: 'a*t/(a - t)', val: 't' }, derive: { b: 'a*t/(a - t)', val: 't' },
require: 'mod(a*t, a - t) == 0 && b >= 2 && b <= 60', require: 'mod(a*t, a - t) == 0 && b >= 2 && b <= 60',
@@ -1581,7 +1581,7 @@
/* смешивание двух растворов */ /* смешивание двух растворов */
{ {
id: 'app-mix-blend', topic: 'applied', order: 10, subject: 'algebra', grade: 9, kind: 'compute', id: 'app-mix-blend', topic: 'applied', order: 10, subject: 'algebra', grade: 9, kind: 'compute',
title: 'Концентрация смеси', title: 'Концентрация смеси', answerSym: 'p',
pick: { m1: [1, 6], m2: [1, 6], p1: [10, 40], p2: [50, 90] }, pick: { m1: [1, 6], m2: [1, 6], p1: [10, 40], p2: [50, 90] },
derive: { val: '(m1*p1 + m2*p2)/(m1 + m2)' }, derive: { val: '(m1*p1 + m2*p2)/(m1 + m2)' },
require: 'mod(m1*p1 + m2*p2, m1 + m2) == 0', require: 'mod(m1*p1 + m2*p2, m1 + m2) == 0',
@@ -1597,7 +1597,7 @@
/* прибыль в процентах */ /* прибыль в процентах */
{ {
id: 'app-profit-pct', topic: 'applied', order: 11, subject: 'algebra', grade: 8, kind: 'compute', id: 'app-profit-pct', topic: 'applied', order: 11, subject: 'algebra', grade: 8, kind: 'compute',
title: 'Прибыль в процентах', title: 'Прибыль в процентах', answerSym: 'p',
pick: { cbase: [1, 9], pidx: [1, 10] }, pick: { cbase: [1, 9], pidx: [1, 10] },
derive: { c: 'cbase*100', p: 'pidx*5', s: 'cbase*(100 + pidx*5)', val: 'pidx*5' }, derive: { c: 'cbase*100', p: 'pidx*5', s: 'cbase*(100 + pidx*5)', val: 'pidx*5' },
lhs: 'x', rhs: '100*({s} - {c})/{c}', display: 'Товар купили за {c} руб, а продали за {s} руб. Сколько процентов прибыли получили?', lhs: 'x', rhs: '100*({s} - {c})/{c}', display: 'Товар купили за {c} руб, а продали за {s} руб. Сколько процентов прибыли получили?',