Skip to content

Commit cb97219

Browse files
committed
fix: getRatedTarget を rate_change の "-" 区切りに対応
AtCoder がレーティング対象範囲表記の区切りを "~" から "-" へ変更したため (例: " - 1999", "2000 -", "1200 - 2799")、"~" のみで split していた getRatedTarget では新形式のコンテストがすべて Unrated 扱いになり、 コンテスト名横の色ドットや「Other Rated」系コンテストの ABC-Like / ARC-Like / AGC-Like 分類が正しく行われていなかった。 両方の区切り文字を受け付けるよう変更し、テストを追加した。 https://claude.ai/code/session_01Hsq4dCo1x9ve8W8inoWxe2
1 parent 7b3c901 commit cb97219

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

atcoder-problems-frontend/src/components/ContestLink.test.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,30 @@ describe("Infer rating change of contests", () => {
5151

5252
expect(getRatedTarget(contest)).toBe(RatedTargetType.All);
5353
});
54+
it("ARC level (hyphen separator)", () => {
55+
const contest = {
56+
...DEFAULT_CONTEST,
57+
rate_change: "1200 - 2799",
58+
};
59+
60+
expect(getRatedTarget(contest)).toBe(2799);
61+
});
62+
it("new ABC level (hyphen separator)", () => {
63+
const contest = {
64+
...DEFAULT_CONTEST,
65+
rate_change: " - 1999",
66+
};
67+
68+
expect(getRatedTarget(contest)).toBe(1999);
69+
});
70+
it("new AGC level (hyphen separator)", () => {
71+
const contest = {
72+
...DEFAULT_CONTEST,
73+
rate_change: "2000 -",
74+
};
75+
76+
expect(getRatedTarget(contest)).toBe(RatedTargetType.All);
77+
});
5478
it("buggy unrated", () => {
5579
const contest = {
5680
...DEFAULT_CONTEST,

atcoder-problems-frontend/src/components/ContestLink.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ export function getRatedTarget(contest: Contest): RatedTarget {
2929
case "All":
3030
return RatedTargetType.All;
3131
default: {
32-
const range = contest.rate_change.split("~").map((r) => r.trim());
32+
// AtCoder switched the rated-range separator from "~" (e.g. " ~ 1999",
33+
// "1200 ~") to "-" (e.g. " - 1999", "2000 -") in late 2025, so accept
34+
// both. The unrated "-" is already handled by the case above.
35+
const range = contest.rate_change.split(/[-~]/).map((r) => r.trim());
3336
if (range.length !== 2) {
3437
return RatedTargetType.Unrated;
3538
}

0 commit comments

Comments
 (0)