@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 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.8.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.8.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
@@ -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/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;