はじめに
Codeforcesは世界最大級の競技プログラミングサイトです。
他ユーザと競い合えるオンラインコンテストが頻繁に開催されていて、その成績によってレート(各ユーザの強さを表す数値)が上下します。
私はアカウント作成したばかりのため、レート0からのスタートです。
私のアカウント情報ページはこちら。↓
さて今回、コンテストに3回だけ挑戦してみました。
レートは気にせず、Codeforcesの操作感をつかむことが目的です。
参加したコンテスト
Educational Codeforces Round 172
まず参加したのは Educational Codeforces Round 172 です。
名前に「Educational」と付いていて、これは教育的・基礎的な問題が多く出題されるコンテストのようです。「Round 172」なので、その第172回目だと思います。
Codeforcesのページには 2024/12/02 17:35 開始と記載されていましたが、これは現地時間(?)であり、日本時間に直すと 2024/12/02 23:35 開始でした。だいぶ深夜でした。
2時間かけて6問を解くという内容でしたが、私の実力的にも、深夜の眠さ的にも、今回はとりあえず最初の2問(A問題とB問題)だけ解きました。
Codeforces Round 991
続いて参加したのは Codeforces Round 991 です。
日本時間で言うと 2024/12/05 23:35 開始のコンテストでした。
これも、最初の2問(A問題とB問題)だけ解くことにしました。
Codeforces Round 1003
3回目の参加は Codeforces Round 1003 です。
日本時間で言うと 2025/02/09 23:35 開始のコンテストでした。
これについては、1問(A問題)だけ解いて終わりにしました。
注意したこと・活用したもの など
ここから先は、コンテストをやるにあたって私が個人的に注意したことや活用したものについて書きます。
ログイン方法
Codeforcesへのログイン方法は2つあり、ひとつはユーザー名(あるいはメールアドレス)とパスワードを使う方法、もうひとつはGoogleアカウントと連携させる方法です。
今回はGoogleアカウント連携を使ったのでラクラクでした。
カレンダー機能
日本のプログラミングコンテストサイトで有名な AtCoder は、毎週土曜日の21:00に初心者向けコンテストを開催することがほぼ定例化しています。そのおかげでAtCoderのユーザには「日々精進しながら1週間を過ごし、土曜日になったらコンテストで腕試しをする」の生活リズムができているように個人的には感じています(このリズムを作れることが、AtCoderのコンテストがユーザに広く浸透している要因のひとつである気がします)。
いっぽうCodeforcesのコンテストは、開催頻度は高い代わりに開催間隔が不定期な印象です。次のコンテストがいつなのか忘れがちになります(私が忘れっぽいだけかもしれませんが)。
それをカバーする手段のひとつとして、Codeforcesにはカレンダー画面があります。
これを見れば、コンテストや解説放送などの日程が一目で分かります。日時は日本時間で表示されているので分かりやすいです。
さらに、予定を自分のGoogleカレンダーに自動登録する機能も付いています。普段からGoogleカレンダーを活用している人には嬉しい機能ですね。
提出時のpackage文
Codeforcesのコンテストには好きなプログラミング言語で挑戦できます。
私はJavaを選んだため、問題を解く際はファイル「Main.java」にコードを記述して提出(アップロード)しました。
アップロード後もファイルを保存しておきたい私は、Main.java をパッケージで分類して管理しています(ファイルの1行目にpackage文を記述)。ところがpackage文を書いたままの Main.java をCodeforcesに提出するとランタイムエラーとなってしまいます。提出するときだけpackage文をいったん消すことでとりあえずエラーは回避できましたが、微妙に手間でした。
複数テストケース対応のコード
近年のAtCoderの問題や、paizaやTechFULなどといったプログラミング学習サービスの問題では、
- 入力を受け取り、正しい答えを出力する
というコードが要求されます。私が最も見慣れている形式です。
ところが偶然かもしれませんが、今回私が取り組んだCodeforcesの問題は全て、ひとつの入力データに複数のテストケースが含まれていました(これは日本情報オリンピックの過去問でもたまに見かける形式)。そのため、
- テストケースの個数 $N$ をまず受け取り、次に入力の受け取りを $N$ 回繰り返し、そして正しい答えの出力を $N$ 回繰り返す
というコードが要求されました。
これにより、私がCodeforcesに提出したコードは全て下記のような構造となっています。
import java.util.*;
public class Main {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
int n = Integer.parseInt(sc.next()); // テストケース数
List<String> answerList = new ArrayList<>();
while (n-- != 0) {
answerList.add(solve());
}
// 出力
for (String ans : answerList) {
System.out.println(ans);
}
}
private static String solve() {
// 入力
int a = Integer.parseInt(sc.next());
/* ここで問題を解くロジックをする */
// 答え
return "YES";
}
}
答えを求める関数 solve()
を n
回呼び、そのたびに答えをanswerList
に格納していって、あとでまとめて出力する流れです。
Codeforces Problems
Codeforces Problems という便利なサイトがあります。
Codeforcesのコンテストで過去に出題された問題(過去問)へのリンクがずらりと並んでいてすぐアクセスできるほか、
画面上部の「Codeforces ID」欄にユーザー名(私であれば tobi00604)を入力すると、その人の正解記録や詳細情報を閲覧することができます。
まだ正解したことのない問題を探して勉強したいとき、ライバルの進捗をこっそり確認したいとき、提出履歴を調べたいときなどに使えそうです。
おわりに
実際にコンテストに参加することで、Codeforcesの操作感や難易度を知ることができました。何事もそうですが、面白そうなサイトやツールはとりあえず試しに触ってみることが大切ですね。これで誰かから「Codeforcesってどうなの?」と訊かれても最低限のことは答えられそうです。
サイトが全て英語なのと、コンテスト開催日時が毎回深夜なのは、人によっては少々とっつきにくい点かもしれません。私の場合、眠くて頭が働かなかったです。
今回触らなかったCodeforcesの機能はまだまだたくさんあるようですし、大量の過去問はなにかコードを書きたいときの題材や学習の教材としても活用できそうです。
やるかどうかは未定ですが、これから本格的にCodeforcesをやっていく場合、まずレートが上下する仕組みを把握して、そしてコーディングの環境やツールを整えてから取り組みたいなと思いました。
以上です。