'use strict'; /* Серверная проверка задач тренажёра через SimExpr — тот же безопасный * вычислитель, что на клиенте (⛔ без eval/new Function). Гарантирует, что любая * задача (от LLM или учителя) КОРРЕКТНА: подставляем заявленный корень в обе * части уравнения и сверяем с допуском. SimExpr — чистый (без DOM), грузится в * Node через require: его IIFE цепляется к globalThis.SimExpr. */ require('../../../frontend/js/labs/_sim_expr.js'); // → globalThis.SimExpr const SimExpr = globalThis.SimExpr; const EPS = 1e-7; /* Компиляция выражения; null при синтаксической ошибке (мусор от модели). */ function compileOk(expr) { if (typeof expr !== 'string') return null; const c = SimExpr.compile(expr); return (c && !c.error) ? c : null; } /* Подстановочная проверка: lhs(var=value) ≈ rhs(var=value). */ function verifyRoot(lhs, rhs, varName, value) { const cl = compileOk(lhs), cr = compileOk(rhs); if (!cl || !cr) return { ok: false, reason: 'parse' }; if (typeof value !== 'number' || !isFinite(value)) return { ok: false, reason: 'bad-value' }; const env = {}; env[varName || 'x'] = value; const L = cl.fn(env), R = cr.fn(env); const residual = Math.abs(L - R); const scale = Math.max(1, Math.abs(L), Math.abs(R)); return { ok: residual <= EPS * scale, residual: residual, lhs: L, rhs: R }; } module.exports = { SimExpr, compileOk, verifyRoot };