原来试运行走另一台 Judge0:C 是 GCC 9、编译参数也不一样,Python 的语法错误回来的是运行错误, 没有题目的时间内存限制和代码模板,例子上的结果常和提交对不上。现在走本站判题机 (POST /trial-runs),同一套编译命令、这道题的限制和模板,对不对也由判题机比。 - 不落库、不算提交、不进判题队列:api 进程里自己排队,全站同时 TRIAL_CONCURRENCY 批 (服务器 2、机房 4),每人最多两批,排满或等超过 30 秒就请学生过一会儿再点 - 死循环不停打印时判题机回包会很大,超过 16MB 就掐断,告诉学生输出太多、停不下来 - Python 语法错误用和提交一样的说明:第几行、中文标点标红、一键换成英文 - 运行时错误和提交用同一个解析,说清楚第几行、为什么(下标越界、int() 转换失败、段错误……); 比赛里照旧只给按结果码的那一句 - 语法没过、服务没跑成时,标题不再说「N 个例子没对上」 - 后台「生成测试点」一并迁过来,编译警告不会再写进 .out;Judge0 的地址和调用全部删掉 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
8834536135
commit
eb32676de4
27 files changed
+691
-169
No files matched your search
@@ -20,6 +20,39 @@ const failedCount = computed(
|
||||
() => sampleRuns.value.filter((run) => run.result !== SubmissionStatus.accepted).length,
|
||||
)
|
||||
|
||||
/**
|
||||
* 一个例子都没跑起来:编译 / 语法没过,或者试跑服务本身没跑成(排队满了、判题机连不上)。
|
||||
* 这时不能说「N 个例子没对上」—— 程序一行都没跑,每个例子也都是同一个原因,芯片不摆
|
||||
*/
|
||||
const header = computed(() => {
|
||||
const runs = sampleRuns.value
|
||||
const first = runs[0]
|
||||
if (first && runs.every((run) => run.result === SubmissionStatus.compile_error)) {
|
||||
return {
|
||||
kind: "warning" as const,
|
||||
title:
|
||||
samplesCode.value?.language === "Python"
|
||||
? "试跑:代码有语法错误,一个例子都没跑"
|
||||
: "试跑:编译没通过,一个例子都没跑",
|
||||
chips: false,
|
||||
}
|
||||
}
|
||||
if (first?.note && runs.every((run) => run.note === first.note)) {
|
||||
// 输出太多是程序自己的问题(多半死循环),其余带 note 的都是没跑成
|
||||
const ran = first.result === SubmissionStatus.runtime_error
|
||||
return {
|
||||
kind: ran ? ("error" as const) : ("warning" as const),
|
||||
title: ran ? "试跑:程序一直在输出,停不下来" : "试跑没跑成",
|
||||
chips: false,
|
||||
}
|
||||
}
|
||||
return {
|
||||
kind: failedCount.value ? ("error" as const) : ("success" as const),
|
||||
title: failedCount.value ? `试跑:${failedCount.value} 个例子没对上` : "试跑:例子都对上了",
|
||||
chips: true,
|
||||
}
|
||||
})
|
||||
|
||||
/** 看的是哪一个例子:默认第一个没对上的 */
|
||||
const selected = ref(0)
|
||||
watch(sampleRuns, (runs) => {
|
||||
@@ -43,12 +76,8 @@ const current = computed(() => sampleRuns.value[selected.value] ?? null)
|
||||
|
||||
<n-flex v-else vertical :size="12">
|
||||
<!-- 设计稿「运行例子:例子 2 没对上(不算提交)」:标题、「不算提交」、各例子的芯片在一行 -->
|
||||
<ResultHeader
|
||||
:kind="failedCount ? 'error' : 'success'"
|
||||
:title="failedCount ? `试跑:${failedCount} 个例子没对上` : '试跑:例子都对上了'"
|
||||
sub="(不算提交)"
|
||||
>
|
||||
<template #extra>
|
||||
<ResultHeader :kind="header.kind" :title="header.title" sub="(不算提交)">
|
||||
<template v-if="header.chips" #extra>
|
||||
<div class="runs">
|
||||
<button
|
||||
v-for="run in sampleRuns"
|
||||
@@ -134,6 +163,10 @@ const current = computed(() => sampleRuns.value[selected.value] ?? null)
|
||||
:result="current.result"
|
||||
:output="current.output"
|
||||
:language="samplesCode?.language ?? ''"
|
||||
:note="current.note"
|
||||
:runtime-error="current.runtimeError"
|
||||
:code="samplesCode?.value ?? ''"
|
||||
:plain="inContest"
|
||||
/>
|
||||
</template>
|
||||
|
||||
|
||||
Reference in new issue
Block a user