From 38f636ba018f0361a0e011665b38d65fb5d6a8a6 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Wed, 3 Dec 2025 11:59:47 +0000 Subject: [PATCH 1/3] feat: Add tables for ABC 042-125 and ARC 058-103 (#2836) --- .../plan.md | 541 +++++++++++ prisma/contest_task_pairs.ts | 900 ++++++++++++++++++ prisma/tasks.ts | 378 ++++++++ src/lib/utils/contest_table_provider.ts | 102 ++ .../lib/utils/contest_table_provider.test.ts | 321 +++++++ 5 files changed, 2242 insertions(+) create mode 100644 docs/dev-notes/2025-12-03/add_tests_for_contest_table_provider/plan.md diff --git a/docs/dev-notes/2025-12-03/add_tests_for_contest_table_provider/plan.md b/docs/dev-notes/2025-12-03/add_tests_for_contest_table_provider/plan.md new file mode 100644 index 000000000..2ea8434db --- /dev/null +++ b/docs/dev-notes/2025-12-03/add_tests_for_contest_table_provider/plan.md @@ -0,0 +1,541 @@ +# ABC042~125 & ARC058~103 テスト追加計画 + +**作成日**: 2025-12-03 + +**対象ブランチ**: #2836 + +**優先度**: High + +--- + +## 概要 + +Issue #2836 で実装された `ABC042ToABC125Provider` と `ARC058ToARC103Provider` に対するテストを追加する計画。 + +**対象ファイル**: + +- **Provider実装**: [`src/lib/utils/contest_table_provider.ts`](../../../../../src/lib/utils/contest_table_provider.ts) + - `ABC042ToABC125Provider` (299行目~) + - `ARC058ToARC103Provider` (435行目~) +- **テストファイル**: [`src/test/lib/utils/contest_table_provider.test.ts`](../../../../../src/test/lib/utils/contest_table_provider.test.ts) + +**参照ドキュメント**: + +- [`docs/dev-notes/2025-11-19/add_tests_for_contest_table_provider/plan.md`](../../2025-11-19/add_tests_for_contest_table_provider/plan.md) - AGC001OnwardsProvider のテスト設計 +- Issue #2837 +- [`prisma/contest_task_pairs.ts`](../../../../../prisma/contest_task_pairs.ts) - 共有問題の対応関係 + +--- + +## 特徴と仕様 + +### ABC042~125 の仕様 + +- **範囲**: ABC042 ~ ABC125 +- **特徴**: 大部分が ARC との同日開催(ABC051、054 など一部は単独開催) +- **共有問題**: ABC042、043 のみ ARC側で登録 + - ABC042:C・D 問題 = ARC058 の C・D 問題(task_id は `arc058_a`, `arc058_b`) + - ABC043:C・D 問題 = ARC059 の C・D 問題(task_id は `arc059_a`, `arc059_b`) +- **その他**: ABC045~125 の共有問題は ABC側で登録されている + +### ARC058~103 の仕様 + +- **範囲**: ARC058 ~ ARC103 +- **特徴**: この範囲のすべての Round で ABC と同日開催 +- **共有問題**: C・D 問題が ABC側で登録されている + - ARC060 の C・D = ABC044 の C・D(task_id は `arc060_a`, `arc060_b`) + - ARC061 の C・D = ABC045 の C・D(task_id は `arc061_a`, `arc061_b`) + +### 表示設定 + +両プロバイダーとも以下で統一: + +- `tableBodyCellsWidth: 'w-1/2 md:w-1/3 lg:w-1/4 px-1 py-1'` +- `isShownHeader: true` +- `isShownRoundLabel: true` +- `roundLabelWidth: 'xl:w-16'` +- `isShownTaskIndex: false` + +--- + +## テスト設計 + +### 2.1 ABC042ToABC125Provider テスト + +**ファイル**: `src/test/lib/utils/contest_table_provider.test.ts` + +**配置**: AGC 001 Onwards の直前(現在の "ABC 126 to ABC 211" の後) + +#### テスト2.1.1: フィルタリング(Range検証) + +```typescript +test('expects to filter tasks within ABC042-125 range', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mixed = [ + { contest_id: 'abc041', task_id: 'abc041_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc125', task_id: 'abc125_a', task_table_index: 'A' }, + { contest_id: 'abc126', task_id: 'abc126_a', task_table_index: 'A' }, + ]; + + const filtered = provider.filter(mixed as TaskResult[]); + + expect(filtered).toHaveLength(2); + expect(filtered.map((t) => t.contest_id)).toEqual(['abc042', 'abc125']); +}); +``` + +#### テスト2.1.2: コンテストタイプ判別 + +```typescript +test('expects to filter only ABC-type contests', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mixed = [ + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + ]; + + const filtered = provider.filter(mixed as TaskResult[]); + + expect(filtered).toHaveLength(2); + expect(filtered[0].contest_id).toBe('abc042'); + expect(filtered[1].contest_id).toBe('abc042'); +}); +``` + +#### テスト2.1.3: メタデータ取得 + +```typescript +test('expects to return correct metadata', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const metadata = provider.getMetadata(); + + expect(metadata.title).toBe('AtCoder Beginner Contest 042 〜 125(ARC 同時開催が大半)'); + expect(metadata.abbreviationName).toBe('fromAbc042ToAbc125'); +}); +``` + +#### テスト2.1.4: ディスプレイ設定 + +```typescript +test('expects to return correct display config', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const config = provider.getDisplayConfig(); + + expect(config.isShownHeader).toBe(true); + expect(config.isShownRoundLabel).toBe(true); + expect(config.tableBodyCellsWidth).toBe('w-1/2 md:w-1/3 lg:w-1/4 px-1 py-1'); + expect(config.roundLabelWidth).toBe('xl:w-16'); + expect(config.isShownTaskIndex).toBe(false); +}); +``` + +#### テスト2.1.5: ラウンドラベルフォーマット + +```typescript +test('expects to format contest round label correctly', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + + expect(provider.getContestRoundLabel('abc042')).toBe('042'); + expect(provider.getContestRoundLabel('abc125')).toBe('125'); +}); +``` + +#### テスト2.1.6: テーブル生成 + +```typescript +test('expects to generate correct table structure', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mockTasks = [ + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'abc042_b', task_table_index: 'B' }, + { contest_id: 'abc042', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'abc042', task_id: 'arc058_b', task_table_index: 'D' }, + ]; + + const table = provider.generateTable(mockTasks as TaskResult[]); + + expect(table).toHaveProperty('abc042'); + expect(table.abc042).toHaveProperty('A'); + expect(table.abc042).toHaveProperty('B'); + expect(table.abc042).toHaveProperty('C'); + expect(table.abc042).toHaveProperty('D'); +}); +``` + +#### テスト2.1.7: ラウンド ID 取得 + +```typescript +test('expects to return correct round id', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + + expect(provider.getRoundId('abc042')).toBe('abc042'); + expect(provider.getRoundId('abc125')).toBe('abc125'); +}); +``` + +#### テスト2.1.8: ヘッダー ID 取得 + +```typescript +test('expects to return correct header id', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + + expect(provider.getHeaderId()).toMatch(/fromAbc042ToAbc125/); +}); +``` + +#### テスト2.1.9: 空入力処理 + +```typescript +test('expects to handle empty input', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + + const table = provider.generateTable([] as TaskResult[]); + + expect(table).toEqual({}); +}); +``` + +#### テスト2.1.10: 混合コンテストタイプ排除 + +```typescript +test('expects to exclude non-ABC contests even if in range', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mixed = [ + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc043', task_id: 'abc043_a', task_table_index: 'A' }, + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc059', task_id: 'arc059_a', task_table_index: 'C' }, + ]; + + const filtered = provider.filter(mixed as TaskResult[]); + + expect(filtered).toHaveLength(2); + expect(filtered.every((t) => t.contest_id.startsWith('abc'))).toBe(true); +}); +``` + +#### テスト2.1.11: 共有問題の正しい処理(ABC042の特殊性) + +```typescript +test('expects to generate correct table structure with shared problems (ABC042 with ARC058)', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mockAbc042Tasks = [ + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'abc042_b', task_table_index: 'B' }, + { contest_id: 'abc042', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'abc042', task_id: 'arc058_b', task_table_index: 'D' }, + ]; + + const table = provider.generateTable(mockAbc042Tasks as TaskResult[]); + + expect(table).toHaveProperty('abc042'); + expect(table.abc042).toHaveProperty('A'); // ABC専用 + expect(table.abc042).toHaveProperty('B'); // ABC専用 + expect(table.abc042).toHaveProperty('C'); // 共有問題(ARC側のtask_id) + expect(table.abc042).toHaveProperty('D'); // 共有問題(ARC側のtask_id) +}); +``` + +#### テスト2.1.12: 単独開催と同時開催の混在処理 + +```typescript +test('expects to handle both solo and concurrent contests correctly', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mixed = [ + // ABC042:ARC058と同時開催 + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'arc058_a', task_table_index: 'C' }, + // ABC051:単独開催(ARC同時開催なし) + { contest_id: 'abc051', task_id: 'abc051_c', task_table_index: 'C' }, + { contest_id: 'abc051', task_id: 'abc051_d', task_table_index: 'D' }, + ]; + + const filtered = provider.filter(mixed as TaskResult[]); + const table = provider.generateTable(filtered); + + expect(table).toHaveProperty('abc042'); + expect(table).toHaveProperty('abc051'); + expect(table.abc042).toHaveProperty('C'); // 共有問題 + expect(table.abc051).toHaveProperty('C'); + expect(table.abc051).toHaveProperty('D'); +}); +``` + +--- + +### 2.2 ARC058ToARC103Provider テスト + +**ファイル**: `src/test/lib/utils/contest_table_provider.test.ts` + +**配置**: ARC 104 Onwards の直後 + +#### テスト2.2.1: フィルタリング(Range検証) + +```typescript +test('expects to filter tasks within ARC058-103 range', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mixed = [ + { contest_id: 'arc057', task_id: 'arc057_a', task_table_index: 'A' }, + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc103', task_id: 'arc103_a', task_table_index: 'C' }, + { contest_id: 'arc104', task_id: 'arc104_a', task_table_index: 'A' }, + ]; + + const filtered = provider.filter(mixed as TaskResult[]); + + expect(filtered).toHaveLength(2); + expect(filtered.map((t) => t.contest_id)).toEqual(['arc058', 'arc103']); +}); +``` + +#### テスト2.2.2: コンテストタイプ判別 + +```typescript +test('expects to filter only ARC-type contests', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mixed = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_f', task_table_index: 'F' }, + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + ]; + + const filtered = provider.filter(mixed as TaskResult[]); + + expect(filtered).toHaveLength(2); + expect(filtered[0].contest_id).toBe('arc058'); + expect(filtered[1].contest_id).toBe('arc058'); +}); +``` + +#### テスト2.2.3: メタデータ取得 + +```typescript +test('expects to return correct metadata', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const metadata = provider.getMetadata(); + + expect(metadata.title).toBe('AtCoder Regular Contest 058 〜 103(ABC 同時開催)'); + expect(metadata.abbreviationName).toBe('fromArc058ToArc103'); +}); +``` + +#### テスト2.2.4: ディスプレイ設定 + +```typescript +test('expects to return correct display config', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const config = provider.getDisplayConfig(); + + expect(config.isShownHeader).toBe(true); + expect(config.isShownRoundLabel).toBe(true); + expect(config.tableBodyCellsWidth).toBe('w-1/2 md:w-1/3 lg:w-1/4 px-1 py-1'); + expect(config.roundLabelWidth).toBe('xl:w-16'); + expect(config.isShownTaskIndex).toBe(false); +}); +``` + +#### テスト2.2.5: ラウンドラベルフォーマット + +```typescript +test('expects to format contest round label correctly', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + + expect(provider.getContestRoundLabel('arc058')).toBe('058'); + expect(provider.getContestRoundLabel('arc103')).toBe('103'); +}); +``` + +#### テスト2.2.6: テーブル生成 + +```typescript +test('expects to generate correct table structure', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mockTasks = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_b', task_table_index: 'D' }, + { contest_id: 'arc058', task_id: 'arc058_c', task_table_index: 'E' }, + { contest_id: 'arc058', task_id: 'arc058_d', task_table_index: 'F' }, + ]; + + const table = provider.generateTable(mockTasks as TaskResult[]); + + expect(table).toHaveProperty('arc058'); + expect(table.arc058).toHaveProperty('C'); + expect(table.arc058).toHaveProperty('D'); + expect(table.arc058).toHaveProperty('E'); + expect(table.arc058).toHaveProperty('F'); +}); +``` + +#### テスト2.2.7: ラウンド ID 取得 + +```typescript +test('expects to return correct round id', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + + expect(provider.getRoundId('arc058')).toBe('arc058'); + expect(provider.getRoundId('arc103')).toBe('arc103'); +}); +``` + +#### テスト2.2.8: ヘッダー ID 取得 + +```typescript +test('expects to return correct header id', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + + expect(provider.getHeaderId()).toMatch(/fromArc058ToArc103/); +}); +``` + +#### テスト2.2.9: 空入力処理 + +```typescript +test('expects to handle empty input', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + + const table = provider.generateTable([] as TaskResult[]); + + expect(table).toEqual({}); +}); +``` + +#### テスト2.2.10: 混合コンテストタイプ排除 + +```typescript +test('expects to exclude non-ARC contests even if in range', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mixed = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc059', task_id: 'arc059_a', task_table_index: 'C' }, + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc043', task_id: 'abc043_a', task_table_index: 'A' }, + ]; + + const filtered = provider.filter(mixed as TaskResult[]); + + expect(filtered).toHaveLength(2); + expect(filtered.every((t) => t.contest_id.startsWith('arc'))).toBe(true); +}); +``` + +#### テスト2.2.11: 共有問題の正しい処理(ARC058の構成) + +```typescript +test('expects to generate correct table structure with shared and exclusive problems (ARC058)', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mockArc058Tasks = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_b', task_table_index: 'D' }, + { contest_id: 'arc058', task_id: 'arc058_c', task_table_index: 'E' }, + { contest_id: 'arc058', task_id: 'arc058_d', task_table_index: 'F' }, + ]; + + const table = provider.generateTable(mockArc058Tasks as TaskResult[]); + + expect(table).toHaveProperty('arc058'); + expect(table.arc058).toHaveProperty('C'); // ABC側と共有 + expect(table.arc058).toHaveProperty('D'); // ABC側と共有 + expect(table.arc058).toHaveProperty('E'); // ARC専用 + expect(table.arc058).toHaveProperty('F'); // ARC専用 +}); +``` + +#### テスト2.2.12: ABC同時開催パターンの検証 + +```typescript +test('expects to correctly handle ARC58-103 where all rounds are concurrent with ABC', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + + // ARC058(ABC042と同時開催) + const arc058Tasks = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_b', task_table_index: 'D' }, + ]; + + // ARC060(ABC044と同時開催) + const arc060Tasks = [ + { contest_id: 'arc060', task_id: 'arc060_a', task_table_index: 'C' }, + { contest_id: 'arc060', task_id: 'arc060_b', task_table_index: 'D' }, + ]; + + const mixed = [...arc058Tasks, ...arc060Tasks]; + const filtered = provider.filter(mixed as TaskResult[]); + const table = provider.generateTable(filtered); + + expect(filtered).toHaveLength(4); + expect(table).toHaveProperty('arc058'); + expect(table).toHaveProperty('arc060'); +}); +``` + +--- + +## 実装手順 + +1. **モックデータ作成**: 各プロバイダーのテストに必要なモック TaskResult を定義 +2. **ABC042ToABC125Provider テスト実装**: テスト2.1.1 ~ 2.1.12 を順次実装 +3. **ARC058ToARC103Provider テスト実装**: テスト2.2.1 ~ 2.2.12 を順次実装 +4. **テスト実行**: `pnpm test` ですべてのテストが通ることを確認 +5. **カバレッジ確認**: 両プロバイダーで 100% のカバレッジを達成 + +--- + +## 実装時の注意事項 + +### any の使用を避ける + +モックデータ型指定時は、`as TaskResult[]` ではなく、以下のように型安全に実装すること: + +```typescript +const mockTasks: TaskResult[] = [ + // ... 正しい型定義 +]; +``` + +### 共有問題表現の統一 + +- ABC042/043:ARC側の task_id を使用(`arc058_a`, `arc059_a` など) +- ARC058~103:すべてのコンテストで ABC と共有する C・D 問題あり + +### テーブル構造の検証 + +`generateTable` の戻り値は以下の構造: + +```typescript +type ContestTable = { + [contestId: string]: { + [taskIndex: string]: TaskResult; + }; +}; +``` + +--- + +## 参考資料 + +- [AGC001OnwardsProvider テスト](../../2025-11-19/add_tests_for_contest_table_provider/plan.md) - 基本パターン +- [`src/lib/utils/contest_table_provider.ts`](../../../../../src/lib/utils/contest_table_provider.ts) - 実装コード +- [`prisma/contest_task_pairs.ts`](../../../../../prisma/contest_task_pairs.ts) - 共有問題対応関係 + +--- + +## 実装結果と教訓 + +### 実装完了 + +- **ABC042ToABC125Provider**: 12個のテストを実装・パス ✓ +- **ARC058ToARC103Provider**: 12個のテストを実装・パス ✓ +- **合計テスト数**: 166個のテストがすべてパス + +### 教訓 + +1. **メソッド名の確認が重要**: `getRoundId()` や `getHeaderId()` などのメソッドは実装されていないため、`getContestRoundIds()` や `getMetadata().abbreviationName` など、実装済みのメソッドを使うべき。事前に ContestTableProviderBase の実装を確認してからテストを書くこと。 + +2. **Range検証とType検証を分離**: フィルタリングのテストでは、Range(範囲)の検証とContestType(コンテストタイプ)の検証を別々のテストケースで行うと、問題の原因特定が容易になる。 + +3. **共有問題のテストは実装の詳細を反映**: ABC042/043や ARC058~103の共有問題は、テスト時も実装の動作に合わせて task_id を正しく設定すること。これにより、実装と テストの一貫性が保証される。 + +4. **Plan.md の役割の重要性**: 実装前に計画書を詳細に作成・確認することで、「どのメソッドを使うべきか」「どのような入力パターンをカバーすべきか」が明確になり、実装効率が大幅に向上する。 diff --git a/prisma/contest_task_pairs.ts b/prisma/contest_task_pairs.ts index d61cbdd58..46f9242d2 100644 --- a/prisma/contest_task_pairs.ts +++ b/prisma/contest_task_pairs.ts @@ -1,4 +1,904 @@ export const contest_task_pairs = [ + { + contest_id: 'abc111', + problem_id: 'arc103_b', + problem_index: 'D', + }, + { + contest_id: 'abc111', + problem_id: 'arc103_a', + problem_index: 'C', + }, + { + contest_id: 'abc108', + problem_id: 'arc102_b', + problem_index: 'D', + }, + { + contest_id: 'abc108', + problem_id: 'arc102_a', + problem_index: 'C', + }, + { + contest_id: 'abc107', + problem_id: 'arc101_b', + problem_index: 'D', + }, + { + contest_id: 'abc107', + problem_id: 'arc101_a', + problem_index: 'C', + }, + { + contest_id: 'abc102', + problem_id: 'arc100_b', + problem_index: 'D', + }, + { + contest_id: 'abc102', + problem_id: 'arc100_a', + problem_index: 'C', + }, + { + contest_id: 'abc101', + problem_id: 'arc099_b', + problem_index: 'D', + }, + { + contest_id: 'abc101', + problem_id: 'arc099_a', + problem_index: 'C', + }, + { + contest_id: 'abc098', + problem_id: 'arc098_b', + problem_index: 'D', + }, + { + contest_id: 'abc098', + problem_id: 'arc098_a', + problem_index: 'C', + }, + { + contest_id: 'abc097', + problem_id: 'arc097_b', + problem_index: 'D', + }, + { + contest_id: 'abc097', + problem_id: 'arc097_a', + problem_index: 'C', + }, + { + contest_id: 'abc095', + problem_id: 'arc096_b', + problem_index: 'D', + }, + { + contest_id: 'abc095', + problem_id: 'arc096_a', + problem_index: 'C', + }, + { + contest_id: 'abc094', + problem_id: 'arc095_b', + problem_index: 'D', + }, + { + contest_id: 'abc094', + problem_id: 'arc095_a', + problem_index: 'C', + }, + { + contest_id: 'abc093', + problem_id: 'arc094_b', + problem_index: 'D', + }, + { + contest_id: 'abc093', + problem_id: 'arc094_a', + problem_index: 'C', + }, + { + contest_id: 'abc092', + problem_id: 'arc093_b', + problem_index: 'D', + }, + { + contest_id: 'abc092', + problem_id: 'arc093_a', + problem_index: 'C', + }, + { + contest_id: 'abc091', + problem_id: 'arc092_b', + problem_index: 'D', + }, + { + contest_id: 'abc091', + problem_id: 'arc092_a', + problem_index: 'C', + }, + { + contest_id: 'abc090', + problem_id: 'arc091_b', + problem_index: 'D', + }, + { + contest_id: 'abc090', + problem_id: 'arc091_a', + problem_index: 'C', + }, + { + contest_id: 'abc087', + problem_id: 'arc090_b', + problem_index: 'D', + }, + { + contest_id: 'abc087', + problem_id: 'arc090_a', + problem_index: 'C', + }, + { + contest_id: 'abc086', + problem_id: 'arc089_b', + problem_index: 'D', + }, + { + contest_id: 'abc086', + problem_id: 'arc089_a', + problem_index: 'C', + }, + { + contest_id: 'abc083', + problem_id: 'arc088_b', + problem_index: 'D', + }, + { + contest_id: 'abc083', + problem_id: 'arc088_a', + problem_index: 'C', + }, + { + contest_id: 'abc082', + problem_id: 'arc087_b', + problem_index: 'D', + }, + { + contest_id: 'abc082', + problem_id: 'arc087_a', + problem_index: 'C', + }, + { + contest_id: 'abc081', + problem_id: 'arc086_b', + problem_index: 'D', + }, + { + contest_id: 'abc081', + problem_id: 'arc086_a', + problem_index: 'C', + }, + { + contest_id: 'abc078', + problem_id: 'arc085_b', + problem_index: 'D', + }, + { + contest_id: 'abc078', + problem_id: 'arc085_a', + problem_index: 'C', + }, + { + contest_id: 'abc077', + problem_id: 'arc084_b', + problem_index: 'D', + }, + { + contest_id: 'abc077', + problem_id: 'arc084_a', + problem_index: 'C', + }, + { + contest_id: 'abc074', + problem_id: 'arc083_b', + problem_index: 'D', + }, + { + contest_id: 'abc074', + problem_id: 'arc083_a', + problem_index: 'C', + }, + { + contest_id: 'abc072', + problem_id: 'arc082_b', + problem_index: 'D', + }, + { + contest_id: 'abc072', + problem_id: 'arc082_a', + problem_index: 'C', + }, + { + contest_id: 'abc071', + problem_id: 'arc081_b', + problem_index: 'D', + }, + { + contest_id: 'abc071', + problem_id: 'arc081_a', + problem_index: 'C', + }, + { + contest_id: 'abc069', + problem_id: 'arc080_b', + problem_index: 'D', + }, + { + contest_id: 'abc069', + problem_id: 'arc080_a', + problem_index: 'C', + }, + { + contest_id: 'abc068', + problem_id: 'arc079_b', + problem_index: 'D', + }, + { + contest_id: 'abc068', + problem_id: 'arc079_a', + problem_index: 'C', + }, + { + contest_id: 'abc067', + problem_id: 'arc078_b', + problem_index: 'D', + }, + { + contest_id: 'abc067', + problem_id: 'arc078_a', + problem_index: 'C', + }, + { + contest_id: 'abc066', + problem_id: 'arc077_b', + problem_index: 'D', + }, + { + contest_id: 'abc066', + problem_id: 'arc077_a', + problem_index: 'C', + }, + { + contest_id: 'abc065', + problem_id: 'arc076_b', + problem_index: 'D', + }, + { + contest_id: 'abc065', + problem_id: 'arc076_a', + problem_index: 'C', + }, + { + contest_id: 'abc063', + problem_id: 'arc075_b', + problem_index: 'D', + }, + { + contest_id: 'abc063', + problem_id: 'arc075_a', + problem_index: 'C', + }, + { + contest_id: 'abc062', + problem_id: 'arc074_b', + problem_index: 'D', + }, + { + contest_id: 'abc062', + problem_id: 'arc074_a', + problem_index: 'C', + }, + { + contest_id: 'abc060', + problem_id: 'arc073_b', + problem_index: 'D', + }, + { + contest_id: 'abc060', + problem_id: 'arc073_a', + problem_index: 'C', + }, + { + contest_id: 'abc059', + problem_id: 'arc072_b', + problem_index: 'D', + }, + { + contest_id: 'abc059', + problem_id: 'arc072_a', + problem_index: 'C', + }, + { + contest_id: 'abc058', + problem_id: 'arc071_b', + problem_index: 'D', + }, + { + contest_id: 'abc058', + problem_id: 'arc071_a', + problem_index: 'C', + }, + { + contest_id: 'abc056', + problem_id: 'arc070_b', + problem_index: 'D', + }, + { + contest_id: 'abc056', + problem_id: 'arc070_a', + problem_index: 'C', + }, + { + contest_id: 'abc055', + problem_id: 'arc069_b', + problem_index: 'D', + }, + { + contest_id: 'abc055', + problem_id: 'arc069_a', + problem_index: 'C', + }, + { + contest_id: 'abc053', + problem_id: 'arc068_b', + problem_index: 'D', + }, + { + contest_id: 'abc053', + problem_id: 'arc068_a', + problem_index: 'C', + }, + { + contest_id: 'abc052', + problem_id: 'arc067_b', + problem_index: 'D', + }, + { + contest_id: 'abc052', + problem_id: 'arc067_a', + problem_index: 'C', + }, + { + contest_id: 'abc050', + problem_id: 'arc066_b', + problem_index: 'D', + }, + { + contest_id: 'abc050', + problem_id: 'arc066_a', + problem_index: 'C', + }, + { + contest_id: 'abc049', + problem_id: 'arc065_b', + problem_index: 'D', + }, + { + contest_id: 'abc049', + problem_id: 'arc065_a', + problem_index: 'C', + }, + { + contest_id: 'abc048', + problem_id: 'arc064_b', + problem_index: 'D', + }, + { + contest_id: 'abc048', + problem_id: 'arc064_a', + problem_index: 'C', + }, + { + contest_id: 'abc047', + problem_id: 'arc063_b', + problem_index: 'D', + }, + { + contest_id: 'abc047', + problem_id: 'arc063_a', + problem_index: 'C', + }, + { + contest_id: 'abc046', + problem_id: 'arc062_b', + problem_index: 'D', + }, + { + contest_id: 'abc046', + problem_id: 'arc062_a', + problem_index: 'C', + }, + { + contest_id: 'abc045', + problem_id: 'arc061_b', + problem_index: 'D', + }, + { + contest_id: 'abc045', + problem_id: 'arc061_a', + problem_index: 'C', + }, + { + contest_id: 'abc044', + problem_id: 'arc060_b', + problem_index: 'D', + }, + { + contest_id: 'abc044', + problem_id: 'arc060_a', + problem_index: 'C', + }, + { + contest_id: 'abc043', + problem_id: 'arc059_b', + problem_index: 'D', + }, + { + contest_id: 'abc043', + problem_id: 'arc059_a', + problem_index: 'C', + }, + { + contest_id: 'abc042', + problem_id: 'arc058_b', + problem_index: 'D', + }, + { + contest_id: 'abc042', + problem_id: 'arc058_a', + problem_index: 'C', + }, + { + contest_id: 'arc103', + problem_id: 'arc103_b', + problem_index: 'D', + }, + { + contest_id: 'arc103', + problem_id: 'arc103_a', + problem_index: 'C', + }, + { + contest_id: 'arc102', + problem_id: 'arc102_b', + problem_index: 'D', + }, + { + contest_id: 'arc102', + problem_id: 'arc102_a', + problem_index: 'C', + }, + { + contest_id: 'arc101', + problem_id: 'arc101_b', + problem_index: 'D', + }, + { + contest_id: 'arc101', + problem_id: 'arc101_a', + problem_index: 'C', + }, + { + contest_id: 'arc100', + problem_id: 'arc100_b', + problem_index: 'D', + }, + { + contest_id: 'arc100', + problem_id: 'arc100_a', + problem_index: 'C', + }, + { + contest_id: 'arc099', + problem_id: 'arc099_b', + problem_index: 'D', + }, + { + contest_id: 'arc099', + problem_id: 'arc099_a', + problem_index: 'C', + }, + { + contest_id: 'arc098', + problem_id: 'arc098_b', + problem_index: 'D', + }, + { + contest_id: 'arc098', + problem_id: 'arc098_a', + problem_index: 'C', + }, + { + contest_id: 'arc097', + problem_id: 'arc097_b', + problem_index: 'D', + }, + { + contest_id: 'arc097', + problem_id: 'arc097_a', + problem_index: 'C', + }, + { + contest_id: 'arc096', + problem_id: 'arc096_b', + problem_index: 'D', + }, + { + contest_id: 'arc096', + problem_id: 'arc096_a', + problem_index: 'C', + }, + { + contest_id: 'arc095', + problem_id: 'arc095_b', + problem_index: 'D', + }, + { + contest_id: 'arc095', + problem_id: 'arc095_a', + problem_index: 'C', + }, + { + contest_id: 'arc094', + problem_id: 'arc094_b', + problem_index: 'D', + }, + { + contest_id: 'arc094', + problem_id: 'arc094_a', + problem_index: 'C', + }, + { + contest_id: 'arc093', + problem_id: 'arc093_b', + problem_index: 'D', + }, + { + contest_id: 'arc093', + problem_id: 'arc093_a', + problem_index: 'C', + }, + { + contest_id: 'arc092', + problem_id: 'arc092_b', + problem_index: 'D', + }, + { + contest_id: 'arc092', + problem_id: 'arc092_a', + problem_index: 'C', + }, + { + contest_id: 'arc091', + problem_id: 'arc091_b', + problem_index: 'D', + }, + { + contest_id: 'arc091', + problem_id: 'arc091_a', + problem_index: 'C', + }, + { + contest_id: 'arc090', + problem_id: 'arc090_b', + problem_index: 'D', + }, + { + contest_id: 'arc090', + problem_id: 'arc090_a', + problem_index: 'C', + }, + { + contest_id: 'arc089', + problem_id: 'arc089_b', + problem_index: 'D', + }, + { + contest_id: 'arc089', + problem_id: 'arc089_a', + problem_index: 'C', + }, + { + contest_id: 'arc088', + problem_id: 'arc088_b', + problem_index: 'D', + }, + { + contest_id: 'arc088', + problem_id: 'arc088_a', + problem_index: 'C', + }, + { + contest_id: 'arc087', + problem_id: 'arc087_b', + problem_index: 'D', + }, + { + contest_id: 'arc087', + problem_id: 'arc087_a', + problem_index: 'C', + }, + { + contest_id: 'arc086', + problem_id: 'arc086_b', + problem_index: 'D', + }, + { + contest_id: 'arc086', + problem_id: 'arc086_a', + problem_index: 'C', + }, + { + contest_id: 'arc085', + problem_id: 'arc085_b', + problem_index: 'D', + }, + { + contest_id: 'arc085', + problem_id: 'arc085_a', + problem_index: 'C', + }, + { + contest_id: 'arc084', + problem_id: 'arc084_b', + problem_index: 'D', + }, + { + contest_id: 'arc084', + problem_id: 'arc084_a', + problem_index: 'C', + }, + { + contest_id: 'arc083', + problem_id: 'arc083_b', + problem_index: 'D', + }, + { + contest_id: 'arc083', + problem_id: 'arc083_a', + problem_index: 'C', + }, + { + contest_id: 'arc082', + problem_id: 'arc082_b', + problem_index: 'D', + }, + { + contest_id: 'arc082', + problem_id: 'arc082_a', + problem_index: 'C', + }, + { + contest_id: 'arc081', + problem_id: 'arc081_b', + problem_index: 'D', + }, + { + contest_id: 'arc081', + problem_id: 'arc081_a', + problem_index: 'C', + }, + { + contest_id: 'arc080', + problem_id: 'arc080_b', + problem_index: 'D', + }, + { + contest_id: 'arc080', + problem_id: 'arc080_a', + problem_index: 'C', + }, + { + contest_id: 'arc079', + problem_id: 'arc079_b', + problem_index: 'D', + }, + { + contest_id: 'arc079', + problem_id: 'arc079_a', + problem_index: 'C', + }, + { + contest_id: 'arc078', + problem_id: 'arc078_b', + problem_index: 'D', + }, + { + contest_id: 'arc078', + problem_id: 'arc078_a', + problem_index: 'C', + }, + { + contest_id: 'arc077', + problem_id: 'arc077_b', + problem_index: 'D', + }, + { + contest_id: 'arc077', + problem_id: 'arc077_a', + problem_index: 'C', + }, + { + contest_id: 'arc076', + problem_id: 'arc076_b', + problem_index: 'D', + }, + { + contest_id: 'arc076', + problem_id: 'arc076_a', + problem_index: 'C', + }, + { + contest_id: 'arc075', + problem_id: 'arc075_b', + problem_index: 'D', + }, + { + contest_id: 'arc075', + problem_id: 'arc075_a', + problem_index: 'C', + }, + { + contest_id: 'arc074', + problem_id: 'arc074_b', + problem_index: 'D', + }, + { + contest_id: 'arc074', + problem_id: 'arc074_a', + problem_index: 'C', + }, + { + contest_id: 'arc073', + problem_id: 'arc073_b', + problem_index: 'D', + }, + { + contest_id: 'arc073', + problem_id: 'arc073_a', + problem_index: 'C', + }, + { + contest_id: 'arc072', + problem_id: 'arc072_b', + problem_index: 'D', + }, + { + contest_id: 'arc072', + problem_id: 'arc072_a', + problem_index: 'C', + }, + { + contest_id: 'arc071', + problem_id: 'arc071_b', + problem_index: 'D', + }, + { + contest_id: 'arc071', + problem_id: 'arc071_a', + problem_index: 'C', + }, + { + contest_id: 'arc070', + problem_id: 'arc070_b', + problem_index: 'D', + }, + { + contest_id: 'arc070', + problem_id: 'arc070_a', + problem_index: 'C', + }, + { + contest_id: 'arc069', + problem_id: 'arc069_b', + problem_index: 'D', + }, + { + contest_id: 'arc069', + problem_id: 'arc069_a', + problem_index: 'C', + }, + { + contest_id: 'arc068', + problem_id: 'arc068_b', + problem_index: 'D', + }, + { + contest_id: 'arc068', + problem_id: 'arc068_a', + problem_index: 'C', + }, + { + contest_id: 'arc067', + problem_id: 'arc067_b', + problem_index: 'D', + }, + { + contest_id: 'arc067', + problem_id: 'arc067_a', + problem_index: 'C', + }, + { + contest_id: 'arc066', + problem_id: 'arc066_b', + problem_index: 'D', + }, + { + contest_id: 'arc066', + problem_id: 'arc066_a', + problem_index: 'C', + }, + { + contest_id: 'arc065', + problem_id: 'arc065_b', + problem_index: 'D', + }, + { + contest_id: 'arc065', + problem_id: 'arc065_a', + problem_index: 'C', + }, + { + contest_id: 'arc064', + problem_id: 'arc064_b', + problem_index: 'D', + }, + { + contest_id: 'arc064', + problem_id: 'arc064_a', + problem_index: 'C', + }, + { + contest_id: 'arc063', + problem_id: 'arc063_b', + problem_index: 'D', + }, + { + contest_id: 'arc063', + problem_id: 'arc063_a', + problem_index: 'C', + }, + { + contest_id: 'arc062', + problem_id: 'arc062_b', + problem_index: 'D', + }, + { + contest_id: 'arc062', + problem_id: 'arc062_a', + problem_index: 'C', + }, + { + contest_id: 'arc061', + problem_id: 'arc061_b', + problem_index: 'D', + }, + { + contest_id: 'arc061', + problem_id: 'arc061_a', + problem_index: 'C', + }, + { + contest_id: 'arc060', + problem_id: 'arc060_b', + problem_index: 'D', + }, + { + contest_id: 'arc060', + problem_id: 'arc060_a', + problem_index: 'C', + }, { contest_id: 'tessoku-book', problem_id: 'typical90_s', diff --git a/prisma/tasks.ts b/prisma/tasks.ts index fe1e5bab6..95231dea3 100755 --- a/prisma/tasks.ts +++ b/prisma/tasks.ts @@ -4305,6 +4305,62 @@ export const tasks = [ name: 'Changing a Character', title: 'A. Changing a Character', }, + { + id: 'abc125_d', + contest_id: 'abc125', + problem_index: 'D', + name: 'Flipping Signs', + title: 'D. Flipping Signs', + }, + { + id: 'abc125_c', + contest_id: 'abc125', + problem_index: 'C', + name: 'GCD on Blackboard', + title: 'C. GCD on Blackboard', + }, + { + id: 'abc125_b', + contest_id: 'abc125', + problem_index: 'B', + name: 'Resale', + title: 'B. Resale', + }, + { + id: 'abc125_a', + contest_id: 'abc125', + problem_index: 'A', + name: 'Biscuit Generator', + title: 'A. Biscuit Generator', + }, + { + id: 'abc124_d', + contest_id: 'abc124', + problem_index: 'D', + name: 'Handstand', + title: 'D. Handstand', + }, + { + id: 'abc124_c', + contest_id: 'abc124', + problem_index: 'C', + name: 'Coloring Colorfully', + title: 'C. Coloring Colorfully', + }, + { + id: 'abc124_b', + contest_id: 'abc124', + problem_index: 'B', + name: 'Great Ocean View', + title: 'B. Great Ocean View', + }, + { + id: 'abc124_a', + contest_id: 'abc124', + problem_index: 'A', + name: 'Buttons', + title: 'A. Buttons', + }, { id: 'abc123_d', contest_id: 'abc123', @@ -4313,6 +4369,146 @@ export const tasks = [ title: 'D. Cake 123', grade: 'Q1', }, + { + id: 'abc113_d', + contest_id: 'abc113', + problem_index: 'D', + name: 'Number of Amidakuji', + title: 'D. Number of Amidakuji', + }, + { + id: 'abc113_c', + contest_id: 'abc113', + problem_index: 'C', + name: 'ID', + title: 'C. ID', + }, + { + id: 'abc113_b', + contest_id: 'abc113', + problem_index: 'B', + name: 'Palace', + title: 'B. Palace', + }, + { + id: 'abc113_a', + contest_id: 'abc113', + problem_index: 'A', + name: 'Discount Fare', + title: 'A. Discount Fare', + }, + { + id: 'abc112_d', + contest_id: 'abc112', + problem_index: 'D', + name: 'Partition', + title: 'D. Partition', + }, + { + id: 'abc112_c', + contest_id: 'abc112', + problem_index: 'C', + name: 'Pyramid', + title: 'C. Pyramid', + }, + { + id: 'abc112_b', + contest_id: 'abc112', + problem_index: 'B', + name: 'Time Limit Exceeded', + title: 'B. Time Limit Exceeded', + }, + { + id: 'abc112_a', + contest_id: 'abc112', + problem_index: 'A', + name: 'Programming Education', + title: 'A. Programming Education', + }, + { + id: 'arc103_b', + contest_id: 'abc111', + problem_index: 'D', + name: 'Robot Arms', + title: 'D. Robot Arms', + }, + { + id: 'arc103_a', + contest_id: 'abc111', + problem_index: 'C', + name: '/\\/\\/\\/', + title: 'C. /\\/\\/\\/', + }, + { + id: 'abc111_b', + contest_id: 'abc111', + problem_index: 'B', + name: 'AtCoder Beginner Contest 111', + title: 'B. AtCoder Beginner Contest 111', + }, + { + id: 'abc111_a', + contest_id: 'abc111', + problem_index: 'A', + name: 'AtCoder Beginner Contest 999', + title: 'A. AtCoder Beginner Contest 999', + }, + { + id: 'abc110_d', + contest_id: 'abc110', + problem_index: 'D', + name: 'Factorization', + title: 'D. Factorization', + }, + { + id: 'abc110_c', + contest_id: 'abc110', + problem_index: 'C', + name: 'String Transformation', + title: 'C. String Transformation', + }, + { + id: 'abc110_b', + contest_id: 'abc110', + problem_index: 'B', + name: "1 Dimensional World's Tale", + title: "B. 1 Dimensional World's Tale", + }, + { + id: 'abc110_a', + contest_id: 'abc110', + problem_index: 'A', + name: 'Maximize the Formula', + title: 'A. Maximize the Formula', + }, + { + id: 'arc102_b', + contest_id: 'abc108', + problem_index: 'D', + name: 'All Your Paths are Different Lengths', + title: 'D. All Your Paths are Different Lengths', + }, + { + id: 'arc102_a', + contest_id: 'abc108', + problem_index: 'C', + name: 'Triangular Relationship', + title: 'C. Triangular Relationship', + }, + { + id: 'abc108_b', + contest_id: 'abc108', + problem_index: 'B', + name: 'Ruined Square', + title: 'B. Ruined Square', + }, + { + id: 'abc108_a', + contest_id: 'abc108', + problem_index: 'A', + name: 'Pair', + title: 'A. Pair', + }, { id: 'abc075_d', contest_id: 'abc075', @@ -4320,6 +4516,90 @@ export const tasks = [ name: 'Axis-Parallel Rectangle', title: 'D. Axis-Parallel Rectangle', }, + { + id: 'abc051_d', + contest_id: 'abc051', + problem_index: 'D', + name: 'Candidates of No Shortest Paths', + title: 'D. Candidates of No Shortest Paths', + }, + { + id: 'abc051_c', + contest_id: 'abc051', + problem_index: 'C', + name: 'Back and Forth', + title: 'C. Back and Forth', + }, + { + id: 'abc051_b', + contest_id: 'abc051', + problem_index: 'B', + name: 'Sum of Three Integers', + title: 'B. Sum of Three Integers', + }, + { + id: 'abc051_a', + contest_id: 'abc051', + problem_index: 'A', + name: 'Haiku', + title: 'A. Haiku', + }, + { + id: 'arc060_b', + contest_id: 'abc044', + problem_index: 'D', + name: 'Digit Sum', + title: 'D. Digit Sum', + }, + { + id: 'arc060_a', + contest_id: 'abc044', + problem_index: 'C', + name: 'Tak and Cards', + title: 'C. Tak and Cards', + }, + { + id: 'abc044_b', + contest_id: 'abc044', + problem_index: 'B', + name: 'Beautiful Strings', + title: 'B. Beautiful Strings', + }, + { + id: 'abc044_a', + contest_id: 'abc044', + problem_index: 'A', + name: 'Tak and Hotels (ABC Edit)', + title: 'A. Tak and Hotels (ABC Edit)', + }, + { + id: 'abc043_b', + contest_id: 'abc043', + problem_index: 'B', + name: 'Unhappy Hacking (ABC Edit)', + title: 'B. Unhappy Hacking (ABC Edit)', + }, + { + id: 'abc043_a', + contest_id: 'abc043', + problem_index: 'A', + name: 'Children and Candies (ABC Edit)', + title: 'A. Children and Candies (ABC Edit)', + }, + { + id: 'abc042_b', + contest_id: 'abc042', + problem_index: 'B', + name: 'Iroha Loves Strings (ABC Edition)', + title: 'B. Iroha Loves Strings (ABC Edition)', + }, + { + id: 'abc042_a', + contest_id: 'abc042', + problem_index: 'A', + name: 'Iroha and Haiku (ABC Edition)', + title: 'A. Iroha and Haiku (ABC Edition)', + }, { id: 'abc007_3', contest_id: 'abc007', @@ -4581,6 +4861,34 @@ export const tasks = [ name: 'Plus Minus', title: 'A. Plus Minus', }, + { + id: 'arc103_d', + contest_id: 'arc103', + problem_index: 'F', + name: 'Distance Sums', + title: 'F. Distance Sums', + }, + { + id: 'arc103_c', + contest_id: 'arc103', + problem_index: 'E', + name: 'Tr/ee', + title: 'E. Tr/ee', + }, + { + id: 'arc102_d', + contest_id: 'arc102', + problem_index: 'F', + name: 'Revenge of BBuBBBlesort!', + title: 'F. Revenge of BBuBBBlesort!', + }, + { + id: 'arc102_c', + contest_id: 'arc102', + problem_index: 'E', + name: 'Stop. Otherwise...', + title: 'E. Stop. Otherwise...', + }, { id: 'arc084_b', contest_id: 'abc077', @@ -4596,6 +4904,76 @@ export const tasks = [ title: 'E. Connected?', grade: 'D2', }, + { + id: 'arc060_d', + contest_id: 'arc060', + problem_index: 'F', + name: 'Best Representation', + title: 'F. Best Representation', + }, + { + id: 'arc060_c', + contest_id: 'arc060', + problem_index: 'E', + name: 'Tak and Hotels', + title: 'E. Tak and Hotels', + }, + { + id: 'arc059_d', + contest_id: 'arc059', + problem_index: 'F', + name: 'Unhappy Hacking', + title: 'F. Unhappy Hacking', + }, + { + id: 'arc059_c', + contest_id: 'arc059', + problem_index: 'E', + name: 'Children and Candies', + title: 'E. Children and Candies', + }, + { + id: 'arc059_b', + contest_id: 'arc059', + problem_index: 'D', + name: 'Unbalanced', + title: 'D. Unbalanced', + }, + { + id: 'arc059_a', + contest_id: 'arc059', + problem_index: 'C', + name: 'Be Together', + title: 'C. Be Together', + }, + { + id: 'arc058_d', + contest_id: 'arc058', + problem_index: 'F', + name: 'Iroha Loves Strings', + title: 'F. Iroha Loves Strings', + }, + { + id: 'arc058_c', + contest_id: 'arc058', + problem_index: 'E', + name: 'Iroha and Haiku', + title: 'E. Iroha and Haiku', + }, + { + id: 'arc058_b', + contest_id: 'arc058', + problem_index: 'D', + name: 'Iroha and a Grid', + title: 'D. Iroha and a Grid', + }, + { + id: 'arc058_a', + contest_id: 'arc058', + problem_index: 'C', + name: "Iroha's Obsession", + title: "C. Iroha's Obsession", + }, { id: 'agc074_e', contest_id: 'agc074', diff --git a/src/lib/utils/contest_table_provider.ts b/src/lib/utils/contest_table_provider.ts index ffdbdf5bf..b5e56abb7 100644 --- a/src/lib/utils/contest_table_provider.ts +++ b/src/lib/utils/contest_table_provider.ts @@ -255,6 +255,47 @@ export class ABC126ToABC211Provider extends ContestTableProviderBase { } } +// ABC042 〜 ABC125 (2016/07/23 〜 2019/04/27) +// 4 tasks per contest +// +// Note: +// Before and from ABC042 onwards, the number and tendency of tasks are very different. +// From this round onwards, contests became rated. +export class ABC042ToABC125Provider extends ContestTableProviderBase { + protected setFilterCondition(): (taskResult: TaskResult) => boolean { + return (taskResult: TaskResult) => { + if (classifyContest(taskResult.contest_id) !== this.contestType) { + return false; + } + + const contestRound = parseContestRound(taskResult.contest_id, 'abc'); + return contestRound >= 42 && contestRound <= 125; + }; + } + + getMetadata(): ContestTableMetaData { + return { + title: 'AtCoder Beginner Contest 042 〜 125(ARC 同時開催が大半)', + abbreviationName: 'fromAbc042ToAbc125', + }; + } + + getDisplayConfig(): ContestTableDisplayConfig { + return { + isShownHeader: true, + isShownRoundLabel: true, + tableBodyCellsWidth: 'w-1/2 md:w-1/3 lg:w-1/4 px-1 py-1', + roundLabelWidth: 'xl:w-16', + isShownTaskIndex: false, + }; + } + + getContestRoundLabel(contestId: string): string { + const contestNameLabel = getContestNameLabel(contestId); + return contestNameLabel.replace('ABC ', ''); + } +} + // ARC104 〜 (2020/10/03 〜 ) // 4 〜 7 tasks per contest export class ARC104OnwardsProvider extends ContestTableProviderBase { @@ -282,6 +323,47 @@ export class ARC104OnwardsProvider extends ContestTableProviderBase { } } +// ARC058 〜 ARC103 (2016/07/23 〜 2018/09/29) +// 4 tasks per contest +// +// Note: +// Before and from ARC058 onwards, the number and tendency of tasks are very different. +// From this round onwards, contests became rated. +export class ARC058ToARC103Provider extends ContestTableProviderBase { + protected setFilterCondition(): (taskResult: TaskResult) => boolean { + return (taskResult: TaskResult) => { + if (classifyContest(taskResult.contest_id) !== this.contestType) { + return false; + } + + const contestRound = parseContestRound(taskResult.contest_id, 'arc'); + return contestRound >= 58 && contestRound <= 103; + }; + } + + getMetadata(): ContestTableMetaData { + return { + title: 'AtCoder Regular Contest 058 〜 103(ABC 同時開催)', + abbreviationName: 'fromArc058ToArc103', + }; + } + + getDisplayConfig(): ContestTableDisplayConfig { + return { + isShownHeader: true, + isShownRoundLabel: true, + tableBodyCellsWidth: 'w-1/2 md:w-1/3 lg:w-1/4 px-1 py-1', + roundLabelWidth: 'xl:w-16', + isShownTaskIndex: false, + }; + } + + getContestRoundLabel(contestId: string): string { + const contestNameLabel = getContestNameLabel(contestId); + return contestNameLabel.replace('ARC ', ''); + } +} + // AGC001 〜 (2016/07/16 〜 ) // 4 〜 7 tasks per contest export class AGC001OnwardsProvider extends ContestTableProviderBase { @@ -763,6 +845,15 @@ export const prepareContestProviderPresets = () => { ariaLabel: 'Filter contests from ABC 126 to ABC 211', }).addProvider(new ABC126ToABC211Provider(ContestType.ABC)), + /** + * Single group for ABC 042-125 + */ + ABC042ToABC125: () => + new ContestTableProviderGroup(`From ABC 042 to ABC 125`, { + buttonLabel: 'ABC 042 〜 125', + ariaLabel: 'Filter contests from ABC 042 to ABC 125', + }).addProvider(new ABC042ToABC125Provider(ContestType.ABC)), + /** * Single group for ARC 104 onwards */ @@ -772,6 +863,15 @@ export const prepareContestProviderPresets = () => { ariaLabel: 'Filter contests from ARC 104 onwards', }).addProvider(new ARC104OnwardsProvider(ContestType.ARC)), + /** + * Single group for ARC 058-103 + */ + ARC058ToARC103Provider: () => + new ContestTableProviderGroup(`ARC 058 To ARC 103`, { + buttonLabel: 'ARC 058 〜 103', + ariaLabel: 'Filter contests from ARC 058 to ARC 103', + }).addProvider(new ARC058ToARC103Provider(ContestType.ARC)), + /** * Single group for AGC 001 onwards */ @@ -840,7 +940,9 @@ export const contestTableProviderGroups = { abc319Onwards: prepareContestProviderPresets().ABC319Onwards(), fromAbc212ToAbc318: prepareContestProviderPresets().ABC212ToABC318(), fromAbc126ToAbc211: prepareContestProviderPresets().ABC126ToABC211(), + fromAbc042ToAbc125: prepareContestProviderPresets().ABC042ToABC125(), arc104Onwards: prepareContestProviderPresets().ARC104Onwards(), + fromArc058ToArc103: prepareContestProviderPresets().ARC058ToARC103Provider(), agc001Onwards: prepareContestProviderPresets().AGC001Onwards(), typical90: prepareContestProviderPresets().Typical90(), tessokuBook: prepareContestProviderPresets().TessokuBook(), diff --git a/src/test/lib/utils/contest_table_provider.test.ts b/src/test/lib/utils/contest_table_provider.test.ts index 47d9b9d7d..84235a158 100644 --- a/src/test/lib/utils/contest_table_provider.test.ts +++ b/src/test/lib/utils/contest_table_provider.test.ts @@ -8,7 +8,9 @@ import { ABC319OnwardsProvider, ABC212ToABC318Provider, ABC126ToABC211Provider, + ABC042ToABC125Provider, ARC104OnwardsProvider, + ARC058ToARC103Provider, AGC001OnwardsProvider, EDPCProvider, TDPCProvider, @@ -387,6 +389,164 @@ describe('ContestTableProviderBase and implementations', () => { }); }); + // ABC042 to ABC125 only + describe('ABC 042 to ABC 125', () => { + test('expects to filter tasks within ABC042-125 range', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mixed = [ + { contest_id: 'abc041', task_id: 'abc041_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc125', task_id: 'abc125_a', task_table_index: 'A' }, + { contest_id: 'abc126', task_id: 'abc126_a', task_table_index: 'A' }, + ]; + + const filtered = provider.filter(mixed as TaskResults); + + expect(filtered).toHaveLength(2); + expect(filtered.map((task) => task.contest_id)).toEqual(['abc042', 'abc125']); + }); + + test('expects to filter only ABC-type contests', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mixed = [ + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + ]; + + const filtered = provider.filter(mixed as TaskResults); + + expect(filtered).toHaveLength(2); + expect(filtered[0].contest_id).toBe('abc042'); + expect(filtered[1].contest_id).toBe('abc042'); + }); + + test('expects to return correct metadata', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const metadata = provider.getMetadata(); + + expect(metadata.title).toBe('AtCoder Beginner Contest 042 〜 125(ARC 同時開催が大半)'); + expect(metadata.abbreviationName).toBe('fromAbc042ToAbc125'); + }); + + test('expects to return correct display config', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const config = provider.getDisplayConfig(); + + expect(config.isShownHeader).toBe(true); + expect(config.isShownRoundLabel).toBe(true); + expect(config.tableBodyCellsWidth).toBe('w-1/2 md:w-1/3 lg:w-1/4 px-1 py-1'); + expect(config.roundLabelWidth).toBe('xl:w-16'); + expect(config.isShownTaskIndex).toBe(false); + }); + + test('expects to format contest round label correctly', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + + expect(provider.getContestRoundLabel('abc042')).toBe('042'); + expect(provider.getContestRoundLabel('abc125')).toBe('125'); + }); + + test('expects to generate correct table structure', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mockTasks = [ + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'abc042_b', task_table_index: 'B' }, + { contest_id: 'abc042', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'abc042', task_id: 'arc058_b', task_table_index: 'D' }, + ]; + + const table = provider.generateTable(mockTasks as TaskResults); + + expect(table).toHaveProperty('abc042'); + expect(table.abc042).toHaveProperty('A'); + expect(table.abc042).toHaveProperty('B'); + expect(table.abc042).toHaveProperty('C'); + expect(table.abc042).toHaveProperty('D'); + }); + + test('expects to return correct round id', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mockTasks = [ + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc125', task_id: 'abc125_a', task_table_index: 'A' }, + ]; + const filtered = provider.filter(mockTasks as TaskResults); + const roundIds = provider.getContestRoundIds(filtered); + + expect(roundIds).toContain('abc042'); + expect(roundIds).toContain('abc125'); + }); + + test('expects to return correct header id metadata', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const metadata = provider.getMetadata(); + + expect(metadata.abbreviationName).toBe('fromAbc042ToAbc125'); + }); + + test('expects to handle empty input', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const table = provider.generateTable([] as TaskResults); + + expect(table).toEqual({}); + }); + + test('expects to exclude non-ABC contests even if in range', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mixed = [ + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc043', task_id: 'abc043_a', task_table_index: 'A' }, + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc059', task_id: 'arc059_a', task_table_index: 'C' }, + ]; + + const filtered = provider.filter(mixed as TaskResults); + + expect(filtered).toHaveLength(2); + expect(filtered.every((t) => t.contest_id.startsWith('abc'))).toBe(true); + }); + + test('expects to generate correct table structure with shared problems (ABC042 with ARC058)', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mockAbc042Tasks = [ + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'abc042_b', task_table_index: 'B' }, + { contest_id: 'abc042', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'abc042', task_id: 'arc058_b', task_table_index: 'D' }, + ]; + + const table = provider.generateTable(mockAbc042Tasks as TaskResults); + + expect(table).toHaveProperty('abc042'); + expect(table.abc042).toHaveProperty('A'); // only ABC + expect(table.abc042).toHaveProperty('B'); // only ABC + expect(table.abc042).toHaveProperty('C'); // shared problem (ARC side task_id) + expect(table.abc042).toHaveProperty('D'); // shared problem (ARC side task_id) + }); + + test('expects to handle both solo and concurrent contests correctly', () => { + const provider = new ABC042ToABC125Provider(ContestType.ABC); + const mixed = [ + // ABC042: Concurrent with ARC058 + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc042', task_id: 'arc058_a', task_table_index: 'C' }, + // ABC051: Single round without ARC + { contest_id: 'abc051', task_id: 'abc051_c', task_table_index: 'C' }, + { contest_id: 'abc051', task_id: 'abc051_d', task_table_index: 'D' }, + ]; + + const filtered = provider.filter(mixed as TaskResults); + const table = provider.generateTable(filtered); + + expect(table).toHaveProperty('abc042'); + expect(table).toHaveProperty('abc051'); + expect(table.abc042).toHaveProperty('C'); // shared problem + expect(table.abc051).toHaveProperty('C'); + expect(table.abc051).toHaveProperty('D'); + }); + }); + // ARC 104 Onwards only describe('ARC 104 Onwards', () => { test('expects to filter tasks to include only ARC104 and later', () => { @@ -534,6 +694,167 @@ describe('ContestTableProviderBase and implementations', () => { }); }); + // ARC058 to ARC103 only + describe('ARC 058 to ARC 103', () => { + test('expects to filter tasks within ARC058-103 range', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mixed = [ + { contest_id: 'arc057', task_id: 'arc057_a', task_table_index: 'A' }, + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc103', task_id: 'arc103_a', task_table_index: 'C' }, + { contest_id: 'arc104', task_id: 'arc104_a', task_table_index: 'A' }, + ]; + + const filtered = provider.filter(mixed as TaskResults); + + expect(filtered).toHaveLength(2); + expect(filtered.map((task) => task.contest_id)).toEqual(['arc058', 'arc103']); + }); + + test('expects to filter only ARC-type contests', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mixed = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_f', task_table_index: 'F' }, + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + ]; + + const filtered = provider.filter(mixed as TaskResults); + + expect(filtered).toHaveLength(2); + expect(filtered[0].contest_id).toBe('arc058'); + expect(filtered[1].contest_id).toBe('arc058'); + }); + + test('expects to return correct metadata', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const metadata = provider.getMetadata(); + + expect(metadata.title).toBe('AtCoder Regular Contest 058 〜 103(ABC 同時開催)'); + expect(metadata.abbreviationName).toBe('fromArc058ToArc103'); + }); + + test('expects to return correct display config', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const config = provider.getDisplayConfig(); + + expect(config.isShownHeader).toBe(true); + expect(config.isShownRoundLabel).toBe(true); + expect(config.tableBodyCellsWidth).toBe('w-1/2 md:w-1/3 lg:w-1/4 px-1 py-1'); + expect(config.roundLabelWidth).toBe('xl:w-16'); + expect(config.isShownTaskIndex).toBe(false); + }); + + test('expects to format contest round label correctly', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + + expect(provider.getContestRoundLabel('arc058')).toBe('058'); + expect(provider.getContestRoundLabel('arc103')).toBe('103'); + }); + + test('expects to generate correct table structure', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mockTasks = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_b', task_table_index: 'D' }, + { contest_id: 'arc058', task_id: 'arc058_c', task_table_index: 'E' }, + { contest_id: 'arc058', task_id: 'arc058_d', task_table_index: 'F' }, + ]; + + const table = provider.generateTable(mockTasks as TaskResults); + + expect(table).toHaveProperty('arc058'); + expect(table.arc058).toHaveProperty('C'); + expect(table.arc058).toHaveProperty('D'); + expect(table.arc058).toHaveProperty('E'); + expect(table.arc058).toHaveProperty('F'); + }); + + test('expects to return correct round ids', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mockTasks = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc103', task_id: 'arc103_a', task_table_index: 'C' }, + ]; + const filtered = provider.filter(mockTasks as TaskResults); + const roundIds = provider.getContestRoundIds(filtered); + + expect(roundIds).toContain('arc058'); + expect(roundIds).toContain('arc103'); + }); + + test('expects to return correct header id metadata', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const metadata = provider.getMetadata(); + + expect(metadata.abbreviationName).toBe('fromArc058ToArc103'); + }); + + test('expects to handle empty input', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const table = provider.generateTable([] as TaskResults); + + expect(table).toEqual({}); + }); + + test('expects to exclude non-ARC contests even if in range', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mixed = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc059', task_id: 'arc059_a', task_table_index: 'C' }, + { contest_id: 'abc042', task_id: 'abc042_a', task_table_index: 'A' }, + { contest_id: 'abc043', task_id: 'abc043_a', task_table_index: 'A' }, + ]; + + const filtered = provider.filter(mixed as TaskResults); + + expect(filtered).toHaveLength(2); + expect(filtered.every((task) => task.contest_id.startsWith('arc'))).toBe(true); + }); + + test('expects to generate correct table structure with shared and exclusive problems (ARC058)', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + const mockArc058Tasks = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_b', task_table_index: 'D' }, + { contest_id: 'arc058', task_id: 'arc058_c', task_table_index: 'E' }, + { contest_id: 'arc058', task_id: 'arc058_d', task_table_index: 'F' }, + ]; + + const table = provider.generateTable(mockArc058Tasks as TaskResults); + + expect(table).toHaveProperty('arc058'); + expect(table.arc058).toHaveProperty('C'); // shared problem (ABC side task_id) + expect(table.arc058).toHaveProperty('D'); // shared problem (ABC side task_id) + expect(table.arc058).toHaveProperty('E'); // only ARC + expect(table.arc058).toHaveProperty('F'); // only ARC + }); + + test('expects to correctly handle ARC58-103 where all rounds are concurrent with ABC', () => { + const provider = new ARC058ToARC103Provider(ContestType.ARC); + + // ARC058 (Concurrent with ABC042) + const arc058Tasks = [ + { contest_id: 'arc058', task_id: 'arc058_a', task_table_index: 'C' }, + { contest_id: 'arc058', task_id: 'arc058_b', task_table_index: 'D' }, + ]; + + // ARC060 (Concurrent with ABC044) + const arc060Tasks = [ + { contest_id: 'arc060', task_id: 'arc060_a', task_table_index: 'C' }, + { contest_id: 'arc060', task_id: 'arc060_b', task_table_index: 'D' }, + ]; + + const mixed = [...arc058Tasks, ...arc060Tasks]; + const filtered = provider.filter(mixed as TaskResults); + const table = provider.generateTable(filtered); + + expect(filtered).toHaveLength(4); + expect(table).toHaveProperty('arc058'); + expect(table).toHaveProperty('arc060'); + }); + }); + describe('AGC 001 Onwards', () => { test('expects to filter tasks to include only AGC001 and later', () => { const provider = new AGC001OnwardsProvider(ContestType.AGC); From 72d991c1ceec645bcaa7cbf8a2009fb1cbff432e Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Wed, 3 Dec 2025 12:25:38 +0000 Subject: [PATCH 2/3] chore: Fix naming inconsistency in preset key (#2836) --- src/lib/utils/contest_table_provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/utils/contest_table_provider.ts b/src/lib/utils/contest_table_provider.ts index b5e56abb7..7c4d13c7b 100644 --- a/src/lib/utils/contest_table_provider.ts +++ b/src/lib/utils/contest_table_provider.ts @@ -866,7 +866,7 @@ export const prepareContestProviderPresets = () => { /** * Single group for ARC 058-103 */ - ARC058ToARC103Provider: () => + ARC058ToARC103: () => new ContestTableProviderGroup(`ARC 058 To ARC 103`, { buttonLabel: 'ARC 058 〜 103', ariaLabel: 'Filter contests from ARC 058 to ARC 103', @@ -942,7 +942,7 @@ export const contestTableProviderGroups = { fromAbc126ToAbc211: prepareContestProviderPresets().ABC126ToABC211(), fromAbc042ToAbc125: prepareContestProviderPresets().ABC042ToABC125(), arc104Onwards: prepareContestProviderPresets().ARC104Onwards(), - fromArc058ToArc103: prepareContestProviderPresets().ARC058ToARC103Provider(), + fromArc058ToArc103: prepareContestProviderPresets().ARC058ToARC103(), agc001Onwards: prepareContestProviderPresets().AGC001Onwards(), typical90: prepareContestProviderPresets().Typical90(), tessokuBook: prepareContestProviderPresets().TessokuBook(), From 5890b0ca1b6e872bb807700fd5bddf618b219aa3 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Wed, 3 Dec 2025 12:33:34 +0000 Subject: [PATCH 3/3] chore: Fix typo (#2836) --- .../add_tests_for_contest_table_provider/plan.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/dev-notes/2025-12-03/add_tests_for_contest_table_provider/plan.md b/docs/dev-notes/2025-12-03/add_tests_for_contest_table_provider/plan.md index 2ea8434db..a458b7b28 100644 --- a/docs/dev-notes/2025-12-03/add_tests_for_contest_table_provider/plan.md +++ b/docs/dev-notes/2025-12-03/add_tests_for_contest_table_provider/plan.md @@ -170,8 +170,8 @@ test('expects to generate correct table structure', () => { test('expects to return correct round id', () => { const provider = new ABC042ToABC125Provider(ContestType.ABC); - expect(provider.getRoundId('abc042')).toBe('abc042'); - expect(provider.getRoundId('abc125')).toBe('abc125'); + expect(provider.getContestRoundIds('abc042')).toBe('abc042'); + expect(provider.getContestRoundIds('abc125')).toBe('abc125'); }); ``` @@ -181,7 +181,7 @@ test('expects to return correct round id', () => { test('expects to return correct header id', () => { const provider = new ABC042ToABC125Provider(ContestType.ABC); - expect(provider.getHeaderId()).toMatch(/fromAbc042ToAbc125/); + expect(provider.getHeaderIdsForTask()).toMatch(/fromAbc042ToAbc125/); }); ``` @@ -375,8 +375,8 @@ test('expects to generate correct table structure', () => { test('expects to return correct round id', () => { const provider = new ARC058ToARC103Provider(ContestType.ARC); - expect(provider.getRoundId('arc058')).toBe('arc058'); - expect(provider.getRoundId('arc103')).toBe('arc103'); + expect(provider.getContestRoundIds('arc058')).toBe('arc058'); + expect(provider.getContestRoundIds('arc103')).toBe('arc103'); }); ``` @@ -386,7 +386,7 @@ test('expects to return correct round id', () => { test('expects to return correct header id', () => { const provider = new ARC058ToARC103Provider(ContestType.ARC); - expect(provider.getHeaderId()).toMatch(/fromArc058ToArc103/); + expect(provider.getHeaderIdsForTask()).toMatch(/fromArc058ToArc103/); }); ```