From c987f30a52518e68a30775644b394b6697b0927a Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Sat, 7 Mar 2026 13:00:34 +0000 Subject: [PATCH 1/5] docs: Add plan (#3239) --- .../dev-notes/2026-03-07/add-atc-to-contests/plan.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md diff --git a/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md b/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md new file mode 100644 index 000000000..339a69451 --- /dev/null +++ b/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md @@ -0,0 +1,12 @@ +# atc001 (AtCoder Typical Contest 001) の追加 (Issue #3239) + +[Issue #3239](https://github.com/AtCoder-NoviSteps/AtCoderNoviSteps/issues/3239) で、`atc001` の DFS 問題を追加。`ATCODER_OTHERS` にプレフィックス `atc001` を1件追記するだけで、Prismaスキーマ変更・コンテストテーブルプロバイダー追加は不要。 + +## 変更内容 + +- `src/lib/utils/contest.ts`: `ATCODER_OTHERS` に `atc001: 'AtCoder Typical Contest 001'` を追加 +- `src/test/lib/utils/test_cases/contest_type.ts`: `atCoderOthers` に `atc001` のテストケースを追加 + +## 注意事項 + +プレフィックスは `atc` ではなく `atc001` を使用(`atc` だと将来的に意図しないIDにマッチする可能性があるため)。`startsWith('atc001')` は `atc001` のみにマッチし、`atc002` などには別途エントリが必要。 From be29e984de75be759e21ed0ccff665665da626eb Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Sat, 7 Mar 2026 13:03:19 +0000 Subject: [PATCH 2/5] docs: Update plan (#3239) --- .../2026-03-07/add-atc-to-contests/plan.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md b/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md index 339a69451..df785e568 100644 --- a/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md +++ b/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md @@ -4,9 +4,18 @@ ## 変更内容 -- `src/lib/utils/contest.ts`: `ATCODER_OTHERS` に `atc001: 'AtCoder Typical Contest 001'` を追加 -- `src/test/lib/utils/test_cases/contest_type.ts`: `atCoderOthers` に `atc001` のテストケースを追加 +### `src/lib/utils/contest.ts` +- `ATCODER_OTHERS` に `atc001: 'AtCoder Typical Contest 001'` を追加 + +### `src/test/lib/utils/test_cases/contest_type.ts` +- `atCoderOthers` 配列に `atc001` → `ContestType.OTHERS` のテストケースを追加 + +### `src/test/lib/utils/test_cases/contest_name_labels.ts` +- `atCoderOthers` 配列に `atc001` → `'ATC001'` のテストケースを追加 + - `getContestNameLabel` は `atc` 用の特殊処理がないため、デフォルトの `contestId.toUpperCase()` で `ATC001` を返す ## 注意事項 -プレフィックスは `atc` ではなく `atc001` を使用(`atc` だと将来的に意図しないIDにマッチする可能性があるため)。`startsWith('atc001')` は `atc001` のみにマッチし、`atc002` などには別途エントリが必要。 +- プレフィックスは `atc` ではなく `atc001` を使用(`atc` だと将来的に意図しないIDにマッチする可能性があるため) +- `startsWith('atc001')` は `atc001` のみにマッチし、`atc002` などには別途エントリが必要 +- `getContestNameLabel` への追加は不要(`ATC001` のデフォルト表示で問題ない場合) From 57d33bed177a0e0e65fc7f59ab1e7f207741d1e1 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Sat, 7 Mar 2026 13:21:54 +0000 Subject: [PATCH 3/5] feat: Add tasks for ATC (#3239) --- .../2026-03-07/add-atc-to-contests/plan.md | 19 +++++++++++++++++++ src/lib/utils/contest.ts | 5 ++++- .../utils/test_cases/contest_name_labels.ts | 4 ++++ src/test/lib/utils/test_cases/contest_type.ts | 4 ++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md b/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md index df785e568..83bb85f29 100644 --- a/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md +++ b/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md @@ -5,12 +5,15 @@ ## 変更内容 ### `src/lib/utils/contest.ts` + - `ATCODER_OTHERS` に `atc001: 'AtCoder Typical Contest 001'` を追加 ### `src/test/lib/utils/test_cases/contest_type.ts` + - `atCoderOthers` 配列に `atc001` → `ContestType.OTHERS` のテストケースを追加 ### `src/test/lib/utils/test_cases/contest_name_labels.ts` + - `atCoderOthers` 配列に `atc001` → `'ATC001'` のテストケースを追加 - `getContestNameLabel` は `atc` 用の特殊処理がないため、デフォルトの `contestId.toUpperCase()` で `ATC001` を返す @@ -19,3 +22,19 @@ - プレフィックスは `atc` ではなく `atc001` を使用(`atc` だと将来的に意図しないIDにマッチする可能性があるため) - `startsWith('atc001')` は `atc001` のみにマッチし、`atc002` などには別途エントリが必要 - `getContestNameLabel` への追加は不要(`ATC001` のデフォルト表示で問題ない場合) + +## 追加修正: getContestNameLabel で ATC 001 形式を返す + +テストが期待する `'ATC 001'`(スペースあり)に合わせ、`getContestNameLabel` に `atc` プレフィックスの処理を追加する。 + +### `src/lib/utils/contest.ts` + +- `regexForAxc` のパターンに `atc` を追加(`/^(abc|arc|agc|atc)(\d{3})/i`) +- これにより `atc001` → `ATC 001` が返るようになる + +## 実装後の教訓 + +- Prettier が `ATCODER_OTHERS` のキー順序をアルファベット順に並べ替えた(`atc001` が先頭付近に移動)。キー順序に意味がある場合はコメントで明示すること。 +- `src/test/lib/common/test_helpers.test.ts` の `expects to handle large arrays efficiently` はタイミング依存のフレイキーなテスト(本変更とは無関係)。CI で稀に失敗する場合は無視してよい。 +- ラベル表記(`ATC001` vs `ATC 001`)はテストが正の仕様源。実装前にテストで期待値を確認してから実装すること。 +- `regexForAxc` に `atc` を追加するだけで `getContestNameLabel` の対応が完了する(既存の `ABC NNN` 形式と同じフォーマット)。 diff --git a/src/lib/utils/contest.ts b/src/lib/utils/contest.ts index 74319b8e1..44dd699a3 100644 --- a/src/lib/utils/contest.ts +++ b/src/lib/utils/contest.ts @@ -193,6 +193,7 @@ const atCoderUniversityPrefixes = getContestPrefixes(ATCODER_UNIVERSITIES); */ const ATCODER_OTHERS: ContestPrefix = { chokudai_S: 'Chokudai SpeedRun', + atc001: 'AtCoder Typical Contest 001', 'code-festival-2014-quala': 'Code Festival 2014 予選 A', 'code-festival-2014-qualb': 'Code Festival 2014 予選 B', 'code-festival-2014-final': 'Code Festival 2014 決勝', @@ -313,15 +314,17 @@ export function getContestPriority(contestId: string): number { * - "abc376" * - "ARC128" * - "agc045" + * - "atc001" * - "awc0001" * * Example non-matches: * - "xyz123" * - "abc12" * - "abc1234" + * - "atc1234" * - "awc12345" */ -const regexForAxc = /^(abc|arc|agc)(\d{3})/i; +const regexForAxc = /^(abc|arc|agc|atc)(\d{3})/i; const regexForAwc = /^(awc)(\d{4})/i; /** diff --git a/src/test/lib/utils/test_cases/contest_name_labels.ts b/src/test/lib/utils/test_cases/contest_name_labels.ts index 89a6d32d4..6abe638ba 100644 --- a/src/test/lib/utils/test_cases/contest_name_labels.ts +++ b/src/test/lib/utils/test_cases/contest_name_labels.ts @@ -37,6 +37,10 @@ export const atCoderOthers = [ contestId: 'chokudai_S002', expected: 'Chokudai SpeedRun 002', }), + createTestCaseForContestNameLabel('AtCoder Typical Contest 001')({ + contestId: 'atc001', + expected: 'ATC 001', + }), ]; export const mathAndAlgorithm = [ diff --git a/src/test/lib/utils/test_cases/contest_type.ts b/src/test/lib/utils/test_cases/contest_type.ts index d5b628350..53283c55c 100644 --- a/src/test/lib/utils/test_cases/contest_type.ts +++ b/src/test/lib/utils/test_cases/contest_type.ts @@ -398,6 +398,10 @@ export const atCoderOthers = [ contestId: 'chokudai_S002', expected: ContestType.OTHERS, }), + createTestCaseForContestType('AtCoder Typical Contest 001')({ + contestId: 'atc001', + expected: ContestType.OTHERS, + }), createTestCaseForContestType('CODE FESTIVAL 2014 qual A')({ contestId: 'code-festival-2014-quala', expected: ContestType.OTHERS, From a818766ed2a594481f7105b2b4c35ef8078571e9 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Sat, 7 Mar 2026 13:22:53 +0000 Subject: [PATCH 4/5] refactor: Remove old plan (#3239) --- .../2026-03-07/add-atc-to-contests/plan.md | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md diff --git a/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md b/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md deleted file mode 100644 index 83bb85f29..000000000 --- a/docs/dev-notes/2026-03-07/add-atc-to-contests/plan.md +++ /dev/null @@ -1,40 +0,0 @@ -# atc001 (AtCoder Typical Contest 001) の追加 (Issue #3239) - -[Issue #3239](https://github.com/AtCoder-NoviSteps/AtCoderNoviSteps/issues/3239) で、`atc001` の DFS 問題を追加。`ATCODER_OTHERS` にプレフィックス `atc001` を1件追記するだけで、Prismaスキーマ変更・コンテストテーブルプロバイダー追加は不要。 - -## 変更内容 - -### `src/lib/utils/contest.ts` - -- `ATCODER_OTHERS` に `atc001: 'AtCoder Typical Contest 001'` を追加 - -### `src/test/lib/utils/test_cases/contest_type.ts` - -- `atCoderOthers` 配列に `atc001` → `ContestType.OTHERS` のテストケースを追加 - -### `src/test/lib/utils/test_cases/contest_name_labels.ts` - -- `atCoderOthers` 配列に `atc001` → `'ATC001'` のテストケースを追加 - - `getContestNameLabel` は `atc` 用の特殊処理がないため、デフォルトの `contestId.toUpperCase()` で `ATC001` を返す - -## 注意事項 - -- プレフィックスは `atc` ではなく `atc001` を使用(`atc` だと将来的に意図しないIDにマッチする可能性があるため) -- `startsWith('atc001')` は `atc001` のみにマッチし、`atc002` などには別途エントリが必要 -- `getContestNameLabel` への追加は不要(`ATC001` のデフォルト表示で問題ない場合) - -## 追加修正: getContestNameLabel で ATC 001 形式を返す - -テストが期待する `'ATC 001'`(スペースあり)に合わせ、`getContestNameLabel` に `atc` プレフィックスの処理を追加する。 - -### `src/lib/utils/contest.ts` - -- `regexForAxc` のパターンに `atc` を追加(`/^(abc|arc|agc|atc)(\d{3})/i`) -- これにより `atc001` → `ATC 001` が返るようになる - -## 実装後の教訓 - -- Prettier が `ATCODER_OTHERS` のキー順序をアルファベット順に並べ替えた(`atc001` が先頭付近に移動)。キー順序に意味がある場合はコメントで明示すること。 -- `src/test/lib/common/test_helpers.test.ts` の `expects to handle large arrays efficiently` はタイミング依存のフレイキーなテスト(本変更とは無関係)。CI で稀に失敗する場合は無視してよい。 -- ラベル表記(`ATC001` vs `ATC 001`)はテストが正の仕様源。実装前にテストで期待値を確認してから実装すること。 -- `regexForAxc` に `atc` を追加するだけで `getContestNameLabel` の対応が完了する(既存の `ABC NNN` 形式と同じフォーマット)。 From 19c9c7e8eac4274de6bd4e1684fa2a33d0d6bad2 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Sat, 7 Mar 2026 13:35:49 +0000 Subject: [PATCH 5/5] fix: Keep ATC label parsing and classification in sync (#3239) --- src/lib/utils/contest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/utils/contest.ts b/src/lib/utils/contest.ts index 44dd699a3..01f4fc6ee 100644 --- a/src/lib/utils/contest.ts +++ b/src/lib/utils/contest.ts @@ -324,8 +324,8 @@ export function getContestPriority(contestId: string): number { * - "atc1234" * - "awc12345" */ -const regexForAxc = /^(abc|arc|agc|atc)(\d{3})/i; -const regexForAwc = /^(awc)(\d{4})/i; +const regexForAxc = /^(abc|arc|agc|atc)(\d{3})$/i; +const regexForAwc = /^(awc)(\d{4})$/i; /** * Regular expression to match AtCoder University contest identifiers.