From a51a6a0765ccdd77142d644d49db11896e240f18 Mon Sep 17 00:00:00 2001 From: kirameku26 Date: Sun, 14 Jun 2026 10:53:38 +0900 Subject: [PATCH 1/5] =?UTF-8?q?ADT=E3=81=AE=E3=83=9A=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=82=92=E3=83=86=E3=83=BC=E3=83=96=E3=83=AB=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/TablePage/index.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/atcoder-problems-frontend/src/pages/TablePage/index.tsx b/atcoder-problems-frontend/src/pages/TablePage/index.tsx index ddaf4a2f..df34207f 100644 --- a/atcoder-problems-frontend/src/pages/TablePage/index.tsx +++ b/atcoder-problems-frontend/src/pages/TablePage/index.tsx @@ -159,6 +159,21 @@ export const TablePage: React.FC = (props) => { selectedLanguages={selectedLanguages} userRatingInfo={userRatingInfo} /> + ) : activeTab === "ADT" ? ( + { + return /^adt_all/g.test(contest.id); + })} + title="AtCoder Daily Training" + contestToProblems={contestToProblems} + statusLabelMap={statusLabelMap} + showPenalties={showPenalties} + selectedLanguages={selectedLanguages} + userRatingInfo={userRatingInfo} + /> ) : ( Date: Sun, 14 Jun 2026 11:20:46 +0900 Subject: [PATCH 2/5] =?UTF-8?q?adt=5Ftop=E4=BB=A5=E5=A4=96=E3=81=AF?= =?UTF-8?q?=E5=85=A8=E3=81=A6=E8=A1=A8=E7=A4=BA=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atcoder-problems-frontend/src/pages/TablePage/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atcoder-problems-frontend/src/pages/TablePage/index.tsx b/atcoder-problems-frontend/src/pages/TablePage/index.tsx index df34207f..f4b798bc 100644 --- a/atcoder-problems-frontend/src/pages/TablePage/index.tsx +++ b/atcoder-problems-frontend/src/pages/TablePage/index.tsx @@ -165,7 +165,7 @@ export const TablePage: React.FC = (props) => { hideCompletedContest={hideCompletedContest} colorMode={colorMode} contests={filteredContests.filter((contest) => { - return /^adt_all/g.test(contest.id); + return /^adt_(?!top$)/g.test(contest.id); })} title="AtCoder Daily Training" contestToProblems={contestToProblems} From 362826d10b774aa71306dc1b9e354b9fd05f6224 Mon Sep 17 00:00:00 2001 From: kirameku26 Date: Sun, 14 Jun 2026 12:53:59 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=E3=81=A1=E3=82=87=E3=81=A3=E3=81=A8?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/TablePage/index.tsx | 18 +++--------------- .../src/utils/ContestClassifier.ts | 4 +++- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/atcoder-problems-frontend/src/pages/TablePage/index.tsx b/atcoder-problems-frontend/src/pages/TablePage/index.tsx index f4b798bc..62032e81 100644 --- a/atcoder-problems-frontend/src/pages/TablePage/index.tsx +++ b/atcoder-problems-frontend/src/pages/TablePage/index.tsx @@ -130,6 +130,7 @@ export const TablePage: React.FC = (props) => { "ARC", "AGC", "AWC", + "ADT", "ABC-Like", "ARC-Like", "AGC-Like", @@ -149,6 +150,8 @@ export const TablePage: React.FC = (props) => { ? "AtCoder Grand Contest" : activeTab === "AWC" ? "AtCoder Weekday Contest" + : activeTab === "ADT" + ? "AtCoder Daily Training" : activeTab === "PAST" ? "PAST" : `${activeTab} Contest` @@ -159,21 +162,6 @@ export const TablePage: React.FC = (props) => { selectedLanguages={selectedLanguages} userRatingInfo={userRatingInfo} /> - ) : activeTab === "ADT" ? ( - { - return /^adt_(?!top$)/g.test(contest.id); - })} - title="AtCoder Daily Training" - contestToProblems={contestToProblems} - statusLabelMap={statusLabelMap} - showPenalties={showPenalties} - selectedLanguages={selectedLanguages} - userRatingInfo={userRatingInfo} - /> ) : ( Date: Mon, 15 Jun 2026 20:02:00 +0900 Subject: [PATCH 4/5] =?UTF-8?q?eslint=E3=81=AB=E5=BC=95=E3=81=A3=E3=81=8B?= =?UTF-8?q?=E3=81=8B=E3=82=89=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atcoder-problems-frontend/src/utils/ContestClassifier.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/atcoder-problems-frontend/src/utils/ContestClassifier.ts b/atcoder-problems-frontend/src/utils/ContestClassifier.ts index 73077336..812847cb 100644 --- a/atcoder-problems-frontend/src/utils/ContestClassifier.ts +++ b/atcoder-problems-frontend/src/utils/ContestClassifier.ts @@ -61,9 +61,7 @@ export const classifyContest = ( if (/^awc\d{4}$/.exec(contest.id)) { return "AWC"; } - if ( - /^adt_/.exec(contest.id) && - !["adt_top"].includes(contest.id)) { + if (/^adt_/.exec(contest.id) && !["adt_top"].includes(contest.id)) { return "ADT"; } if ( From cc68323c897d3061378b352ac7194d9aae723284 Mon Sep 17 00:00:00 2001 From: kenkoooo Date: Tue, 16 Jun 2026 05:33:52 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20adt=5Ftop=20=E3=82=92=E3=82=B3?= =?UTF-8?q?=E3=83=B3=E3=83=86=E3=82=B9=E3=83=88=E4=B8=80=E8=A6=A7=E3=81=8B?= =?UTF-8?q?=E3=82=89=E5=AE=8C=E5=85=A8=E3=81=AB=E9=9D=9E=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADT のトップページ adt_top は実際の Daily Training ラウンドではないため、 ADT 分類から除外するだけでなく Other Contests にも表示されないよう、 TablePage の一覧から完全に除外する。 - isHiddenContest を ContestClassifier に追加し、分類と一覧フィルタの 両方で adt_top の判定を一元化 - classifyContest / isHiddenContest のテストを追加 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/pages/TablePage/index.tsx | 4 +++ .../src/utils/ContestClassifier.test.ts | 36 +++++++++++++++++++ .../src/utils/ContestClassifier.ts | 7 +++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/atcoder-problems-frontend/src/pages/TablePage/index.tsx b/atcoder-problems-frontend/src/pages/TablePage/index.tsx index 62032e81..297e3744 100644 --- a/atcoder-problems-frontend/src/pages/TablePage/index.tsx +++ b/atcoder-problems-frontend/src/pages/TablePage/index.tsx @@ -20,6 +20,7 @@ import { loggedInUserId } from "../../utils/UserState"; import { classifyContest, ContestCategory, + isHiddenContest, } from "../../utils/ContestClassifier"; import { getLikeContestCategory } from "../../utils/LikeContestUtils"; import { TableTabButtons } from "./TableTab"; @@ -87,6 +88,9 @@ export const TablePage: React.FC = (props) => { return []; } return contests.filter((contest) => { + if (isHiddenContest(contest)) { + return false; + } const contestType = classifyContest(contest); if (contestType === activeTab) { return true; diff --git a/atcoder-problems-frontend/src/utils/ContestClassifier.test.ts b/atcoder-problems-frontend/src/utils/ContestClassifier.test.ts index dcc86212..f9ec1b44 100644 --- a/atcoder-problems-frontend/src/utils/ContestClassifier.test.ts +++ b/atcoder-problems-frontend/src/utils/ContestClassifier.test.ts @@ -2,6 +2,7 @@ import Contest from "../interfaces/Contest"; import { isRatedContest, classifyContest, + isHiddenContest, ContestCategory, } from "./ContestClassifier"; @@ -63,6 +64,17 @@ describe("test function classifyContest", () => { expect(classifyContest(adtContest)).toBe("ADT" as ContestCategory); }); + it("when adt_top is not classified as ADT", () => { + const adtTopContest: Contest = { + duration_second: 0, + id: "adt_top", + rate_change: "-", + start_epoch_second: 0, + title: "AtCoder Daily Training", + }; + expect(classifyContest(adtTopContest)).not.toBe("ADT" as ContestCategory); + }); + it("when ABC-like", () => { const abcLikeContest: Contest = { duration_second: 6000, @@ -100,3 +112,27 @@ describe("test function classifyContest", () => { ); }); }); + +describe("test function isHiddenContest", () => { + it("when adt_top is hidden", () => { + const adtTopContest: Contest = { + duration_second: 0, + id: "adt_top", + rate_change: "-", + start_epoch_second: 0, + title: "AtCoder Daily Training", + }; + expect(isHiddenContest(adtTopContest)).toBe(true); + }); + + it("when a normal ADT contest is not hidden", () => { + const adtContest: Contest = { + duration_second: 6000, + id: "adt_all_20260612_2", + rate_change: "-", + start_epoch_second: 1781260800, + title: "AtCoder Daily Training 2026/06/12 All", + }; + expect(isHiddenContest(adtContest)).toBe(false); + }); +}); diff --git a/atcoder-problems-frontend/src/utils/ContestClassifier.ts b/atcoder-problems-frontend/src/utils/ContestClassifier.ts index 812847cb..ac7a1aaf 100644 --- a/atcoder-problems-frontend/src/utils/ContestClassifier.ts +++ b/atcoder-problems-frontend/src/utils/ContestClassifier.ts @@ -22,6 +22,11 @@ export type ContestCategory = typeof ContestCategories[number]; export const AGC_001_START = 1468670400; +// `adt_top` is the ADT top page, not an actual daily training round, so it +// should be hidden from contest listings. +export const isHiddenContest = (contest: Contest): boolean => + contest.id === "adt_top"; + export const isRatedContest = ( contest: Contest, problemCount: number @@ -61,7 +66,7 @@ export const classifyContest = ( if (/^awc\d{4}$/.exec(contest.id)) { return "AWC"; } - if (/^adt_/.exec(contest.id) && !["adt_top"].includes(contest.id)) { + if (/^adt_/.exec(contest.id) && !isHiddenContest(contest)) { return "ADT"; } if (