core: fix acm lock stat (#547)

This commit is contained in:
panda authored and GitHub committed 2023-04-02 01:12:36 +08:00
1 parent 9bd2c37735
commit e1838a2493
1 file changed
+13 -15
+13 -15
View File
@@ -58,7 +58,7 @@ const acm = buildContestRule({
stat(tdoc, journal: AcmJournal[]) {
const naccept = Counter<number>();
const npending = Counter<number>();
const display: Record<number, AcmJournal> = {};
const display: Record<number, AcmDetail> = {};
const detail: Record<number, AcmDetail> = {};
let accept = 0;
let time = 0;
@@ -66,24 +66,22 @@ const acm = buildContestRule({
const lockAt = isLocked(tdoc) ? tdoc.lockAt : null;
for (const j of journal) {
if (!this.submitAfterAccept && display[j.pid]?.status === STATUS.STATUS_ACCEPTED) continue;
if (lockAt && j.rid.getTimestamp() > lockAt) {
npending[j.pid]++;
continue;
}
display[j.pid] = j;
const real = Math.floor((j.rid.getTimestamp().getTime() - tdoc.beginAt.getTime()) / 1000);
const penalty = 20 * 60 * naccept[j.pid];
detail[j.pid] = {
...j, naccept: naccept[j.pid], time: real + penalty, real, penalty,
};
if (![STATUS.STATUS_ACCEPTED, STATUS.STATUS_COMPILE_ERROR, STATUS.STATUS_FORMAT_ERROR].includes(j.status)) {
naccept[j.pid]++;
}
if (lockAt && j.rid.getTimestamp() > lockAt) {
npending[j.pid]++;
display[j.pid].npending = npending[j.pid];
continue;
}
display[j.pid] = detail[j.pid];
}
for (const pid in display) {
const j = display[pid];
const real = Math.floor((j.rid.getTimestamp().getTime() - tdoc.beginAt.getTime()) / 1000);
const penalty = 20 * 60 * naccept[j.pid];
detail[pid] = {
...j, naccept: naccept[j.pid], time: real + penalty, real, penalty, npending: npending[j.pid],
};
}
for (const d of Object.values(detail).filter((i) => i.status === STATUS.STATUS_ACCEPTED)) {
for (const d of Object.values(display).filter((i) => i.status === STATUS.STATUS_ACCEPTED)) {
accept++;
time += d.time;
}