Ctrl K

Упрощение многочлена с буквами

Сложная
Дана формула formula из целых неотрицательных чисел, переменных (строк из строчных латинских букв), знаков +, -, * и круглых скобок. Числа, переменные и знаки разделены ровно одним пробелом; скобки пишутся вплотную к тому, что внутри них: (a + 2) * b. Унарного минуса нет, и перед переменной не бывает множителя без знака (2x не встретится). Часть переменных известна: переменная known[i] равна values[i]. Подставьте их, раскройте скобки (сначала скобки, потом умножение, потом сложение и вычитание), приведите подобные и верните результат как список членов-строк: - член записывается как коэффициент, затем через * его переменные в алфавитном порядке: -3*a*b*b. Коэффициент 1 тоже пишется: 1*x. Свободный член — просто число: 7; - члены идут по убыванию степени (числа переменных с учётом повторов), при равной степени — в лексикографическом порядке записи без коэффициента; свободный член последний; - члены с нулевым коэффициентом не выводятся, так что формула, равная нулю, даёт пустой список.
Пример 1
formula="speed * time - 3 * time + 4", known=["speed"], values=[5] → ['2*time', '4']

Подставляем speed = 5: 5·time - 3·time + 4 = 2·time + 4. Сначала член первой степени, потом свободный.

Пример 2
formula="(b + a) * (a - 2)", known=[], values=[] → ['1*a*a', '1*a*b', '-2*a', '-2*b']

Раскрываем: a·a + a·b - 2·a - 2·b. Внутри члена переменные идут по алфавиту (a*b, а не b*a), члены — по убыванию степени, при равной степени — по алфавиту.

Пример 3
formula="x * x - y", known=["x", "y"], values=[3, 9] → []

9 - 9 = 0, а члены с нулевым коэффициентом не выводятся — ответ пустой.

Ограничения
  • 1 ≤ len(formula) ≤ 250
  • formula состоит из строчных латинских букв, цифр, +, -, *, (, ) и пробелов и записана в описанном виде, без пробелов в начале и в конце
  • 0 ≤ len(known) = len(values) ≤ 100
  • Имена в known различны, 1 ≤ len(known[i]) ≤ 20, только строчные латинские буквы
  • -100 ≤ values[i] ≤ 100
  • Все коэффициенты в ходе вычислений лежат в диапазоне [-2³¹, 2³¹ - 1]
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиКалькулятор со скобками: плюс и минус СложнаяКалькулятор со скобками и переменными СложнаяКалькулятор со скобками и четырьмя действиями СложнаяСумма прописью по-английски СложнаяПодсчёт элементов в формуле Сложная
загружаем Python…
Вход
formula="speed * time - 3 * time + 4", known=["speed"], values=[5]
Ожидается
['2*time', '4']

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 108 тестов на сервере, включая скрытые.