fix(llm): relax guidance and preserve judge output
This commit is contained in:
+21
-78
@@ -124,71 +124,18 @@ function dedup_runtimeinfo($text, &$dedup_count) {
|
||||
* 返回 [['name' => 'test1.out', 'expected' => [...], 'yours' => [...], 'full_mode' => bool], ...]
|
||||
* 解析失败返回空数组
|
||||
*/
|
||||
function parse_diff_blocks($text) {
|
||||
$blocks = array();
|
||||
if (empty($text)) return $blocks;
|
||||
|
||||
// 先按 "\n\n" 切分(simple mode 每个测试点之间有空行)
|
||||
$chunks = preg_split('/\n\s*\n/', $text);
|
||||
foreach ($chunks as $chunk) {
|
||||
if (trim($chunk) === '') continue;
|
||||
$chunk = trim($chunk, "\r\n");
|
||||
|
||||
// 格式 1: 整段就是一个 =====[name]===== 块(包含表头+数据+结尾 ====)
|
||||
// 形如 "========[test1.out]========\nExpected | Yours\nFail | Fall\n=============================="
|
||||
if (preg_match('/^=+\[([^\]]+)\]\=+(.+?)\n=+\s*$/s', $chunk, $m)) {
|
||||
$name = trim($m[1]);
|
||||
$body = $m[2];
|
||||
if (llm_guidance_testcase_base($name) === null) continue;
|
||||
// OJ_FULL_DIFF also contains hidden test input. It is never interpreted
|
||||
// as an Expected/Yours block; normal users fall back to focused guidance.
|
||||
if (llm_guidance_has_full_diff_sections($chunk)) continue;
|
||||
// body 形如 "\nExpected | Yours\nFail | Fall"
|
||||
// 去掉首尾的换行符
|
||||
$body = trim($body, "\n\r");
|
||||
$rows = llm_guidance_parse_diff_rows($body);
|
||||
$expected = $rows['expected'];
|
||||
$yours = $rows['yours'];
|
||||
if (!empty($expected)) {
|
||||
$blocks[] = array(
|
||||
'name' => $name,
|
||||
'expected' => $expected,
|
||||
'yours' => $yours,
|
||||
'full_mode' => true,
|
||||
);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// 格式 2: simple mode "test1.out\n--\n|Expected|Yours\n|--|--\n|row1|row2"
|
||||
if (preg_match('/^([^\n=|]+)\n--\n([\s\S]+)$/', $chunk, $m)) {
|
||||
$name = trim($m[1]);
|
||||
$body = $m[2];
|
||||
if (llm_guidance_testcase_base($name) === null) continue;
|
||||
$rows = llm_guidance_parse_diff_rows($body);
|
||||
$expected = $rows['expected'];
|
||||
$yours = $rows['yours'];
|
||||
if (!empty($expected)) {
|
||||
$blocks[] = array(
|
||||
'name' => $name,
|
||||
'expected' => $expected,
|
||||
'yours' => $yours,
|
||||
'full_mode' => false,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $blocks;
|
||||
}
|
||||
function parse_diff_blocks($text) {
|
||||
return llm_guidance_parse_diff_blocks($text);
|
||||
}
|
||||
|
||||
$is_compile_error = intval($row['result']) == 11;
|
||||
$view_reinfo = "";
|
||||
$view_reinfo_raw = ""; // 原始(管理员/有权限者看)
|
||||
$view_reinfo_summary = ""; // 折叠后(普通用户看)
|
||||
$view_reinfo_dedup_count = 0; // 折叠掉的测试点数
|
||||
$verdict_color_class = "blue"; // semantic ui color: green/red/orange/yellow/grey
|
||||
$result_icon = "info circle";
|
||||
$verdict_tip = "";
|
||||
$view_reinfo_dedup_count = 0; // 折叠掉的测试点数
|
||||
$verdict_color_class = "blue"; // semantic ui color: green/red/orange/yellow/grey
|
||||
$result_icon = "info circle";
|
||||
$verdict_tip = "";
|
||||
|
||||
if($ok){
|
||||
|
||||
@@ -292,11 +239,11 @@ if($ok){
|
||||
$show_raw = $is_admin_session || $is_source_browser;
|
||||
$unsafe_full_diff = llm_guidance_has_full_diff_sections($raw_error);
|
||||
|
||||
// 尝试解析为结构化的 diff 数据(用于高完成度 WA/PE 的对比展示)。
|
||||
// Full diff 同时携带隐藏输入,普通页面不解析也不回显。
|
||||
// 结构化 diff 是原评测器输出的一个视图,不受 AI 完成度策略控制。
|
||||
// Full diff 的原文仍按原有 OJ_SHOW_DIFF/权限规则展示,但不会被二次解析。
|
||||
$diff_blocks = $unsafe_full_diff ? array() : parse_diff_blocks($raw_error);
|
||||
|
||||
// 完成度只使用学生自己的源码和判题统计;不查询参考答案。
|
||||
// AI 完成度只决定辅导方式,不修改评测器原文、diff 或下载权限。
|
||||
$source_result = pdo_query("SELECT `source` FROM `source_code_user` WHERE `solution_id`=?", $id);
|
||||
$student_source = (!empty($source_result) && $source_result !== -1)
|
||||
? $source_result[0]['source']
|
||||
@@ -308,27 +255,23 @@ if($ok){
|
||||
llm_guidance_output_attempt($unsafe_full_diff ? '' : $raw_error)
|
||||
);
|
||||
if ($llm_guidance['show_output_diff'] && empty($diff_blocks)) {
|
||||
$llm_guidance['mode'] = 'focused_hint';
|
||||
$llm_guidance['mode'] = 'judge_output';
|
||||
$llm_guidance['show_output_diff'] = false;
|
||||
}
|
||||
$llm_guidance_auto_fetch = true;
|
||||
|
||||
// 管理员或 source_browser 永远看完整原文。普通学生的 WA/PE
|
||||
// 只看经过策略授权的结构化 diff,不再从原始折叠区旁路读取。
|
||||
if (!$show_raw && ($result_code === 5 || $result_code === 6)) {
|
||||
if ($llm_guidance['show_output_diff'] && !empty($diff_blocks)) {
|
||||
$view_reinfo_summary = "已在下方显示本次错误测试点的结构化输出差异。";
|
||||
} else {
|
||||
// 低/中完成度不能通过重复白卷提交套取隐藏测试点答案。
|
||||
$diff_blocks = array();
|
||||
$view_reinfo_summary = "当前提交完成度不足,暂不显示隐藏测试点的期望输出。请先补齐程序,再重新提交。";
|
||||
}
|
||||
}
|
||||
if ($show_raw) {
|
||||
$view_reinfo = $view_reinfo_raw;
|
||||
} elseif ($unsafe_full_diff) {
|
||||
// Full mode includes hidden testcase input/expected output. Preserve the
|
||||
// judge structure and the student's output, but redact protected data.
|
||||
$view_reinfo = llm_guidance_redact_full_diff($view_reinfo_raw);
|
||||
} else {
|
||||
$view_reinfo = $view_reinfo_summary;
|
||||
// AI guidance is additive: ordinary judge/compiler/runtime text remains
|
||||
// byte-for-byte visible instead of being replaced by an AI policy message.
|
||||
$view_reinfo = $view_reinfo_raw;
|
||||
}
|
||||
$view_reinfo_dedup_count = 0;
|
||||
$llm_guidance_has_output_diff = !empty($diff_blocks);
|
||||
$is_owner_session = isset($_SESSION[$OJ_NAME.'_'.'user_id'])
|
||||
&& strval($row['user_id']) === strval($_SESSION[$OJ_NAME.'_'.'user_id']);
|
||||
@@ -336,12 +279,12 @@ if($ok){
|
||||
&& intval($spj[0][0]) === 2
|
||||
&& !empty($OJ_HIDE_RIGHT_ANSWER);
|
||||
$download_diff_enabled = !isset($OJ_SHOW_DIFF) || $OJ_SHOW_DIFF;
|
||||
$llm_guidance_download_allowed = $is_admin_session
|
||||
$testcase_download_allowed = $is_admin_session
|
||||
|| ($is_owner_session
|
||||
&& $download_diff_enabled
|
||||
&& !$download_hidden_spj
|
||||
&& !$unsafe_full_diff
|
||||
&& !empty($llm_guidance['show_output_diff']));
|
||||
&& ($result_code === 5 || $result_code === 6));
|
||||
}
|
||||
|
||||
// 不是本人的提交,且不是 source_browser
|
||||
|
||||
Reference in New Issue
Block a user