♻️ refactor(reinfo): 简化判错提示并新增自动刷新
- 移除 PHP 中冗余的 verdict_hints 数组及其填充逻辑 - 移除模板中 friendly-explain 区与 errexp-list 错误模式匹配脚本(28 条规则) - 标题提示简化为单行 verdict-tip,详细的修复建议交由 AI 点评 - 调整页面顺序:AI 点评区提前,原始错误折叠下移 - 新增判题中自动刷新状态指示:轮询 status-ajax.php,完成后自动 reload,并加入后台标签暂停与退避策略
This commit is contained in:
@@ -109,7 +109,6 @@ $view_reinfo_dedup_count = 0; // 折叠掉的测试点数
|
||||
$verdict_color_class = "blue"; // semantic ui color: green/red/orange/yellow/grey
|
||||
$result_icon = "info circle";
|
||||
$verdict_tip = "";
|
||||
$verdict_hints = array();
|
||||
|
||||
if($ok){
|
||||
|
||||
@@ -143,75 +142,39 @@ if($ok){
|
||||
default: $verdict_color_class = "blue"; $result_icon = "info circle";
|
||||
}
|
||||
|
||||
// 友好提示
|
||||
// 友好提示:仅保留标题性文字,具体修复建议交给 AI 点评
|
||||
switch ($result_code) {
|
||||
case 4: // AC
|
||||
$verdict_tip = "本次提交通过了所有测试点";
|
||||
$verdict_hints[] = "注意时间/内存是否接近限制,考虑是否有更优的算法";
|
||||
$verdict_hints[] = "可以继续挑战更高难度或查看其他人的标程";
|
||||
break;
|
||||
case 5: // PE
|
||||
$verdict_tip = "输出与预期基本一致但格式不符(Presentation Error)";
|
||||
$verdict_hints[] = "对照样例:每行末尾是否多/少换行";
|
||||
$verdict_hints[] = "检查空格、大小写、标点符号";
|
||||
$verdict_hints[] = "PE 通常是细微的格式问题,请逐字符对比";
|
||||
break;
|
||||
case 6: // WA
|
||||
$verdict_tip = "输出与预期不符(Wrong Answer)";
|
||||
$verdict_hints[] = "对照样例手动模拟程序执行过程";
|
||||
$verdict_hints[] = "检查边界条件:n=0、n=1、极值、空输入";
|
||||
$verdict_hints[] = "注意 long long 溢出、int 范围";
|
||||
break;
|
||||
case 7: // TLE
|
||||
$verdict_tip = $MSG_HINT_TLE;
|
||||
$verdict_hints[] = "检查是否有死循环(循环变量未更新)";
|
||||
$verdict_hints[] = "优化算法复杂度(如 O(n²) → O(n log n))";
|
||||
$verdict_hints[] = "递归层数过深?改为迭代或加深栈";
|
||||
break;
|
||||
case 8: // MLE
|
||||
$verdict_tip = $MSG_HINT_MLE;
|
||||
$verdict_hints[] = "大数组开在函数内(栈)?改为全局或 new";
|
||||
$verdict_hints[] = "Java: 减小内存使用或调整 JVM 参数";
|
||||
$verdict_hints[] = "递归太深未释放,考虑显式清理";
|
||||
break;
|
||||
case 9: // OLE
|
||||
$verdict_tip = $MSG_HINT_OLE;
|
||||
$verdict_hints[] = "是否有死循环输出";
|
||||
$verdict_hints[] = "调试用的 print/cout 是否忘记删除";
|
||||
break;
|
||||
case 10: // RE
|
||||
$verdict_tip = "程序运行中发生错误(Runtime Error)";
|
||||
$verdict_hints[] = "数组下标是否越界(i<n 还是 i<=n)";
|
||||
$verdict_hints[] = "除以零、空指针、栈溢出";
|
||||
$verdict_hints[] = "递归爆栈:转迭代或加尾递归";
|
||||
break;
|
||||
case 11: // CE
|
||||
$verdict_tip = "编译错误(Compile Error)。请查看编译信息页。";
|
||||
break;
|
||||
case 13: // TR (test run)
|
||||
$verdict_tip = "测试运行完成(Test Run)";
|
||||
$verdict_hints[] = "你输入的测试数据已与程序输出对比";
|
||||
break;
|
||||
default:
|
||||
$verdict_tip = "正在评判,请稍候刷新";
|
||||
}
|
||||
|
||||
// === 阶段 2:syscall vs 真正越界 的区分 ===
|
||||
if ($result_code === 10) {
|
||||
if (preg_match('/Forbidden system call.*CALLID:(\d+)/', $raw_error, $m)) {
|
||||
$callid = $m[1];
|
||||
$verdict_hints[] = sprintf("系统调用 ID=%d 被判题器禁止,常见于直接操作文件/网络/进程", $callid);
|
||||
}
|
||||
// Java / Python / Go 的细化提示
|
||||
if (preg_match('/java\.lang\.(\w+Exception|\w+Error)/', $raw_error, $m2)) {
|
||||
$verdict_hints[] = "Java 异常类型:" . $m2[1];
|
||||
} elseif (preg_match('/Traceback \(most recent call last\)/', $raw_error)) {
|
||||
$verdict_hints[] = "Python 抛出异常,下方 traceback 从下往上读就是异常源头";
|
||||
} elseif (preg_match('/panic:.*?(index out of range|invalid memory address|nil pointer)/i', $raw_error)) {
|
||||
$verdict_hints[] = "Go 运行时报错:通常是越界访问或 nil 指针";
|
||||
}
|
||||
}
|
||||
|
||||
// === 阶段 3:原始错误处理(syscall 提示 vs 占位符修复)===
|
||||
$view_reinfo_raw = $raw_error;
|
||||
if (trim($raw_error) === "") {
|
||||
|
||||
Reference in New Issue
Block a user