Сделай это на питоне
Ответ нейросети
03 марта 2026 11:25
Ниже представлен простой Python-скрипт, который реализует задачу: по тексту задачи (и по необязательным параметрам Предмет и Класс) формирует подробное пошаговое решение с объяснениями. Он адаптирует стиль под уровень класса, если он указан, и использует общий подход для средней школы, если параметры не заданы. В частности он умеет распознавать и решать линейные уравнения одной переменной в формате ax + b = c (где x обозначает переменную). Для остальных задач предусмотрен общий пошаговый план решения.
Пример использования:
- Введите текст задачи (можно вставить несколько строк; завершите ввод пустой строкой): 3x + 5 = 20
- Предмет (не обязательно): математика
- Класс (не обязательно): 8
- Цель (почему): Понять
Код:
import re
def parse_expression(expr): # Парсит выражение вида ax + b, возвращает (coef_x, const) # Поддерживает несколько слагаемых вида: 3x, -2x, x, -x, 5, -7 и т.д. expr = expr.replace(' ', '') if expr == '': return 0.0, 0.0
# Приводим к виду, где все знаки перед слагаемыми стоят явно: 3x+5-2x-7 -> tokens: ["3x","+5","-2x","-7"]
# Замена '-' на '+-' упрощает разбиение
expr = expr.replace('-', '+-')
if expr.startswith('+'):
expr = expr[1:]
coef_x = 0.0
const = 0.0
for token in expr.split('+'):
if token == '' or token is None:
continue
if 'x' in token:
t = token.replace('x','')
if t in ('', '+'):
c = 1.0
elif t == '-':
c = -1.0
else:
try:
c = float(t)
except ValueError:
# Не распознано как коэффициент, игнорируем для устойчивости
c = 0.0
coef_x += c
else:
try:
const += float(token)
except ValueError:
# Не числовой констант, игнорируем
pass
return coef_x, const
def solve_linear_equation(eq_str): # Решает линейное уравнение вида left = right, где left и right выражения вида ax + b # Возвращает словарь с шагами решения и результатом if '=' not in eq_str: return None
left, right = eq_str.split('=', 1)
a1, b1 = parse_expression(left)
a2, b2 = parse_expression(right)
a = a1 - a2
b = b1 - b2
steps = []
steps.append("Сформулируем уравнение: " + left + " = " + right)
steps.append("Перенесём все члены на одну сторону, чтобы получить выражение в виде ax + b = 0")
steps.append(f"Для левой части: {(a1)}x + ({b1}); правая часть: {(a2)}x + ({b2})")
steps.append(f"Получаем: ({a1} - {a2})x + ({b1} - {b2}) = 0, то есть {a}x + {b} = 0")
if abs(a) < 1e-12:
if abs(b) < 1e-12:
steps.append("Уравнение тождественно истинно: бесконечно много решений.")
return {'type':'linear','steps':steps,'solution':'Infinitely many solutions'}
else:
steps.append("Коэффициент при x равен нулю, а константа не равна нулю: решений нет.")
return {'type':'linear','steps':steps,'solution':'No solution'}
x = -b / a
steps.append(f"Решаем: ax + b = 0 → x = -b / a = -({b}) / {a} = {x}")
# Верификация
left_val = a1 * x + b1
right_val = a2 * x + b2
diff = left_val - right_val
steps.append(f"Проверка: подставим x = {x} в левую и правую стороны:")
steps.append(f"Левая часть: {a1}*{x} + {b1} = {left_val}")
steps.append(f"Правая часть: {a2}*{x} + {b2} = {right_val}")
steps.append(f"Разность левой и правой частей = {diff} (должна быть близка к 0)")
return {'type':'linear','steps':steps,'solution':x}
def generic_problem_steps(problem_text): steps = [] steps.append("Поняем задачу: прочитаем формулировку и попробуем выделить данные и цель.") steps.append("План решения: определить, какие данные дано и что требуется найти.") steps.append("Выполнение плана: применяем логический или вычислительный подход к задаче.") steps.append("Проверка: проверяем полученный ответ на разумность и соответствие условиям.") steps.append("Ответ: приведённый результат.") return steps
def format_output(steps, style='standard'): # Простой формат вывода: в стиле bullet-подхода или обычного текста if not steps: return "" lines = [] if style == 'simple': for s in steps: lines.append("- " + s) else: for s in steps: lines.append(s) return "\n".join(lines)
def determine_style(klass): # Простой выбор стиля по классу (если указан) try: c = int(klass) except (TypeError, ValueError): return 'standard' if c <= 8: return 'simple' return 'standard'
def solve_problem(problem_text, subject=None, klass=None, goal=None): # По умолчанию цель - Понять if goal is None or goal.strip() == "": goal = "Понять"
# Определяем стиль
style = determine_style(klass)
# Попытка распознать линейное уравнение ax + b = c
eq_guess = problem_text.strip().replace(' ', '')
# Переключим на нижний регистр для проверки на 'x' и '='
eq_lower = eq_guess.lower()
if ('=' in eq_lower) and ('x' in eq_lower or 'X' in eq_lower):
# Приведём к нижнему регистру букв X тоже
eq_lower = eq_lower.replace('x', 'x').replace('X', 'x')
result = solve_linear_equation(problem_text.replace('X', 'x'))
if result is not None:
steps = result.get('steps', [])
solution = result.get('solution', None)
# Заголовок решения
header = []
if subject:
header.append(f"Предмет: {subject}")
if klass:
header.append(f"Класс: {klass}")
header.append(f"Цель: {goal}")
header_text = "\n".join(header)
# Формируем финальный вывод
output_parts = []
if header_text:
output_parts.append(header_text)
output_parts.append("Пошаговое решение:")
output_parts.append(format_output(steps, style))
if solution is not None and isinstance(solution, (int, float)):
output_parts.append(f"Ответ: x = {solution}")
elif result.get('solution') in ('Infinitely many solutions', 'No solution'):
output_parts.append(f"Ответ: {result['solution']}")
return "\n".join(output_parts)
# Если не удалось распознать или решить - перейдём к общему подходу ниже
# Общий подход (для задач, не распознаются как линейное уравнение)
steps = []
steps.append("Задача не распознана как простое линейное уравнение ax + b = c. Применим общий пошаговый план.")
steps.extend(generic_problem_steps(problem_text))
output = []
header = []
if subject:
header.append(f"Предмет: {subject}")
if klass:
header.append(f"Класс: {klass}")
header.append(f"Цель: {goal}")
if header:
output.append("\n".join(header))
output.append(format_output(steps, style))
return "\n".join(output)
def main(): print("Введите текст задачи (можно вставить несколько строк; завершите ввод пустой строкой):") lines = [] while True: line = input() if line == "": break lines.append(line) problem_text = "\n".join(lines)
subject = input("Предмет (не обязательно): ").strip() or None
klass = input("Класс (не обязательно): ").strip() or None
goal = input("Цель (Понять/оставить пустым по умолчанию): ").strip()
if goal == "":
goal = None
result_text = solve_problem(problem_text, subject=subject, klass=klass, goal=goal)
print("\nРЕЗУЛЬТАТ:\n")
print(result_text)
if name == "main": main()
Примечания по использованию:
- Скрипт пытается распознать линейное уравнение вида ax + b = c. Если задача не соответствует этому формату, он выдаёт общий пошаговый план решения.
- Параметры Предмет и Класс не обязательны. Если их нет, объяснение остаётся общим и ориентировано на среднюю школьную подготовку.
- Цель по умолчанию устанавливается на "Понять", если не указана.
- В качестве примера поддержки простого линейного уравнения, корректная форма ввода может быть, например: “3x + 5 = 20” или “2x - 4 = x + 6”.
Если хочешь, могу доработать код под конкретный стиль задач (например, больше примеров по геометрии, процентам, соотношениям и т. п.), или добавить поддержку других типов уравнений и задач.
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



