From 8f0d39bb5a334eb1ec88e60afa4f34eaf520d986 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 28 Sep 2026 19:03:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=A2=98=E7=9B=AE):=20=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E8=AF=B4=E6=B8=85=E6=A5=9A=E9=94=99=E5=9C=A8?= =?UTF-8?q?=E5=93=AA=E2=80=94=E2=80=94=E3=80=8C=E5=9C=A8=E4=BE=8B=E5=AD=90?= =?UTF-8?q?=201=20=E4=B8=8A=E5=B0=B1=E9=94=99=E4=BA=86=E3=80=8D=E3=80=8C?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=B5=8B=E8=AF=95=E7=82=B9=E9=83=BD=E5=AF=B9?= =?UTF-8?q?=E4=BA=86=E3=80=8D=EF=BC=8C=E7=AD=94=E9=94=99=E6=97=B6=E9=99=84?= =?UTF-8?q?=E4=B8=8A=E9=A2=98=E7=9B=AE=E5=AF=B9=E8=BE=93=E5=87=BA=E7=9A=84?= =?UTF-8?q?=E5=8E=9F=E8=AF=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在公开例子上就错了的:标题写「答案错误 · 在例子 N 上就错了」,不再挂「通过 x/y 个测试点」 和进度条 —— 那时候那个数字没意义,先把例子跑对 - 做对了:「答案正确 · 所有测试点都对了」 - 答案错误的说明末尾摆出题目「输出」那一节的原话:格式不对、漏了一行这类错,对着原话一看就明白 - 例子都对、错在隐藏测试点的,给「去自己输入试试」(SQL 题不给,跑不了) - 提交详情页的标题不变 Co-Authored-By: Claude Opus 5.5 --- .../problem/components/SubmissionResult.vue | 46 ++++++++++-- .../problem/components/WrongAnswerExplain.vue | 74 ++++++++++++++++++- 2 files changed, 110 insertions(+), 10 deletions(-) diff --git a/apps/web/src/oj/problem/components/SubmissionResult.vue b/apps/web/src/oj/problem/components/SubmissionResult.vue index adf2fd2..fd11f09 100644 --- a/apps/web/src/oj/problem/components/SubmissionResult.vue +++ b/apps/web/src/oj/problem/components/SubmissionResult.vue @@ -145,6 +145,41 @@ const msg = computed(() => { // 这是学生这边唯一能看出「比上次多过了几个点」的地方。 const partialCases = computed(() => submissionPartialCases(props.submission)) +/** 在公开的例子上就错了:这时候「通过 x/y 个测试点」没意义,先说是哪个例子 */ +const failedOnSample = computed(() => + sampleCheck.value && !sampleCheck.value.passed ? sampleCheck.value : null, +) + +/** + * 结果标题(设计文档第 6 节)。比「答案错误 · 通过 1/3 个测试点」多走一步: + * 例子上就错了的说「在例子 N 上就错了」,例子都对的才报测试点;做对了说全对了。 + * 提交详情页还用通用的 submissionResultTitle + */ +const title = computed(() => { + const submission = props.submission + if (!submission) return "" + if (submission.result === SubmissionStatus.accepted) return "答案正确 · 所有测试点都对了" + if (failedOnSample.value) { + return `答案错误 · 在例子 ${(failedOnSample.value.index ?? 0) + 1} 上就错了` + } + const cases = hiddenCases.value + if (cases) return `答案错误 · 通过 ${cases.passed}/${cases.total} 个测试点` + return submissionResultTitle(submission) +}) + +/** + * 例子都对了、错在隐藏的测试点上:一个都没过也要报「通过 0/5」—— 那正说明例子之外的全错了。 + * 其余情况沿用 submissionPartialCases(一个都没过就不报) + */ +const hiddenCases = computed(() => { + const summary = props.submission?.caseSummary + if (!sampleCheck.value?.passed || !summary || summary.passed >= summary.total) return null + return summary +}) +const progressCases = computed( + () => hiddenCases.value ?? (failedOnSample.value ? null : partialCases.value), +) + // 是否显示AI提示区域。 // 阈值和后端 POST /ai/hint 共用契约里的 HINT_MIN_FAILURES,别在这里写死数字; // 编译失败不数次数,和后端同口径(理由见 HINT_MIN_FAILURES 的注释); @@ -214,16 +249,12 @@ const columns: DataTableColumn[] = [