Дай код
Ответ нейросети
03 сентября 2025 14:05
Ниже пример кода на Python, который генерирует пошаговое решение задач на одну переменную и адаптируется под цель (Понять) и параметры предмета/класса (игнорируются, но есть место под настройки). Он поддерживает уравнения вида:
- линейные: ax + b = c
- квадратные: ax^2 + bx + c = 0
- общие случаи через SymPy (для любых степеней)
Требования: Python 3.x, библиотека SymPy (установить: pip install sympy)
Код:
#!/usr/bin/env python3
-- coding: utf-8 --
""" ГДЗ-ассистент: код для автоматического решения задач на одну переменную с пошаговыми объяснениями.
Параметры:
- problem: текст задачи (например, "2x + 3 = 7" или "x^2 - 5x + 6 = 0")
- subject, grade: параметры (игнорируются в логике решений, но принимаются для совместимости)
- goal: "Понять" (детальные шаги) или что-то иное (краткие результаты)
Особенности:
- поддерживает линейные и квадратные уравнения на одну переменную.
- если формулировка не линейна/квадратная, используется общие решения через SymPy с кратким выводом.
- ^ заменяется на ** для корректного распознавания степеней. """
import sympy as sp import argparse from typing import Optional, Tuple, List
def normalize_problem_text(text: str) -> str: # Заменяем снизу ^ на ** для корректной интерпретации как степень return text.replace("^", "**")
def parse_problem(problem_text: str) -> Tuple[str, str]: # Разделяем на левую и правую части вокруг "=" s = problem_text s = normalize_problem_text(s) if "=" in s: left, right = s.split("=", 1) return left.strip(), right.strip() else: # Если "=" нет, считаем левую часть равной 0 return s.strip(), "0"
def solve_linear(lhs_expr, rhs_expr, var, verbose_steps: List[str]) -> Tuple[List[str], Optional[str]]: expr = sp.expand(lhs_expr - rhs_expr) a = expr.coeff(var) b = expr.subs(var, 0)
a_s = sp.simplify(a)
b_s = sp.simplify(b)
verbose_steps.append(f"Левая часть перенесена без изменений: {lhs_expr} - {rhs_expr} = 0")
verbose_steps.append(f"Соберём коэффициенты по переменной {var}: {a_s}*{var} + {b_s} = 0")
if a_s == 0:
if b_s == 0:
verbose_steps.append("Получилось 0 = 0 → бесконечно много решений (любое значение переменной).")
return verbose_steps, "Ответ: бесконечно много решений."
else:
verbose_steps.append("Получилось 0*x + b = 0 при b != 0 → решений нет.")
return verbose_steps, "Ответ: нет решений."
else:
x_val = -b_s / a_s
verbose_steps.append(f"Разделим обе части на коэффициент при {var}: {var} = -({b_s})/{a_s} = {sp.simplify(x_val)}")
return verbose_steps, f"Ответ: {var} = {sp.simplify(x_val)}"
def solve_quadratic(lhs_expr, rhs_expr, var, verbose_steps: List[str]) -> Tuple[List[str], Optional[str]]: expr = sp.expand(lhs_expr - rhs_expr) poly = sp.Poly(expr, var) a, b, c = poly.all_coeffs() # ожидается [a, b, c] для degree 2 verbose_steps.append(f"Уравнение приведено к квадратному виду: {a}{var}^2 + {b}{var} + {c} = 0")
D = sp.simplify(b**2 - 4*a*c)
verbose_steps.append(f"Дискриминант D = {D}")
sqrtD = sp.sqrt(D)
x1 = (-b + sqrtD) / (2*a)
x2 = (-b - sqrtD) / (2*a)
verbose_steps.append(f"Корни: x1 = (-{b} + sqrt(D)) / (2*{a}) = {sp.simplify(x1)}; "
f"x2 = (-{b} - sqrt(D)) / (2*{a}) = {sp.simplify(x2)}")
return verbose_steps, f"Ответ: x = {sp.simplify(x1)} или x = {sp.simplify(x2)}"
def solve_general(problem_text: str, var, verbose_steps: List[str]) -> Tuple[List[str], Optional[str]]: # Общий метод: использовать sympy.solve для уравнения lhs = rhs lhs, rhs = parse_problem(problem_text) try: left_expr = sp.sympify(lhs) right_expr = sp.sympify(rhs) eq = sp.Eq(left_expr, right_expr) sols = sp.solve(eq, var) verbose_steps.append(f"Общее решение с использованием SymPy: {sols}") return verbose_steps, f"Ответ: {sols}" except Exception as e: verbose_steps.append(f"Ошибка общего решения: {e}") return verbose_steps, None
def solve_problem(problem_text: str, subject: Optional[str] = None, grade: Optional[str] = None, goal: str = "Понять") -> str: # Подготовка переменной problem = problem_text.strip() problem_norm = normalize_problem_text(problem)
# Определяем переменную
left, right = parse_problem(problem_norm)
# Определяем переменные, используемые в выражениях
combined = set()
try:
left_expr = sp.sympify(left)
right_expr = sp.sympify(right)
combined.update(left_expr.free_symbols)
combined.update(right_expr.free_symbols)
except Exception:
pass
if len(combined) > 0:
var = sorted(list(combined), key=lambda s: str(s))[0]
else:
var = sp.Symbol('x')
# Генерация шагов
steps = []
answer = None
try:
lhs_expr = sp.sympify(left)
rhs_expr = sp.sympify(right)
except Exception as e:
return f"Не удалось распознать выражения: {e}"
# Степ-логика по степени уравнения
expr = sp.expand(lhs_expr - rhs_expr)
deg = sp.Poly(expr, var).degree()
if deg == 1:
steps, answer = solve_linear(lhs_expr, rhs_expr, var, steps)
elif deg == 2:
steps, answer = solve_quadratic(lhs_expr, rhs_expr, var, steps)
else:
steps, answer = solve_general(problem_norm, var, steps)
# Формат вывода в строку (пошагово)
# В зависимости от цели можно делать более подробное или краткое
if goal and goal.lower() == "понять":
return "\n".join(steps + [""] + [answer if answer else "Не удалось вычислить решение."])
else:
# кратко: только ответ
return str(answer)
def main(): parser = argparse.ArgumentParser(description="ГДЗ-ассистент: решение одной переменной с пошаговыми объяснениями.") parser.add_argument("--problem", required=True, help="Формулировка задачи, например: '2x + 3 = 7' или 'x^2 - 5x + 6 = 0'") parser.add_argument("--subject", default=None, help="Предмет (не обязателен)") parser.add_argument("--grade", default=None, help="Класс (не обязателен)") parser.add_argument("--goal", default="Понять", help="Цель: 'Понять' для подробного решения или другое для краткого вывода") args = parser.parse_args()
result = solve_problem(args.problem, args.subject, args.grade, args.goal)
print(result)
if name == "main": main()
Использование:
- Пример 1: python this_script.py --problem "2x + 3 = 7" --goal Понять
- Пример 2: python this_script.py --problem "x^2 - 5x + 6 = 0" --goal Понять
- Пример 3: python this_script.py --problem "3x - 9 = 0" (по умолчанию цель — Понять)
Примечания:
- Требуется установить SymPy: pip install sympy
- Вводите формулировку без пробелов или с ними; код обрабатывает пробелы.
- При использовании степеней используйте **, напр. x^2 будет некорректно обработано без замены; этот скрипт выполняет замену ^ на **.
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



