@xcpcio/core 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +209 -117
- package/dist/index.d.ts +13 -10
- package/dist/index.mjs +209 -118
- package/package.json +2 -2
- package/src/export.ts +114 -0
- package/src/index.ts +1 -0
- package/src/team.ts +8 -0
package/dist/index.cjs
CHANGED
|
@@ -440,6 +440,208 @@ function createContestIndexList(contestListJSON) {
|
|
|
440
440
|
return contestIndexList;
|
|
441
441
|
}
|
|
442
442
|
|
|
443
|
+
function stringToSubmissionStatus(status) {
|
|
444
|
+
status = status.toUpperCase().replace(" ", "_");
|
|
445
|
+
if (["OK", "AC", types.SubmissionStatus.ACCEPTED.toString()].includes(status)) {
|
|
446
|
+
return types.SubmissionStatus.ACCEPTED;
|
|
447
|
+
}
|
|
448
|
+
if ([types.SubmissionStatus.CORRECT.toString()].includes(status)) {
|
|
449
|
+
return types.SubmissionStatus.CORRECT;
|
|
450
|
+
}
|
|
451
|
+
if ([types.SubmissionStatus.PARTIALLY_CORRECT.toString()].includes(status)) {
|
|
452
|
+
return types.SubmissionStatus.PARTIALLY_CORRECT;
|
|
453
|
+
}
|
|
454
|
+
if (["WA", types.SubmissionStatus.WRONG_ANSWER.toString()].includes(status)) {
|
|
455
|
+
return types.SubmissionStatus.WRONG_ANSWER;
|
|
456
|
+
}
|
|
457
|
+
if (["RJ", "INCORRECT", types.SubmissionStatus.REJECTED.toString()].includes(status)) {
|
|
458
|
+
return types.SubmissionStatus.REJECTED;
|
|
459
|
+
}
|
|
460
|
+
if (["PD", types.SubmissionStatus.PENDING.toString()].includes(status)) {
|
|
461
|
+
return types.SubmissionStatus.PENDING;
|
|
462
|
+
}
|
|
463
|
+
if ([types.SubmissionStatus.WAITING.toString()].includes(status)) {
|
|
464
|
+
return types.SubmissionStatus.WAITING;
|
|
465
|
+
}
|
|
466
|
+
if ([types.SubmissionStatus.JUDGING.toString()].includes(status)) {
|
|
467
|
+
return types.SubmissionStatus.JUDGING;
|
|
468
|
+
}
|
|
469
|
+
if ([types.SubmissionStatus.FROZEN.toString()].includes(status)) {
|
|
470
|
+
return types.SubmissionStatus.FROZEN;
|
|
471
|
+
}
|
|
472
|
+
if (["CE", types.SubmissionStatus.COMPILE_ERROR.toString()].includes(status)) {
|
|
473
|
+
return types.SubmissionStatus.COMPILE_ERROR;
|
|
474
|
+
}
|
|
475
|
+
if (["PE", types.SubmissionStatus.PRESENTATION_ERROR.toString()].includes(status)) {
|
|
476
|
+
return types.SubmissionStatus.PRESENTATION_ERROR;
|
|
477
|
+
}
|
|
478
|
+
if (["TL", "TLE", types.SubmissionStatus.TIME_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
479
|
+
return types.SubmissionStatus.TIME_LIMIT_EXCEEDED;
|
|
480
|
+
}
|
|
481
|
+
if (["ML", "MLE", types.SubmissionStatus.MEMORY_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
482
|
+
return types.SubmissionStatus.MEMORY_LIMIT_EXCEEDED;
|
|
483
|
+
}
|
|
484
|
+
if (["OL", "OLE", types.SubmissionStatus.OUTPUT_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
485
|
+
return types.SubmissionStatus.OUTPUT_LIMIT_EXCEEDED;
|
|
486
|
+
}
|
|
487
|
+
if (["IL", "ILE", types.SubmissionStatus.IDLENESS_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
488
|
+
return types.SubmissionStatus.IDLENESS_LIMIT_EXCEEDED;
|
|
489
|
+
}
|
|
490
|
+
if (["RT", "RE", "RTE", types.SubmissionStatus.RUNTIME_ERROR.toString()].includes(status)) {
|
|
491
|
+
return types.SubmissionStatus.RUNTIME_ERROR;
|
|
492
|
+
}
|
|
493
|
+
if (["JE", types.SubmissionStatus.JUDGEMENT_FAILED.toString()].includes(status)) {
|
|
494
|
+
return types.SubmissionStatus.JUDGEMENT_FAILED;
|
|
495
|
+
}
|
|
496
|
+
if (["SE", types.SubmissionStatus.SYSTEM_ERROR.toString()].includes(status)) {
|
|
497
|
+
return types.SubmissionStatus.SYSTEM_ERROR;
|
|
498
|
+
}
|
|
499
|
+
if ([types.SubmissionStatus.HACKED.toString()].includes(status)) {
|
|
500
|
+
return types.SubmissionStatus.HACKED;
|
|
501
|
+
}
|
|
502
|
+
if ([types.SubmissionStatus.CONFIGURATION_ERROR.toString()].includes(status)) {
|
|
503
|
+
return types.SubmissionStatus.CONFIGURATION_ERROR;
|
|
504
|
+
}
|
|
505
|
+
if ([types.SubmissionStatus.CANCELED.toString()].includes(status)) {
|
|
506
|
+
return types.SubmissionStatus.CANCELED;
|
|
507
|
+
}
|
|
508
|
+
if ([types.SubmissionStatus.SKIPPED.toString()].includes(status)) {
|
|
509
|
+
return types.SubmissionStatus.SKIPPED;
|
|
510
|
+
}
|
|
511
|
+
if ([types.SubmissionStatus.SECURITY_VIOLATED.toString()].includes(status)) {
|
|
512
|
+
return types.SubmissionStatus.SECURITY_VIOLATED;
|
|
513
|
+
}
|
|
514
|
+
if ([types.SubmissionStatus.DENIAL_OF_JUDGEMENT.toString()].includes(status)) {
|
|
515
|
+
return types.SubmissionStatus.DENIAL_OF_JUDGEMENT;
|
|
516
|
+
}
|
|
517
|
+
return types.SubmissionStatus.UNKNOWN;
|
|
518
|
+
}
|
|
519
|
+
function isAccepted(status) {
|
|
520
|
+
const acceptedArray = [types.SubmissionStatus.ACCEPTED, types.SubmissionStatus.CORRECT];
|
|
521
|
+
return acceptedArray.includes(status);
|
|
522
|
+
}
|
|
523
|
+
function isRejected(status) {
|
|
524
|
+
const rejectArray = [
|
|
525
|
+
types.SubmissionStatus.RUNTIME_ERROR,
|
|
526
|
+
types.SubmissionStatus.TIME_LIMIT_EXCEEDED,
|
|
527
|
+
types.SubmissionStatus.MEMORY_LIMIT_EXCEEDED,
|
|
528
|
+
types.SubmissionStatus.OUTPUT_LIMIT_EXCEEDED,
|
|
529
|
+
types.SubmissionStatus.IDLENESS_LIMIT_EXCEEDED,
|
|
530
|
+
types.SubmissionStatus.WRONG_ANSWER,
|
|
531
|
+
types.SubmissionStatus.REJECTED,
|
|
532
|
+
types.SubmissionStatus.JUDGEMENT_FAILED,
|
|
533
|
+
types.SubmissionStatus.HACKED
|
|
534
|
+
];
|
|
535
|
+
return rejectArray.includes(status);
|
|
536
|
+
}
|
|
537
|
+
function isPending(status) {
|
|
538
|
+
const pendingArray = [
|
|
539
|
+
types.SubmissionStatus.PENDING,
|
|
540
|
+
types.SubmissionStatus.WAITING,
|
|
541
|
+
types.SubmissionStatus.JUDGING,
|
|
542
|
+
types.SubmissionStatus.FROZEN
|
|
543
|
+
];
|
|
544
|
+
return pendingArray.includes(status);
|
|
545
|
+
}
|
|
546
|
+
function isNotCalculatedPenaltyStatus(status) {
|
|
547
|
+
const isNotCalculatedPenaltyArray = [
|
|
548
|
+
types.SubmissionStatus.COMPILE_ERROR,
|
|
549
|
+
types.SubmissionStatus.PRESENTATION_ERROR,
|
|
550
|
+
types.SubmissionStatus.CONFIGURATION_ERROR,
|
|
551
|
+
types.SubmissionStatus.SYSTEM_ERROR,
|
|
552
|
+
types.SubmissionStatus.CANCELED,
|
|
553
|
+
types.SubmissionStatus.SKIPPED,
|
|
554
|
+
types.SubmissionStatus.UNKNOWN,
|
|
555
|
+
types.SubmissionStatus.UNDEFINED
|
|
556
|
+
];
|
|
557
|
+
return isNotCalculatedPenaltyArray.includes(status);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
function submissionStatusToCodeforcesGymDatStatus(status) {
|
|
561
|
+
if (isAccepted(status)) {
|
|
562
|
+
return "OK";
|
|
563
|
+
}
|
|
564
|
+
if (status === types.SubmissionStatus.WRONG_ANSWER) {
|
|
565
|
+
return "WA";
|
|
566
|
+
}
|
|
567
|
+
if (status === types.SubmissionStatus.TIME_LIMIT_EXCEEDED) {
|
|
568
|
+
return "TL";
|
|
569
|
+
}
|
|
570
|
+
if (status === types.SubmissionStatus.MEMORY_LIMIT_EXCEEDED) {
|
|
571
|
+
return "ML";
|
|
572
|
+
}
|
|
573
|
+
if (status === types.SubmissionStatus.OUTPUT_LIMIT_EXCEEDED) {
|
|
574
|
+
return "IL";
|
|
575
|
+
}
|
|
576
|
+
if (status === types.SubmissionStatus.PRESENTATION_ERROR) {
|
|
577
|
+
return "PE";
|
|
578
|
+
}
|
|
579
|
+
if (status === types.SubmissionStatus.RUNTIME_ERROR) {
|
|
580
|
+
return "RT";
|
|
581
|
+
}
|
|
582
|
+
if (status === types.SubmissionStatus.COMPILE_ERROR || isNotCalculatedPenaltyStatus(status)) {
|
|
583
|
+
return "CE";
|
|
584
|
+
}
|
|
585
|
+
if (isPending(status)) {
|
|
586
|
+
return "PD";
|
|
587
|
+
}
|
|
588
|
+
return "RJ";
|
|
589
|
+
}
|
|
590
|
+
function rankToCodeforcesGymDAT(rank) {
|
|
591
|
+
let res = "";
|
|
592
|
+
res += `@contest "${rank.contest.name}"
|
|
593
|
+
@contlen ${Math.floor(rank.contest.endTime.diff(rank.contest.startTime) / 1e3 / 60)}
|
|
594
|
+
@problems ${rank.contest.problems.length}
|
|
595
|
+
@teams ${rank.teams.length + 100}
|
|
596
|
+
@submissions ${rank.submissions.length}
|
|
597
|
+
`;
|
|
598
|
+
rank.contest.problems.forEach((p) => {
|
|
599
|
+
res += `@p ${p.label},${p.label},20,0
|
|
600
|
+
`;
|
|
601
|
+
});
|
|
602
|
+
let teamIndex = 1;
|
|
603
|
+
const teamIdMap = /* @__PURE__ */ new Map();
|
|
604
|
+
const submissionsIdMap = /* @__PURE__ */ new Map();
|
|
605
|
+
rank.teams.forEach((team) => {
|
|
606
|
+
let name = team.name;
|
|
607
|
+
if (team.organization) {
|
|
608
|
+
name = `${team.organization} - ${name}`;
|
|
609
|
+
}
|
|
610
|
+
if (team.members) {
|
|
611
|
+
name = `${name} - ${team.membersToString}`;
|
|
612
|
+
}
|
|
613
|
+
res += `@t ${teamIndex},0,1,${name}
|
|
614
|
+
`;
|
|
615
|
+
teamIdMap.set(team.id, teamIndex);
|
|
616
|
+
teamIndex++;
|
|
617
|
+
{
|
|
618
|
+
const mp = /* @__PURE__ */ new Map();
|
|
619
|
+
rank.contest.problems.forEach((p) => {
|
|
620
|
+
mp.set(p.id, 0);
|
|
621
|
+
});
|
|
622
|
+
submissionsIdMap.set(team.id, mp);
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
for (let i = 0; i < 100; i++) {
|
|
626
|
+
res += `@t ${teamIndex},0,1,\u041F\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443
|
|
627
|
+
`;
|
|
628
|
+
teamIndex++;
|
|
629
|
+
}
|
|
630
|
+
rank.submissions.forEach((submission) => {
|
|
631
|
+
const teamId = submission.teamId;
|
|
632
|
+
const problemId = submission.problemId;
|
|
633
|
+
const problem = rank.contest.problemsMap.get(problemId);
|
|
634
|
+
if (!problem) {
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
const status = submissionStatusToCodeforcesGymDatStatus(submission.status);
|
|
638
|
+
submissionsIdMap.get(teamId).set(problemId, submissionsIdMap.get(teamId).get(problemId) + 1);
|
|
639
|
+
res += `@s ${teamIdMap.get(teamId)},${problem.label},${submissionsIdMap.get(teamId)?.get(problemId)},${submission.timestamp},${status}
|
|
640
|
+
`;
|
|
641
|
+
});
|
|
642
|
+
return res;
|
|
643
|
+
}
|
|
644
|
+
|
|
443
645
|
function getImageSource(image) {
|
|
444
646
|
if (image?.url) {
|
|
445
647
|
return image.url;
|
|
@@ -511,6 +713,12 @@ class Team {
|
|
|
511
713
|
const solvedNum = this.solvedProblemNum;
|
|
512
714
|
return calcDict(attemptedNum, solvedNum);
|
|
513
715
|
}
|
|
716
|
+
get membersToString() {
|
|
717
|
+
if (typeof this.members === "string") {
|
|
718
|
+
return this.members;
|
|
719
|
+
}
|
|
720
|
+
return this.members?.join(", ");
|
|
721
|
+
}
|
|
514
722
|
calcSolvedData() {
|
|
515
723
|
this.solvedProblemNum = 0;
|
|
516
724
|
this.attemptedProblemNum = 0;
|
|
@@ -614,123 +822,6 @@ function createTeams(teamsJSON) {
|
|
|
614
822
|
}
|
|
615
823
|
}
|
|
616
824
|
|
|
617
|
-
function stringToSubmissionStatus(status) {
|
|
618
|
-
status = status.toUpperCase().replace(" ", "_");
|
|
619
|
-
if (["OK", "AC", types.SubmissionStatus.ACCEPTED.toString()].includes(status)) {
|
|
620
|
-
return types.SubmissionStatus.ACCEPTED;
|
|
621
|
-
}
|
|
622
|
-
if ([types.SubmissionStatus.CORRECT.toString()].includes(status)) {
|
|
623
|
-
return types.SubmissionStatus.CORRECT;
|
|
624
|
-
}
|
|
625
|
-
if ([types.SubmissionStatus.PARTIALLY_CORRECT.toString()].includes(status)) {
|
|
626
|
-
return types.SubmissionStatus.PARTIALLY_CORRECT;
|
|
627
|
-
}
|
|
628
|
-
if (["WA", types.SubmissionStatus.WRONG_ANSWER.toString()].includes(status)) {
|
|
629
|
-
return types.SubmissionStatus.WRONG_ANSWER;
|
|
630
|
-
}
|
|
631
|
-
if (["RJ", "INCORRECT", types.SubmissionStatus.REJECTED.toString()].includes(status)) {
|
|
632
|
-
return types.SubmissionStatus.REJECTED;
|
|
633
|
-
}
|
|
634
|
-
if (["PD", types.SubmissionStatus.PENDING.toString()].includes(status)) {
|
|
635
|
-
return types.SubmissionStatus.PENDING;
|
|
636
|
-
}
|
|
637
|
-
if ([types.SubmissionStatus.WAITING.toString()].includes(status)) {
|
|
638
|
-
return types.SubmissionStatus.WAITING;
|
|
639
|
-
}
|
|
640
|
-
if ([types.SubmissionStatus.JUDGING.toString()].includes(status)) {
|
|
641
|
-
return types.SubmissionStatus.JUDGING;
|
|
642
|
-
}
|
|
643
|
-
if ([types.SubmissionStatus.FROZEN.toString()].includes(status)) {
|
|
644
|
-
return types.SubmissionStatus.FROZEN;
|
|
645
|
-
}
|
|
646
|
-
if (["CE", types.SubmissionStatus.COMPILE_ERROR.toString()].includes(status)) {
|
|
647
|
-
return types.SubmissionStatus.COMPILE_ERROR;
|
|
648
|
-
}
|
|
649
|
-
if (["PE", types.SubmissionStatus.PRESENTATION_ERROR.toString()].includes(status)) {
|
|
650
|
-
return types.SubmissionStatus.PRESENTATION_ERROR;
|
|
651
|
-
}
|
|
652
|
-
if (["TL", "TLE", types.SubmissionStatus.TIME_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
653
|
-
return types.SubmissionStatus.TIME_LIMIT_EXCEEDED;
|
|
654
|
-
}
|
|
655
|
-
if (["ML", "MLE", types.SubmissionStatus.MEMORY_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
656
|
-
return types.SubmissionStatus.MEMORY_LIMIT_EXCEEDED;
|
|
657
|
-
}
|
|
658
|
-
if (["OL", "OLE", types.SubmissionStatus.OUTPUT_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
659
|
-
return types.SubmissionStatus.OUTPUT_LIMIT_EXCEEDED;
|
|
660
|
-
}
|
|
661
|
-
if (["IL", "ILE", types.SubmissionStatus.IDLENESS_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
662
|
-
return types.SubmissionStatus.IDLENESS_LIMIT_EXCEEDED;
|
|
663
|
-
}
|
|
664
|
-
if (["RT", "RE", "RTE", types.SubmissionStatus.RUNTIME_ERROR.toString()].includes(status)) {
|
|
665
|
-
return types.SubmissionStatus.RUNTIME_ERROR;
|
|
666
|
-
}
|
|
667
|
-
if (["JE", types.SubmissionStatus.JUDGEMENT_FAILED.toString()].includes(status)) {
|
|
668
|
-
return types.SubmissionStatus.JUDGEMENT_FAILED;
|
|
669
|
-
}
|
|
670
|
-
if (["SE", types.SubmissionStatus.SYSTEM_ERROR.toString()].includes(status)) {
|
|
671
|
-
return types.SubmissionStatus.SYSTEM_ERROR;
|
|
672
|
-
}
|
|
673
|
-
if ([types.SubmissionStatus.HACKED.toString()].includes(status)) {
|
|
674
|
-
return types.SubmissionStatus.HACKED;
|
|
675
|
-
}
|
|
676
|
-
if ([types.SubmissionStatus.CONFIGURATION_ERROR.toString()].includes(status)) {
|
|
677
|
-
return types.SubmissionStatus.CONFIGURATION_ERROR;
|
|
678
|
-
}
|
|
679
|
-
if ([types.SubmissionStatus.CANCELED.toString()].includes(status)) {
|
|
680
|
-
return types.SubmissionStatus.CANCELED;
|
|
681
|
-
}
|
|
682
|
-
if ([types.SubmissionStatus.SKIPPED.toString()].includes(status)) {
|
|
683
|
-
return types.SubmissionStatus.SKIPPED;
|
|
684
|
-
}
|
|
685
|
-
if ([types.SubmissionStatus.SECURITY_VIOLATED.toString()].includes(status)) {
|
|
686
|
-
return types.SubmissionStatus.SECURITY_VIOLATED;
|
|
687
|
-
}
|
|
688
|
-
if ([types.SubmissionStatus.DENIAL_OF_JUDGEMENT.toString()].includes(status)) {
|
|
689
|
-
return types.SubmissionStatus.DENIAL_OF_JUDGEMENT;
|
|
690
|
-
}
|
|
691
|
-
return types.SubmissionStatus.UNKNOWN;
|
|
692
|
-
}
|
|
693
|
-
function isAccepted(status) {
|
|
694
|
-
const acceptedArray = [types.SubmissionStatus.ACCEPTED, types.SubmissionStatus.CORRECT];
|
|
695
|
-
return acceptedArray.includes(status);
|
|
696
|
-
}
|
|
697
|
-
function isRejected(status) {
|
|
698
|
-
const rejectArray = [
|
|
699
|
-
types.SubmissionStatus.RUNTIME_ERROR,
|
|
700
|
-
types.SubmissionStatus.TIME_LIMIT_EXCEEDED,
|
|
701
|
-
types.SubmissionStatus.MEMORY_LIMIT_EXCEEDED,
|
|
702
|
-
types.SubmissionStatus.OUTPUT_LIMIT_EXCEEDED,
|
|
703
|
-
types.SubmissionStatus.IDLENESS_LIMIT_EXCEEDED,
|
|
704
|
-
types.SubmissionStatus.WRONG_ANSWER,
|
|
705
|
-
types.SubmissionStatus.REJECTED,
|
|
706
|
-
types.SubmissionStatus.JUDGEMENT_FAILED,
|
|
707
|
-
types.SubmissionStatus.HACKED
|
|
708
|
-
];
|
|
709
|
-
return rejectArray.includes(status);
|
|
710
|
-
}
|
|
711
|
-
function isPending(status) {
|
|
712
|
-
const pendingArray = [
|
|
713
|
-
types.SubmissionStatus.PENDING,
|
|
714
|
-
types.SubmissionStatus.WAITING,
|
|
715
|
-
types.SubmissionStatus.JUDGING,
|
|
716
|
-
types.SubmissionStatus.FROZEN
|
|
717
|
-
];
|
|
718
|
-
return pendingArray.includes(status);
|
|
719
|
-
}
|
|
720
|
-
function isNotCalculatedPenaltyStatus(status) {
|
|
721
|
-
const isNotCalculatedPenaltyArray = [
|
|
722
|
-
types.SubmissionStatus.COMPILE_ERROR,
|
|
723
|
-
types.SubmissionStatus.PRESENTATION_ERROR,
|
|
724
|
-
types.SubmissionStatus.CONFIGURATION_ERROR,
|
|
725
|
-
types.SubmissionStatus.SYSTEM_ERROR,
|
|
726
|
-
types.SubmissionStatus.CANCELED,
|
|
727
|
-
types.SubmissionStatus.SKIPPED,
|
|
728
|
-
types.SubmissionStatus.UNKNOWN,
|
|
729
|
-
types.SubmissionStatus.UNDEFINED
|
|
730
|
-
];
|
|
731
|
-
return isNotCalculatedPenaltyArray.includes(status);
|
|
732
|
-
}
|
|
733
|
-
|
|
734
825
|
class Submission {
|
|
735
826
|
constructor() {
|
|
736
827
|
this.status = types.SubmissionStatus.UNKNOWN;
|
|
@@ -1185,4 +1276,5 @@ exports.isAccepted = isAccepted;
|
|
|
1185
1276
|
exports.isNotCalculatedPenaltyStatus = isNotCalculatedPenaltyStatus;
|
|
1186
1277
|
exports.isPending = isPending;
|
|
1187
1278
|
exports.isRejected = isRejected;
|
|
1279
|
+
exports.rankToCodeforcesGymDAT = rankToCodeforcesGymDAT;
|
|
1188
1280
|
exports.stringToSubmissionStatus = stringToSubmissionStatus;
|
package/dist/index.d.ts
CHANGED
|
@@ -150,15 +150,6 @@ type ContestIndexList = Array<ContestIndex>;
|
|
|
150
150
|
declare function createContestIndex(contestIndexJSON: ContestIndex$1): ContestIndex;
|
|
151
151
|
declare function createContestIndexList(contestListJSON: any): ContestIndexList;
|
|
152
152
|
|
|
153
|
-
declare function getImageSource(image: Image): string;
|
|
154
|
-
|
|
155
|
-
declare class RankStatistics {
|
|
156
|
-
teamSolvedNum: Array<number>;
|
|
157
|
-
maxSolvedProblems: number;
|
|
158
|
-
constructor();
|
|
159
|
-
reset(): void;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
153
|
declare class PlaceChartPointData {
|
|
163
154
|
timePoint: number;
|
|
164
155
|
rank: number;
|
|
@@ -191,6 +182,7 @@ declare class Team {
|
|
|
191
182
|
reset(): void;
|
|
192
183
|
get penaltyToMinute(): number;
|
|
193
184
|
get dict(): number;
|
|
185
|
+
get membersToString(): string | undefined;
|
|
194
186
|
calcSolvedData(): void;
|
|
195
187
|
calcAwards(awards?: Award[]): void;
|
|
196
188
|
isEqualRank(otherTeam: Team): boolean;
|
|
@@ -201,6 +193,13 @@ type Teams = Array<Team>;
|
|
|
201
193
|
declare function createTeam(teamJSON: Team$1): Team;
|
|
202
194
|
declare function createTeams(teamsJSON: Teams$1): Teams;
|
|
203
195
|
|
|
196
|
+
declare class RankStatistics {
|
|
197
|
+
teamSolvedNum: Array<number>;
|
|
198
|
+
maxSolvedProblems: number;
|
|
199
|
+
constructor();
|
|
200
|
+
reset(): void;
|
|
201
|
+
}
|
|
202
|
+
|
|
204
203
|
interface SelectOptionItem {
|
|
205
204
|
value: string;
|
|
206
205
|
text: string;
|
|
@@ -243,6 +242,10 @@ declare class Rank {
|
|
|
243
242
|
getSubmissions(): Submissions;
|
|
244
243
|
}
|
|
245
244
|
|
|
245
|
+
declare function rankToCodeforcesGymDAT(rank: Rank): string;
|
|
246
|
+
|
|
247
|
+
declare function getImageSource(image: Image): string;
|
|
248
|
+
|
|
246
249
|
declare class ResolverOperation {
|
|
247
250
|
id: number;
|
|
248
251
|
team: Team;
|
|
@@ -267,4 +270,4 @@ declare function isRejected(status: SubmissionStatus): boolean;
|
|
|
267
270
|
declare function isPending(status: SubmissionStatus): boolean;
|
|
268
271
|
declare function isNotCalculatedPenaltyStatus(status: SubmissionStatus): boolean;
|
|
269
272
|
|
|
270
|
-
export { Award, Awards, Contest, ContestIndex, ContestIndexConfig, ContestIndexList, MedalType, PlaceChartPointData, Problem, ProblemStatistics, Problems, Rank, RankOptions, RankStatistics, Resolver, SelectOptionItem, Submission, Submissions, Team, TeamProblemStatistics, Teams, calcDict, createContest, createContestIndex, createContestIndexList, createDayJS, createProblem, createProblems, createProblemsByProblemIds, createSubmission, createSubmissions, createTeam, createTeams, getImageSource, getTimeDiff, getTimestamp, isAccepted, isNotCalculatedPenaltyStatus, isPending, isRejected, stringToSubmissionStatus };
|
|
273
|
+
export { Award, Awards, Contest, ContestIndex, ContestIndexConfig, ContestIndexList, MedalType, PlaceChartPointData, Problem, ProblemStatistics, Problems, Rank, RankOptions, RankStatistics, Resolver, SelectOptionItem, Submission, Submissions, Team, TeamProblemStatistics, Teams, calcDict, createContest, createContestIndex, createContestIndexList, createDayJS, createProblem, createProblems, createProblemsByProblemIds, createSubmission, createSubmissions, createTeam, createTeams, getImageSource, getTimeDiff, getTimestamp, isAccepted, isNotCalculatedPenaltyStatus, isPending, isRejected, rankToCodeforcesGymDAT, stringToSubmissionStatus };
|
package/dist/index.mjs
CHANGED
|
@@ -424,6 +424,208 @@ function createContestIndexList(contestListJSON) {
|
|
|
424
424
|
return contestIndexList;
|
|
425
425
|
}
|
|
426
426
|
|
|
427
|
+
function stringToSubmissionStatus(status) {
|
|
428
|
+
status = status.toUpperCase().replace(" ", "_");
|
|
429
|
+
if (["OK", "AC", SubmissionStatus.ACCEPTED.toString()].includes(status)) {
|
|
430
|
+
return SubmissionStatus.ACCEPTED;
|
|
431
|
+
}
|
|
432
|
+
if ([SubmissionStatus.CORRECT.toString()].includes(status)) {
|
|
433
|
+
return SubmissionStatus.CORRECT;
|
|
434
|
+
}
|
|
435
|
+
if ([SubmissionStatus.PARTIALLY_CORRECT.toString()].includes(status)) {
|
|
436
|
+
return SubmissionStatus.PARTIALLY_CORRECT;
|
|
437
|
+
}
|
|
438
|
+
if (["WA", SubmissionStatus.WRONG_ANSWER.toString()].includes(status)) {
|
|
439
|
+
return SubmissionStatus.WRONG_ANSWER;
|
|
440
|
+
}
|
|
441
|
+
if (["RJ", "INCORRECT", SubmissionStatus.REJECTED.toString()].includes(status)) {
|
|
442
|
+
return SubmissionStatus.REJECTED;
|
|
443
|
+
}
|
|
444
|
+
if (["PD", SubmissionStatus.PENDING.toString()].includes(status)) {
|
|
445
|
+
return SubmissionStatus.PENDING;
|
|
446
|
+
}
|
|
447
|
+
if ([SubmissionStatus.WAITING.toString()].includes(status)) {
|
|
448
|
+
return SubmissionStatus.WAITING;
|
|
449
|
+
}
|
|
450
|
+
if ([SubmissionStatus.JUDGING.toString()].includes(status)) {
|
|
451
|
+
return SubmissionStatus.JUDGING;
|
|
452
|
+
}
|
|
453
|
+
if ([SubmissionStatus.FROZEN.toString()].includes(status)) {
|
|
454
|
+
return SubmissionStatus.FROZEN;
|
|
455
|
+
}
|
|
456
|
+
if (["CE", SubmissionStatus.COMPILE_ERROR.toString()].includes(status)) {
|
|
457
|
+
return SubmissionStatus.COMPILE_ERROR;
|
|
458
|
+
}
|
|
459
|
+
if (["PE", SubmissionStatus.PRESENTATION_ERROR.toString()].includes(status)) {
|
|
460
|
+
return SubmissionStatus.PRESENTATION_ERROR;
|
|
461
|
+
}
|
|
462
|
+
if (["TL", "TLE", SubmissionStatus.TIME_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
463
|
+
return SubmissionStatus.TIME_LIMIT_EXCEEDED;
|
|
464
|
+
}
|
|
465
|
+
if (["ML", "MLE", SubmissionStatus.MEMORY_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
466
|
+
return SubmissionStatus.MEMORY_LIMIT_EXCEEDED;
|
|
467
|
+
}
|
|
468
|
+
if (["OL", "OLE", SubmissionStatus.OUTPUT_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
469
|
+
return SubmissionStatus.OUTPUT_LIMIT_EXCEEDED;
|
|
470
|
+
}
|
|
471
|
+
if (["IL", "ILE", SubmissionStatus.IDLENESS_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
472
|
+
return SubmissionStatus.IDLENESS_LIMIT_EXCEEDED;
|
|
473
|
+
}
|
|
474
|
+
if (["RT", "RE", "RTE", SubmissionStatus.RUNTIME_ERROR.toString()].includes(status)) {
|
|
475
|
+
return SubmissionStatus.RUNTIME_ERROR;
|
|
476
|
+
}
|
|
477
|
+
if (["JE", SubmissionStatus.JUDGEMENT_FAILED.toString()].includes(status)) {
|
|
478
|
+
return SubmissionStatus.JUDGEMENT_FAILED;
|
|
479
|
+
}
|
|
480
|
+
if (["SE", SubmissionStatus.SYSTEM_ERROR.toString()].includes(status)) {
|
|
481
|
+
return SubmissionStatus.SYSTEM_ERROR;
|
|
482
|
+
}
|
|
483
|
+
if ([SubmissionStatus.HACKED.toString()].includes(status)) {
|
|
484
|
+
return SubmissionStatus.HACKED;
|
|
485
|
+
}
|
|
486
|
+
if ([SubmissionStatus.CONFIGURATION_ERROR.toString()].includes(status)) {
|
|
487
|
+
return SubmissionStatus.CONFIGURATION_ERROR;
|
|
488
|
+
}
|
|
489
|
+
if ([SubmissionStatus.CANCELED.toString()].includes(status)) {
|
|
490
|
+
return SubmissionStatus.CANCELED;
|
|
491
|
+
}
|
|
492
|
+
if ([SubmissionStatus.SKIPPED.toString()].includes(status)) {
|
|
493
|
+
return SubmissionStatus.SKIPPED;
|
|
494
|
+
}
|
|
495
|
+
if ([SubmissionStatus.SECURITY_VIOLATED.toString()].includes(status)) {
|
|
496
|
+
return SubmissionStatus.SECURITY_VIOLATED;
|
|
497
|
+
}
|
|
498
|
+
if ([SubmissionStatus.DENIAL_OF_JUDGEMENT.toString()].includes(status)) {
|
|
499
|
+
return SubmissionStatus.DENIAL_OF_JUDGEMENT;
|
|
500
|
+
}
|
|
501
|
+
return SubmissionStatus.UNKNOWN;
|
|
502
|
+
}
|
|
503
|
+
function isAccepted(status) {
|
|
504
|
+
const acceptedArray = [SubmissionStatus.ACCEPTED, SubmissionStatus.CORRECT];
|
|
505
|
+
return acceptedArray.includes(status);
|
|
506
|
+
}
|
|
507
|
+
function isRejected(status) {
|
|
508
|
+
const rejectArray = [
|
|
509
|
+
SubmissionStatus.RUNTIME_ERROR,
|
|
510
|
+
SubmissionStatus.TIME_LIMIT_EXCEEDED,
|
|
511
|
+
SubmissionStatus.MEMORY_LIMIT_EXCEEDED,
|
|
512
|
+
SubmissionStatus.OUTPUT_LIMIT_EXCEEDED,
|
|
513
|
+
SubmissionStatus.IDLENESS_LIMIT_EXCEEDED,
|
|
514
|
+
SubmissionStatus.WRONG_ANSWER,
|
|
515
|
+
SubmissionStatus.REJECTED,
|
|
516
|
+
SubmissionStatus.JUDGEMENT_FAILED,
|
|
517
|
+
SubmissionStatus.HACKED
|
|
518
|
+
];
|
|
519
|
+
return rejectArray.includes(status);
|
|
520
|
+
}
|
|
521
|
+
function isPending(status) {
|
|
522
|
+
const pendingArray = [
|
|
523
|
+
SubmissionStatus.PENDING,
|
|
524
|
+
SubmissionStatus.WAITING,
|
|
525
|
+
SubmissionStatus.JUDGING,
|
|
526
|
+
SubmissionStatus.FROZEN
|
|
527
|
+
];
|
|
528
|
+
return pendingArray.includes(status);
|
|
529
|
+
}
|
|
530
|
+
function isNotCalculatedPenaltyStatus(status) {
|
|
531
|
+
const isNotCalculatedPenaltyArray = [
|
|
532
|
+
SubmissionStatus.COMPILE_ERROR,
|
|
533
|
+
SubmissionStatus.PRESENTATION_ERROR,
|
|
534
|
+
SubmissionStatus.CONFIGURATION_ERROR,
|
|
535
|
+
SubmissionStatus.SYSTEM_ERROR,
|
|
536
|
+
SubmissionStatus.CANCELED,
|
|
537
|
+
SubmissionStatus.SKIPPED,
|
|
538
|
+
SubmissionStatus.UNKNOWN,
|
|
539
|
+
SubmissionStatus.UNDEFINED
|
|
540
|
+
];
|
|
541
|
+
return isNotCalculatedPenaltyArray.includes(status);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
function submissionStatusToCodeforcesGymDatStatus(status) {
|
|
545
|
+
if (isAccepted(status)) {
|
|
546
|
+
return "OK";
|
|
547
|
+
}
|
|
548
|
+
if (status === SubmissionStatus.WRONG_ANSWER) {
|
|
549
|
+
return "WA";
|
|
550
|
+
}
|
|
551
|
+
if (status === SubmissionStatus.TIME_LIMIT_EXCEEDED) {
|
|
552
|
+
return "TL";
|
|
553
|
+
}
|
|
554
|
+
if (status === SubmissionStatus.MEMORY_LIMIT_EXCEEDED) {
|
|
555
|
+
return "ML";
|
|
556
|
+
}
|
|
557
|
+
if (status === SubmissionStatus.OUTPUT_LIMIT_EXCEEDED) {
|
|
558
|
+
return "IL";
|
|
559
|
+
}
|
|
560
|
+
if (status === SubmissionStatus.PRESENTATION_ERROR) {
|
|
561
|
+
return "PE";
|
|
562
|
+
}
|
|
563
|
+
if (status === SubmissionStatus.RUNTIME_ERROR) {
|
|
564
|
+
return "RT";
|
|
565
|
+
}
|
|
566
|
+
if (status === SubmissionStatus.COMPILE_ERROR || isNotCalculatedPenaltyStatus(status)) {
|
|
567
|
+
return "CE";
|
|
568
|
+
}
|
|
569
|
+
if (isPending(status)) {
|
|
570
|
+
return "PD";
|
|
571
|
+
}
|
|
572
|
+
return "RJ";
|
|
573
|
+
}
|
|
574
|
+
function rankToCodeforcesGymDAT(rank) {
|
|
575
|
+
let res = "";
|
|
576
|
+
res += `@contest "${rank.contest.name}"
|
|
577
|
+
@contlen ${Math.floor(rank.contest.endTime.diff(rank.contest.startTime) / 1e3 / 60)}
|
|
578
|
+
@problems ${rank.contest.problems.length}
|
|
579
|
+
@teams ${rank.teams.length + 100}
|
|
580
|
+
@submissions ${rank.submissions.length}
|
|
581
|
+
`;
|
|
582
|
+
rank.contest.problems.forEach((p) => {
|
|
583
|
+
res += `@p ${p.label},${p.label},20,0
|
|
584
|
+
`;
|
|
585
|
+
});
|
|
586
|
+
let teamIndex = 1;
|
|
587
|
+
const teamIdMap = /* @__PURE__ */ new Map();
|
|
588
|
+
const submissionsIdMap = /* @__PURE__ */ new Map();
|
|
589
|
+
rank.teams.forEach((team) => {
|
|
590
|
+
let name = team.name;
|
|
591
|
+
if (team.organization) {
|
|
592
|
+
name = `${team.organization} - ${name}`;
|
|
593
|
+
}
|
|
594
|
+
if (team.members) {
|
|
595
|
+
name = `${name} - ${team.membersToString}`;
|
|
596
|
+
}
|
|
597
|
+
res += `@t ${teamIndex},0,1,${name}
|
|
598
|
+
`;
|
|
599
|
+
teamIdMap.set(team.id, teamIndex);
|
|
600
|
+
teamIndex++;
|
|
601
|
+
{
|
|
602
|
+
const mp = /* @__PURE__ */ new Map();
|
|
603
|
+
rank.contest.problems.forEach((p) => {
|
|
604
|
+
mp.set(p.id, 0);
|
|
605
|
+
});
|
|
606
|
+
submissionsIdMap.set(team.id, mp);
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
for (let i = 0; i < 100; i++) {
|
|
610
|
+
res += `@t ${teamIndex},0,1,\u041F\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443
|
|
611
|
+
`;
|
|
612
|
+
teamIndex++;
|
|
613
|
+
}
|
|
614
|
+
rank.submissions.forEach((submission) => {
|
|
615
|
+
const teamId = submission.teamId;
|
|
616
|
+
const problemId = submission.problemId;
|
|
617
|
+
const problem = rank.contest.problemsMap.get(problemId);
|
|
618
|
+
if (!problem) {
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
const status = submissionStatusToCodeforcesGymDatStatus(submission.status);
|
|
622
|
+
submissionsIdMap.get(teamId).set(problemId, submissionsIdMap.get(teamId).get(problemId) + 1);
|
|
623
|
+
res += `@s ${teamIdMap.get(teamId)},${problem.label},${submissionsIdMap.get(teamId)?.get(problemId)},${submission.timestamp},${status}
|
|
624
|
+
`;
|
|
625
|
+
});
|
|
626
|
+
return res;
|
|
627
|
+
}
|
|
628
|
+
|
|
427
629
|
function getImageSource(image) {
|
|
428
630
|
if (image?.url) {
|
|
429
631
|
return image.url;
|
|
@@ -495,6 +697,12 @@ class Team {
|
|
|
495
697
|
const solvedNum = this.solvedProblemNum;
|
|
496
698
|
return calcDict(attemptedNum, solvedNum);
|
|
497
699
|
}
|
|
700
|
+
get membersToString() {
|
|
701
|
+
if (typeof this.members === "string") {
|
|
702
|
+
return this.members;
|
|
703
|
+
}
|
|
704
|
+
return this.members?.join(", ");
|
|
705
|
+
}
|
|
498
706
|
calcSolvedData() {
|
|
499
707
|
this.solvedProblemNum = 0;
|
|
500
708
|
this.attemptedProblemNum = 0;
|
|
@@ -598,123 +806,6 @@ function createTeams(teamsJSON) {
|
|
|
598
806
|
}
|
|
599
807
|
}
|
|
600
808
|
|
|
601
|
-
function stringToSubmissionStatus(status) {
|
|
602
|
-
status = status.toUpperCase().replace(" ", "_");
|
|
603
|
-
if (["OK", "AC", SubmissionStatus.ACCEPTED.toString()].includes(status)) {
|
|
604
|
-
return SubmissionStatus.ACCEPTED;
|
|
605
|
-
}
|
|
606
|
-
if ([SubmissionStatus.CORRECT.toString()].includes(status)) {
|
|
607
|
-
return SubmissionStatus.CORRECT;
|
|
608
|
-
}
|
|
609
|
-
if ([SubmissionStatus.PARTIALLY_CORRECT.toString()].includes(status)) {
|
|
610
|
-
return SubmissionStatus.PARTIALLY_CORRECT;
|
|
611
|
-
}
|
|
612
|
-
if (["WA", SubmissionStatus.WRONG_ANSWER.toString()].includes(status)) {
|
|
613
|
-
return SubmissionStatus.WRONG_ANSWER;
|
|
614
|
-
}
|
|
615
|
-
if (["RJ", "INCORRECT", SubmissionStatus.REJECTED.toString()].includes(status)) {
|
|
616
|
-
return SubmissionStatus.REJECTED;
|
|
617
|
-
}
|
|
618
|
-
if (["PD", SubmissionStatus.PENDING.toString()].includes(status)) {
|
|
619
|
-
return SubmissionStatus.PENDING;
|
|
620
|
-
}
|
|
621
|
-
if ([SubmissionStatus.WAITING.toString()].includes(status)) {
|
|
622
|
-
return SubmissionStatus.WAITING;
|
|
623
|
-
}
|
|
624
|
-
if ([SubmissionStatus.JUDGING.toString()].includes(status)) {
|
|
625
|
-
return SubmissionStatus.JUDGING;
|
|
626
|
-
}
|
|
627
|
-
if ([SubmissionStatus.FROZEN.toString()].includes(status)) {
|
|
628
|
-
return SubmissionStatus.FROZEN;
|
|
629
|
-
}
|
|
630
|
-
if (["CE", SubmissionStatus.COMPILE_ERROR.toString()].includes(status)) {
|
|
631
|
-
return SubmissionStatus.COMPILE_ERROR;
|
|
632
|
-
}
|
|
633
|
-
if (["PE", SubmissionStatus.PRESENTATION_ERROR.toString()].includes(status)) {
|
|
634
|
-
return SubmissionStatus.PRESENTATION_ERROR;
|
|
635
|
-
}
|
|
636
|
-
if (["TL", "TLE", SubmissionStatus.TIME_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
637
|
-
return SubmissionStatus.TIME_LIMIT_EXCEEDED;
|
|
638
|
-
}
|
|
639
|
-
if (["ML", "MLE", SubmissionStatus.MEMORY_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
640
|
-
return SubmissionStatus.MEMORY_LIMIT_EXCEEDED;
|
|
641
|
-
}
|
|
642
|
-
if (["OL", "OLE", SubmissionStatus.OUTPUT_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
643
|
-
return SubmissionStatus.OUTPUT_LIMIT_EXCEEDED;
|
|
644
|
-
}
|
|
645
|
-
if (["IL", "ILE", SubmissionStatus.IDLENESS_LIMIT_EXCEEDED.toString()].includes(status)) {
|
|
646
|
-
return SubmissionStatus.IDLENESS_LIMIT_EXCEEDED;
|
|
647
|
-
}
|
|
648
|
-
if (["RT", "RE", "RTE", SubmissionStatus.RUNTIME_ERROR.toString()].includes(status)) {
|
|
649
|
-
return SubmissionStatus.RUNTIME_ERROR;
|
|
650
|
-
}
|
|
651
|
-
if (["JE", SubmissionStatus.JUDGEMENT_FAILED.toString()].includes(status)) {
|
|
652
|
-
return SubmissionStatus.JUDGEMENT_FAILED;
|
|
653
|
-
}
|
|
654
|
-
if (["SE", SubmissionStatus.SYSTEM_ERROR.toString()].includes(status)) {
|
|
655
|
-
return SubmissionStatus.SYSTEM_ERROR;
|
|
656
|
-
}
|
|
657
|
-
if ([SubmissionStatus.HACKED.toString()].includes(status)) {
|
|
658
|
-
return SubmissionStatus.HACKED;
|
|
659
|
-
}
|
|
660
|
-
if ([SubmissionStatus.CONFIGURATION_ERROR.toString()].includes(status)) {
|
|
661
|
-
return SubmissionStatus.CONFIGURATION_ERROR;
|
|
662
|
-
}
|
|
663
|
-
if ([SubmissionStatus.CANCELED.toString()].includes(status)) {
|
|
664
|
-
return SubmissionStatus.CANCELED;
|
|
665
|
-
}
|
|
666
|
-
if ([SubmissionStatus.SKIPPED.toString()].includes(status)) {
|
|
667
|
-
return SubmissionStatus.SKIPPED;
|
|
668
|
-
}
|
|
669
|
-
if ([SubmissionStatus.SECURITY_VIOLATED.toString()].includes(status)) {
|
|
670
|
-
return SubmissionStatus.SECURITY_VIOLATED;
|
|
671
|
-
}
|
|
672
|
-
if ([SubmissionStatus.DENIAL_OF_JUDGEMENT.toString()].includes(status)) {
|
|
673
|
-
return SubmissionStatus.DENIAL_OF_JUDGEMENT;
|
|
674
|
-
}
|
|
675
|
-
return SubmissionStatus.UNKNOWN;
|
|
676
|
-
}
|
|
677
|
-
function isAccepted(status) {
|
|
678
|
-
const acceptedArray = [SubmissionStatus.ACCEPTED, SubmissionStatus.CORRECT];
|
|
679
|
-
return acceptedArray.includes(status);
|
|
680
|
-
}
|
|
681
|
-
function isRejected(status) {
|
|
682
|
-
const rejectArray = [
|
|
683
|
-
SubmissionStatus.RUNTIME_ERROR,
|
|
684
|
-
SubmissionStatus.TIME_LIMIT_EXCEEDED,
|
|
685
|
-
SubmissionStatus.MEMORY_LIMIT_EXCEEDED,
|
|
686
|
-
SubmissionStatus.OUTPUT_LIMIT_EXCEEDED,
|
|
687
|
-
SubmissionStatus.IDLENESS_LIMIT_EXCEEDED,
|
|
688
|
-
SubmissionStatus.WRONG_ANSWER,
|
|
689
|
-
SubmissionStatus.REJECTED,
|
|
690
|
-
SubmissionStatus.JUDGEMENT_FAILED,
|
|
691
|
-
SubmissionStatus.HACKED
|
|
692
|
-
];
|
|
693
|
-
return rejectArray.includes(status);
|
|
694
|
-
}
|
|
695
|
-
function isPending(status) {
|
|
696
|
-
const pendingArray = [
|
|
697
|
-
SubmissionStatus.PENDING,
|
|
698
|
-
SubmissionStatus.WAITING,
|
|
699
|
-
SubmissionStatus.JUDGING,
|
|
700
|
-
SubmissionStatus.FROZEN
|
|
701
|
-
];
|
|
702
|
-
return pendingArray.includes(status);
|
|
703
|
-
}
|
|
704
|
-
function isNotCalculatedPenaltyStatus(status) {
|
|
705
|
-
const isNotCalculatedPenaltyArray = [
|
|
706
|
-
SubmissionStatus.COMPILE_ERROR,
|
|
707
|
-
SubmissionStatus.PRESENTATION_ERROR,
|
|
708
|
-
SubmissionStatus.CONFIGURATION_ERROR,
|
|
709
|
-
SubmissionStatus.SYSTEM_ERROR,
|
|
710
|
-
SubmissionStatus.CANCELED,
|
|
711
|
-
SubmissionStatus.SKIPPED,
|
|
712
|
-
SubmissionStatus.UNKNOWN,
|
|
713
|
-
SubmissionStatus.UNDEFINED
|
|
714
|
-
];
|
|
715
|
-
return isNotCalculatedPenaltyArray.includes(status);
|
|
716
|
-
}
|
|
717
|
-
|
|
718
809
|
class Submission {
|
|
719
810
|
constructor() {
|
|
720
811
|
this.status = SubmissionStatus.UNKNOWN;
|
|
@@ -1134,4 +1225,4 @@ class Resolver extends Rank {
|
|
|
1134
1225
|
}
|
|
1135
1226
|
}
|
|
1136
1227
|
|
|
1137
|
-
export { Award, Contest, ContestIndex, ContestIndexConfig, MedalType, PlaceChartPointData, Problem, ProblemStatistics, Rank, RankOptions, RankStatistics, Resolver, Submission, Team, TeamProblemStatistics, calcDict, createContest, createContestIndex, createContestIndexList, createDayJS, createProblem, createProblems, createProblemsByProblemIds, createSubmission, createSubmissions, createTeam, createTeams, getImageSource, getTimeDiff, getTimestamp, isAccepted, isNotCalculatedPenaltyStatus, isPending, isRejected, stringToSubmissionStatus };
|
|
1228
|
+
export { Award, Contest, ContestIndex, ContestIndexConfig, MedalType, PlaceChartPointData, Problem, ProblemStatistics, Rank, RankOptions, RankStatistics, Resolver, Submission, Team, TeamProblemStatistics, calcDict, createContest, createContestIndex, createContestIndexList, createDayJS, createProblem, createProblems, createProblemsByProblemIds, createSubmission, createSubmissions, createTeam, createTeams, getImageSource, getTimeDiff, getTimestamp, isAccepted, isNotCalculatedPenaltyStatus, isPending, isRejected, rankToCodeforcesGymDAT, stringToSubmissionStatus };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xcpcio/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "XCPCIO Core",
|
|
5
5
|
"author": "Dup4 <lyuzhi.pan@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"dayjs": "^1.11.8",
|
|
44
44
|
"lodash": "^4.17.21",
|
|
45
|
-
"@xcpcio/types": "0.
|
|
45
|
+
"@xcpcio/types": "0.9.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@babel/types": "^7.22.4",
|
package/src/export.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { SubmissionStatus } from "@xcpcio/types";
|
|
2
|
+
|
|
3
|
+
import type { Rank } from "./rank";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
isAccepted,
|
|
7
|
+
isNotCalculatedPenaltyStatus,
|
|
8
|
+
isPending,
|
|
9
|
+
} from "./submission-status";
|
|
10
|
+
|
|
11
|
+
function submissionStatusToCodeforcesGymDatStatus(status: SubmissionStatus): string {
|
|
12
|
+
if (isAccepted(status)) {
|
|
13
|
+
return "OK";
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (status === SubmissionStatus.WRONG_ANSWER) {
|
|
17
|
+
return "WA";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (status === SubmissionStatus.TIME_LIMIT_EXCEEDED) {
|
|
21
|
+
return "TL";
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (status === SubmissionStatus.MEMORY_LIMIT_EXCEEDED) {
|
|
25
|
+
return "ML";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (status === SubmissionStatus.OUTPUT_LIMIT_EXCEEDED) {
|
|
29
|
+
return "IL";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (status === SubmissionStatus.PRESENTATION_ERROR) {
|
|
33
|
+
return "PE";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (status === SubmissionStatus.RUNTIME_ERROR) {
|
|
37
|
+
return "RT";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (status === SubmissionStatus.COMPILE_ERROR || isNotCalculatedPenaltyStatus(status)) {
|
|
41
|
+
return "CE";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (isPending(status)) {
|
|
45
|
+
return "PD";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return "RJ";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function rankToCodeforcesGymDAT(rank: Rank) {
|
|
52
|
+
let res = "";
|
|
53
|
+
|
|
54
|
+
res += `@contest "${rank.contest.name}"
|
|
55
|
+
@contlen ${Math.floor(rank.contest.endTime.diff(rank.contest.startTime) / 1000 / 60)}
|
|
56
|
+
@problems ${rank.contest.problems.length}
|
|
57
|
+
@teams ${rank.teams.length + 100}
|
|
58
|
+
@submissions ${rank.submissions.length}
|
|
59
|
+
`;
|
|
60
|
+
|
|
61
|
+
rank.contest.problems.forEach((p) => {
|
|
62
|
+
res += `@p ${p.label},${p.label},20,0\n`;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
let teamIndex = 1;
|
|
66
|
+
const teamIdMap = new Map<string, number>();
|
|
67
|
+
const submissionsIdMap = new Map<string, Map<string, number>>();
|
|
68
|
+
|
|
69
|
+
rank.teams.forEach((team) => {
|
|
70
|
+
let name = team.name;
|
|
71
|
+
|
|
72
|
+
if (team.organization) {
|
|
73
|
+
name = `${team.organization} - ${name}`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (team.members) {
|
|
77
|
+
name = `${name} - ${team.membersToString}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
res += `@t ${teamIndex},0,1,${name}\n`;
|
|
81
|
+
teamIdMap.set(team.id, teamIndex);
|
|
82
|
+
teamIndex++;
|
|
83
|
+
|
|
84
|
+
{
|
|
85
|
+
const mp = new Map<string, number>();
|
|
86
|
+
rank.contest.problems.forEach((p) => {
|
|
87
|
+
mp.set(p.id, 0);
|
|
88
|
+
});
|
|
89
|
+
submissionsIdMap.set(team.id, mp);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
for (let i = 0; i < 100; i++) {
|
|
94
|
+
res += `@t ${teamIndex},0,1,Пополнить команду\n`;
|
|
95
|
+
teamIndex++;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
rank.submissions.forEach((submission) => {
|
|
99
|
+
const teamId = submission.teamId;
|
|
100
|
+
const problemId = submission.problemId;
|
|
101
|
+
const problem = rank.contest.problemsMap.get(problemId);
|
|
102
|
+
|
|
103
|
+
if (!problem) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const status = submissionStatusToCodeforcesGymDatStatus(submission.status);
|
|
108
|
+
submissionsIdMap.get(teamId)!.set(problemId, submissionsIdMap.get(teamId)!.get(problemId)! + 1);
|
|
109
|
+
|
|
110
|
+
res += `@s ${teamIdMap.get(teamId)},${problem.label},${submissionsIdMap.get(teamId)?.get(problemId)},${submission.timestamp},${status}\n`;
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return res;
|
|
114
|
+
}
|
package/src/index.ts
CHANGED
package/src/team.ts
CHANGED
|
@@ -114,6 +114,14 @@ export class Team {
|
|
|
114
114
|
return calcDict(attemptedNum, solvedNum);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
get membersToString() {
|
|
118
|
+
if (typeof this.members === "string") {
|
|
119
|
+
return this.members;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return this.members?.join(", ");
|
|
123
|
+
}
|
|
124
|
+
|
|
117
125
|
calcSolvedData() {
|
|
118
126
|
this.solvedProblemNum = 0;
|
|
119
127
|
this.attemptedProblemNum = 0;
|