Суть задания: решить 1000 кубических уравнений, правильный ответ — наибольший корень, округленный до сотых. Для решения уравнений, воспользуемся библиотекой numpy, а коэффициенты уравнения будем извлекать при помощи регулярных выражений
import socket
import re
import numpy as np
def solve_cubic(a, b, c, d):
coefficients = [a, b, c, d]
roots = np.roots(coefficients)
real_roots = [root.real for root in roots if abs(root.imag) < 1e-6]
return real_roots
def process_equation(data):
data = data.replace(' ', '')
if '=' in data:
data = data.split('=')[0]
pattern = r'([+-]?\d*\.?\d*)x\^3([+-]\d*\.?\d*)x\^2([+-]\d*\.?\d*)x([+-]\d*\.?\d*)'
match = re.match(pattern, data)
if match:
def parse_coefficient(coefficient):
if coefficient in ('+', '-'):
return float(coefficient + '1')
elif coefficient == '':
return 1.0
else:
return float(coefficient)
a = parse_coefficient(match.group(1))
b = parse_coefficient(match.group(2))
c = parse_coefficient(match.group(3))
d = parse_coefficient(match.group(4))
return solve_cubic(a, b, c, d)
else:
print("Не удалось распознать уравнение.")
return None
def main():
host = '127.0.0.1'
port = 5555
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
while True:
data = s.recv(1024).decode()
print(f"Полученные данные: {data}")
if data.startswith('ptech2024'):
print(f"Получен флаг: {data}")
break
real_roots = process_equation(data)
if real_roots:
largest_root_rounded = round(max(real_roots), 2)
print(f"Наибольший действительный корень: {largest_root_rounded}")
s.sendall(f"{largest_root_rounded}".encode())
else:
print("Нет действительных корней.")
if __name__ == "__main__":
main()