feat(trainer): V4.1 группа 5 — 19 генераторов (арифметика 5–6 класс)
Пятая волна плана v4. Все compute, «корень-вперёд». Часть ответов — дроби/ десятичные (SimExpr принимает «3/4», «0.75»); коды сравнения 1/2/0 — целые. НОД/НОК (gcd-lcm): gcd-triple, lcm-triple, coprime-check (взаимно простые, 1/0), lcm-buses (снова вместе — задача). Дроби (fractions): frac-reduce (сократить), frac-add-unlike (разные знаменатели), frac-mult (умножение), frac-compare (сравнить, код 1/2), frac-of-whole-inverse (число по части), frac-to-decimal (дробь→десятичная). Десятичные (decimals): dec-div (деление), dec-round (округление), dec-times-pow10 (умножение на 10/100/1000 — сдвиг запятой), dec-compare (сравнить, код 1/2). Отрицательные (negatives): neg-div (деление), neg-order-ops (порядок действий), neg-abs (модуль), neg-compare-line (на координатной прямой), neg-square ((−a)²). Новые форматы условий: истина/ложь (1/0), «что больше» кодом (1/2), словесный контекст (автобусы), обратные задачи. Итого 155 генераторов. Смоук 52626 проверок (целочисленность только для integerAnswer; дробные/десятичные ответы конечны и принимаются; коды сравнения; все шаги→LaTeX); геометрия (6968/0). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2197,6 +2197,296 @@
|
||||
{ note: 'Всего кресел — сумма Sₙ = n(a₁ + aₙ)/2.', tex: 'x = {n} * ({a} + {an}) / 2' },
|
||||
{ note: 'Считаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* ═══════════════════════════════════════════════════════════════════════
|
||||
V4.1 — Группа 5: арифметика 5–6 (НОД/НОК, дроби, десятичные, отрицательные).
|
||||
Все compute, «корень-вперёд». Часть ответов — дроби/десятичные (не целые) —
|
||||
SimExpr принимает «3/4», «0.75» и т.п. Коды сравнения (1/2/0) — целые.
|
||||
═══════════════════════════════════════════════════════════════════════ */
|
||||
|
||||
/* ── НОД и НОК ── */
|
||||
|
||||
/* НОД трёх чисел */
|
||||
{
|
||||
id: 'gcd-triple', topic: 'gcd-lcm', order: 3, subject: 'algebra', grade: 5, kind: 'compute',
|
||||
title: 'НОД трёх чисел',
|
||||
pick: { g: [2, 8], m: [1, 6], n: [1, 6], k: [1, 6] }, constraint: 'm != n && n != k && m != k',
|
||||
derive: { a: 'g*m', b: 'g*n', c: 'g*k', val: 'gcd(a, gcd(b, c))' },
|
||||
require: 'a <= 120 && b <= 120 && c <= 120',
|
||||
factorize: [{ name: 'aFac', of: 'a' }, { name: 'bFac', of: 'b' }, { name: 'cFac', of: 'c' }, { name: 'dFac', of: 'gcd(a, gcd(b, c))' }],
|
||||
lhs: 'x', rhs: 'gcd({a}, gcd({b}, {c}))', display: 'Найдите наибольший общий делитель (НОД) чисел {a}, {b} и {c}.',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Разложим на простые множители: {a} = {aFac}, {b} = {bFac}, {c} = {cFac}.', tex: '' },
|
||||
{ note: 'НОД — произведение ОБЩИХ для всех трёх множителей.', tex: 'x = {dFac}' },
|
||||
{ note: 'Считаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* НОК трёх чисел */
|
||||
{
|
||||
id: 'lcm-triple', topic: 'gcd-lcm', order: 4, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'НОК трёх чисел',
|
||||
pick: { a: [2, 9], b: [2, 9], c: [2, 9] }, constraint: 'a != b && b != c && a != c',
|
||||
derive: { val: 'lcm(a, lcm(b, c))' }, require: 'lcm(a, lcm(b, c)) <= 360',
|
||||
factorize: [{ name: 'aFac', of: 'a' }, { name: 'bFac', of: 'b' }, { name: 'cFac', of: 'c' }, { name: 'kFac', of: 'lcm(a, lcm(b, c))' }],
|
||||
lhs: 'x', rhs: 'lcm({a}, lcm({b}, {c}))', display: 'Найдите наименьшее общее кратное (НОК) чисел {a}, {b} и {c}.',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Разложим на простые: {a} = {aFac}, {b} = {bFac}, {c} = {cFac}.', tex: '' },
|
||||
{ note: 'НОК — произведение ВСЕХ множителей (общие берём в наибольшем количестве).', tex: 'x = {kFac}' },
|
||||
{ note: 'Считаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* взаимно простые? (1/0) */
|
||||
{
|
||||
id: 'coprime-check', topic: 'gcd-lcm', order: 5, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Взаимно простые?',
|
||||
pick: { p: [2, 7], q: [2, 9], g: [1, 6] },
|
||||
derive: { a: 'p*g', b: 'q*g', gcdv: 'gcd(p*g, q*g)', val: 'gcd(p*g, q*g) == 1' },
|
||||
require: 'a != b && a <= 90 && b <= 90',
|
||||
lhs: 'x', rhs: 'gcd({a}, {b}) == 1', display: 'Взаимно просты ли числа {a} и {b}? Если да — введите 1, если нет — 0.',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Числа взаимно просты, если их наибольший общий делитель равен 1.', tex: '' },
|
||||
{ note: 'НОД({a}, {b}) = {gcdv}. Если это 1 — ответ 1, иначе 0.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* снова вместе (НОК-задача) */
|
||||
{
|
||||
id: 'lcm-buses', topic: 'gcd-lcm', order: 6, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Снова вместе (НОК)',
|
||||
pick: { a: [3, 12], b: [3, 12] }, constraint: 'a != b',
|
||||
derive: { val: 'lcm(a, b)' }, require: 'lcm(a, b) <= 120',
|
||||
lhs: 'x', rhs: 'lcm({a}, {b})', display: 'Два автобуса отходят от остановки: первый — каждые {a} мин, второй — каждые {b} мин. Сейчас они отправились вместе. Через сколько минут они снова отправятся одновременно?',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Снова вместе — через наименьшее общее кратное интервалов {a} и {b}.', tex: '' },
|
||||
{ note: 'НОК({a}, {b}) =', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* ── Дроби ── */
|
||||
|
||||
/* сократить дробь */
|
||||
{
|
||||
id: 'frac-reduce', topic: 'fractions', order: 3, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Сократить дробь',
|
||||
pick: { p: [1, 7], q: [2, 9], g: [2, 9] }, constraint: 'p < q',
|
||||
derive: { a: 'p*g', b: 'q*g', val: 'p/q' }, require: 'gcd(p, q) == 1 && b <= 90',
|
||||
factorize: [{ name: 'aFac', of: 'a' }, { name: 'bFac', of: 'b' }],
|
||||
lhs: 'x', rhs: '{a}/{b}', display: 'Сократите дробь {a}/{b}. Ответ запишите несократимой дробью (например 2/3).',
|
||||
answerVar: 'x', answer: 'val',
|
||||
solution: [
|
||||
{ note: 'Разложим числитель и знаменатель: {a} = {aFac}, {b} = {bFac}.', tex: '' },
|
||||
{ note: 'Общий множитель — {g}. Делим на него числитель и знаменатель.', tex: 'x = {p} / {q}' },
|
||||
{ note: 'Получаем несократимую дробь.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* сложение дробей с разными знаменателями */
|
||||
{
|
||||
id: 'frac-add-unlike', topic: 'fractions', order: 4, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Сложение дробей (разные знам.)',
|
||||
pick: { m: [2, 6], n: [2, 6], a: [1, 5], b: [1, 5] }, constraint: 'm != n && a < m && b < n',
|
||||
derive: { val: 'a/m + b/n', L: 'lcm(m, n)', num: 'a*(lcm(m, n)/m) + b*(lcm(m, n)/n)' }, require: 'val < 2',
|
||||
lhs: 'x', rhs: '{a}/{m} + {b}/{n}', display: 'Вычислите {a}/{m} + {b}/{n}. Ответ запишите дробью (например 5/6) или числом.',
|
||||
answerVar: 'x', answer: 'val',
|
||||
solution: [
|
||||
{ note: 'Приводим дроби к общему знаменателю НОК({m}, {n}) = {L}.', tex: 'x = {num} / {L}' },
|
||||
{ note: 'Получаем значение (при необходимости сократите).', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* умножение дробей */
|
||||
{
|
||||
id: 'frac-mult', topic: 'fractions', order: 5, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Умножение дробей',
|
||||
pick: { a: [1, 5], m: [2, 6], b: [1, 5], n: [2, 6] }, constraint: 'a < m && b < n',
|
||||
derive: { val: '(a*b)/(m*n)', num: 'a*b', den: 'm*n' },
|
||||
lhs: 'x', rhs: '({a}*{b})/({m}*{n})', display: 'Вычислите {a}/{m} · {b}/{n}. Ответ запишите дробью.',
|
||||
answerVar: 'x', answer: 'val',
|
||||
solution: [
|
||||
{ note: 'Перемножаем числители и знаменатели.', tex: 'x = ({a} * {b}) / ({m} * {n})' },
|
||||
{ note: 'Получаем дробь {num}/{den} (при необходимости сократите).', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* сравнить дроби (код 1/2) */
|
||||
{
|
||||
id: 'frac-compare', topic: 'fractions', order: 6, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Сравнить дроби',
|
||||
pick: { a: [1, 7], m: [2, 9], b: [1, 7], n: [2, 9] }, constraint: 'a < m && b < n && a*n != b*m',
|
||||
derive: { val: '(a*n > b*m) ? 1 : 2' },
|
||||
lhs: 'x', rhs: '(({a}*{n}) > ({b}*{m})) ? 1 : 2', display: 'Сравните дроби {a}/{m} и {b}/{n}. Если больше первая — введите 1, если вторая — 2.',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Сравниваем перекрёстные произведения: {a}·{n} и {b}·{m}.', tex: '' },
|
||||
{ note: 'Большее произведение — у большей дроби. Ответ:', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* число по его части (обратная) */
|
||||
{
|
||||
id: 'frac-of-whole-inverse', topic: 'fractions', order: 7, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Число по его части',
|
||||
pick: { n: [2, 6], a: [1, 5], whole: [2, 9] }, constraint: 'a < n',
|
||||
derive: { m: 'whole*n', val: 'a*whole' },
|
||||
lhs: 'x', rhs: '{val}*{n}/{a}', display: '{a}/{n} некоторого числа равны {val}. Найдите это число.',
|
||||
answerVar: 'x', answer: 'm', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Если {a}/{n} числа равны {val}, то одна {n}-я равна {val} ÷ {a}, а всё число — в {n} раз больше.', tex: 'x = {val} * {n} / {a}' },
|
||||
{ note: 'Считаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* дробь в десятичную */
|
||||
{
|
||||
id: 'frac-to-decimal', topic: 'fractions', order: 8, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Дробь в десятичную',
|
||||
pick: { a: [1, 9], bi: [0, 4] },
|
||||
derive: { b: 'bi == 0 ? 2 : (bi == 1 ? 4 : (bi == 2 ? 5 : (bi == 3 ? 8 : 10)))', val: 'a / (bi == 0 ? 2 : (bi == 1 ? 4 : (bi == 2 ? 5 : (bi == 3 ? 8 : 10))))' },
|
||||
require: 'a < b',
|
||||
lhs: 'x', rhs: '{a}/{b}', display: 'Запишите дробь {a}/{b} в виде десятичной дроби.',
|
||||
answerVar: 'x', answer: 'val',
|
||||
solution: [
|
||||
{ note: 'Знаменатель {b} — делитель степени десяти, поэтому дробь — конечная десятичная.', tex: 'x = {a} / {b}' },
|
||||
{ note: 'Делим числитель на знаменатель.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* ── Десятичные ── */
|
||||
|
||||
/* деление десятичных */
|
||||
{
|
||||
id: 'dec-div', topic: 'decimals', order: 4, subject: 'algebra', grade: 5, kind: 'compute',
|
||||
title: 'Деление десятичных',
|
||||
pick: { q: [2, 9], b: [2, 9] },
|
||||
derive: { db: 'b/10', dividend: '(q*b)/10', val: 'q' },
|
||||
lhs: 'x', rhs: '(({q}*{b})/10)/({b}/10)', display: 'Вычислите {dividend} : {db}.',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Умножим делимое и делитель на 10 — перенесём запятую на один разряд.', tex: 'x = ({q}*{b}) / {b}' },
|
||||
{ note: 'Считаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* округление десятичной */
|
||||
{
|
||||
id: 'dec-round', topic: 'decimals', order: 5, subject: 'algebra', grade: 5, kind: 'compute',
|
||||
title: 'Округление десятичной',
|
||||
pick: { whole: [0, 9], h: [10, 99] },
|
||||
derive: { d: 'whole + h/100', val: 'round((whole*100 + h)/10)/10' },
|
||||
lhs: 'x', rhs: 'round(({whole}*100 + {h})/10)/10', display: 'Округлите число {d} до десятых.',
|
||||
answerVar: 'x', answer: 'val',
|
||||
solution: [
|
||||
{ note: 'Смотрим на сотую цифру числа {d}: если она ≥ 5, десятую увеличиваем на 1, иначе оставляем.', tex: '' },
|
||||
{ note: 'Округляя до десятых, получаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* умножение на степень 10 (сдвиг запятой) */
|
||||
{
|
||||
id: 'dec-times-pow10', topic: 'decimals', order: 6, subject: 'algebra', grade: 5, kind: 'compute',
|
||||
title: 'Умножение на 10, 100, 1000',
|
||||
pick: { a: [1, 99], k: [1, 3] },
|
||||
derive: { d: 'a/100', pw: '10^k', val: '(a/100)*10^k' },
|
||||
lhs: 'x', rhs: '({a}/100)*10^{k}', display: 'Вычислите {d} · {pw}.',
|
||||
answerVar: 'x', answer: 'val',
|
||||
solution: [
|
||||
{ note: 'Умножение на {pw} сдвигает запятую вправо на {k} разряд(ов).', tex: 'x = {d} * {pw}' },
|
||||
{ note: 'Получаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* сравнить десятичные (код 1/2) */
|
||||
{
|
||||
id: 'dec-compare', topic: 'decimals', order: 7, subject: 'algebra', grade: 5, kind: 'compute',
|
||||
title: 'Сравнить десятичные',
|
||||
pick: { a: [1, 99], b: [1, 99] }, constraint: 'a != b',
|
||||
derive: { d1: 'a/100', d2: 'b/100', val: '(a > b) ? 1 : 2' },
|
||||
lhs: 'x', rhs: '(({a}) > ({b})) ? 1 : 2', display: 'Сравните {d1} и {d2}. Если больше первое — введите 1, если второе — 2.',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Сравниваем поразрядно, уравняв число знаков после запятой.', tex: '' },
|
||||
{ note: 'Большее число даёт ответ:', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* ── Отрицательные ── */
|
||||
|
||||
/* деление отрицательных */
|
||||
{
|
||||
id: 'neg-div', topic: 'negatives', order: 4, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Деление (отрицательные)',
|
||||
pick: { q: [-9, 9], b: [-9, 9] }, constraint: 'q != 0 && b != 0 && (q < 0 || b < 0)',
|
||||
derive: { a: 'q*b', val: 'q' },
|
||||
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: 'neg-order-ops', topic: 'negatives', order: 5, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Порядок действий (знаки)',
|
||||
pick: { a: [-6, 6], b: [-6, 6], c: [-9, 9] }, constraint: 'a != 0 && b != 0 && (a < 0 || b < 0 || c < 0)',
|
||||
derive: { val: 'a*b + c' },
|
||||
lhs: 'x', rhs: '({a})*({b}) + ({c})', display: 'Вычислите: {a} · {b} + {c}.',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Сначала умножение, затем сложение (порядок действий), не забывая про знаки.', tex: 'x = ({a})*({b}) + ({c})' },
|
||||
{ note: 'Считаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* модуль (|a| − |b|) */
|
||||
{
|
||||
id: 'neg-abs', topic: 'negatives', order: 6, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Модуль числа',
|
||||
pick: { a: [-15, 15], b: [-15, 15] }, constraint: 'a != 0 && b != 0',
|
||||
derive: { absa: 'abs(a)', absb: 'abs(b)', val: 'abs(a) - abs(b)' },
|
||||
lhs: 'x', rhs: 'abs({a}) - abs({b})', display: 'Вычислите |{a}| − |{b}|.',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Модуль — расстояние до нуля, всегда неотрицателен: |{a}| = {absa}, |{b}| = {absb}.', tex: '' },
|
||||
{ note: 'Вычитаем.', tex: 'x = {absa} - {absb}' },
|
||||
{ note: 'Считаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* сравнение на координатной прямой (код 1/2) */
|
||||
{
|
||||
id: 'neg-compare-line', topic: 'negatives', order: 7, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Сравнение на прямой',
|
||||
pick: { a: [-12, 12], b: [-12, 12] }, constraint: 'a != b && (a < 0 || b < 0)',
|
||||
derive: { val: '(a > b) ? 1 : 2' },
|
||||
lhs: 'x', rhs: '(({a}) > ({b})) ? 1 : 2', display: 'На координатной прямой отметили {a} и {b}. Какое число больше: введите 1 (это {a}) или 2 (это {b})?',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'На координатной прямой число, которое лежит правее, — больше.', tex: '' },
|
||||
{ note: 'Ответ:', tex: 'x = {ans}' }
|
||||
]
|
||||
},
|
||||
|
||||
/* квадрат отрицательного */
|
||||
{
|
||||
id: 'neg-square', topic: 'negatives', order: 8, subject: 'algebra', grade: 6, kind: 'compute',
|
||||
title: 'Квадрат отрицательного',
|
||||
pick: { a: [-9, -2] },
|
||||
derive: { val: 'a*a' },
|
||||
lhs: 'x', rhs: '({a})*({a})', display: 'Вычислите квадрат числа {a}, то есть ({a})².',
|
||||
answerVar: 'x', answer: 'val', integerAnswer: true,
|
||||
solution: [
|
||||
{ note: 'Квадрат — это умножение числа на себя. Минус на минус даёт плюс.', tex: 'x = ({a})*({a})' },
|
||||
{ note: 'Считаем.', tex: 'x = {ans}' }
|
||||
]
|
||||
}
|
||||
|
||||
];
|
||||
@@ -2260,6 +2550,11 @@
|
||||
'quad-roots-sum': 2, 'quad-roots-prod': 2, 'quad-build-eq': 3, 'quad-double-root': 2,
|
||||
'prog-arith-sum': 2, 'prog-arith-find-d': 2, 'prog-arith-find-n': 3, 'prog-arith-mean': 2,
|
||||
'prog-geom-find-q': 2, 'prog-geom-mean': 3, 'prog-geom-sum': 3, 'prog-arith-word': 2,
|
||||
// V4.1 — Арифметика 5–6
|
||||
'gcd-triple': 2, 'lcm-triple': 3, 'coprime-check': 2, 'lcm-buses': 2,
|
||||
'frac-reduce': 2, 'frac-add-unlike': 3, 'frac-mult': 2, 'frac-compare': 2, 'frac-of-whole-inverse': 3, 'frac-to-decimal': 2,
|
||||
'dec-div': 3, 'dec-round': 2, 'dec-times-pow10': 1, 'dec-compare': 1,
|
||||
'neg-div': 2, 'neg-order-ops': 3, 'neg-abs': 2, 'neg-compare-line': 1, 'neg-square': 2,
|
||||
// НОД/НОК / Дроби / Десятичные / Отрицательные
|
||||
'gcd-pair': 1, 'lcm-pair': 2,
|
||||
'frac-of-number': 1, 'frac-add-same': 2,
|
||||
|
||||
Reference in New Issue
Block a user