@xcpcio/core 0.8.0 → 0.10.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 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.getSubmissions().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;
@@ -1058,7 +1149,9 @@ class Rank {
1058
1149
  if (this.options.enableFilterSubmissionsByTimestamp === false) {
1059
1150
  return this.submissions;
1060
1151
  }
1061
- return this.submissions.filter((s) => s.timestamp <= this.options.timestamp).sort(Submission.compare);
1152
+ return this.submissions.filter(
1153
+ (s) => s.timestamp <= this.options.timestamp
1154
+ ).sort(Submission.compare);
1062
1155
  }
1063
1156
  }
1064
1157
 
@@ -1185,4 +1278,5 @@ exports.isAccepted = isAccepted;
1185
1278
  exports.isNotCalculatedPenaltyStatus = isNotCalculatedPenaltyStatus;
1186
1279
  exports.isPending = isPending;
1187
1280
  exports.isRejected = isRejected;
1281
+ exports.rankToCodeforcesGymDAT = rankToCodeforcesGymDAT;
1188
1282
  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.getSubmissions().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;
@@ -1042,7 +1133,9 @@ class Rank {
1042
1133
  if (this.options.enableFilterSubmissionsByTimestamp === false) {
1043
1134
  return this.submissions;
1044
1135
  }
1045
- return this.submissions.filter((s) => s.timestamp <= this.options.timestamp).sort(Submission.compare);
1136
+ return this.submissions.filter(
1137
+ (s) => s.timestamp <= this.options.timestamp
1138
+ ).sort(Submission.compare);
1046
1139
  }
1047
1140
  }
1048
1141
 
@@ -1134,4 +1227,4 @@ class Resolver extends Rank {
1134
1227
  }
1135
1228
  }
1136
1229
 
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 };
1230
+ 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.8.0",
3
+ "version": "0.10.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.8.0"
45
+ "@xcpcio/types": "0.10.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.getSubmissions().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
@@ -2,6 +2,7 @@ export * from "./award";
2
2
  export * from "./contest-index";
3
3
  export * from "./utils";
4
4
  export * from "./contest";
5
+ export * from "./export";
5
6
  export * from "./image";
6
7
  export * from "./problem";
7
8
  export * from "./rank-statistics";
package/src/rank.ts CHANGED
@@ -390,6 +390,8 @@ export class Rank {
390
390
  return this.submissions;
391
391
  }
392
392
 
393
- return this.submissions.filter(s => s.timestamp <= this.options.timestamp).sort(Submission.compare);
393
+ return this.submissions.filter(s =>
394
+ s.timestamp <= this.options.timestamp,
395
+ ).sort(Submission.compare);
394
396
  }
395
397
  }
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;