TopCoderをはじめよう！(2022年版) Python/C++対応版


# はじめに
競技プログラミングをはじめると多くの本やWebサイトで名前を見かけるTopCoderはシステムと問題文の癖が強く、試しに過去問を1問submitするのも敷居が高いです。この記事で紹介するのは以下の3点です。

- 1. ArenaにJava版を使ってアクセスする。このためのJavaの準備。
- 2. SRM過去問へのアクセスとsubmitをして、システムテストを行う。
- 3. Arenaで"Editor"の設定をする。

# (Python) はじめに: Python2.7をインストールする
<b><font color="red">TopCoderのPythonのバージョンは2.7です．以降の手順に進む前に必ずPython2.7をインストールしましょう．</font></b>

# (C++) はじめに: C++11であることに注意する
<b><font color="red">TopCoderのC++は(ほぼ)C++11です。</font></b>
以下のように、2021年2月現在、SRMのCコンパイラは4.8.1です。C++14,17は以下のGNUCバージョンからサポートされています。

- C++14: GNUC 4.9以上。一部の機能は4.8以下で実装されているが使えない機能が多い。
- C++17: GNUC 5.0.0以上からサポート

このため、TopCoderの環境はC++11だと思うのがよさそうです。詳しくは以下を参照してください。
https://cpprefjp.github.io/implementation-status.html#cpp14

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/a4471032-9f74-78e5-d861-e6f7a5f60cf6.png)

# (C++/Python共通)Java版でArenaにアクセスする．

TopCoderでSRMに参加するにはArenaと呼ばれるSRM専用のコンテストシステムにアクセスする必要があります。

アカウントの作成は省略します。このページにアクセスした方の中にはTopCoderの"Community -> Compete -> Competitive Programming" からArena Web版と呼ばれるツールにアクセスしたことがある方も多いと思います。しかし，Web版は動作が遅く，また過去問へのアクセス性もとても悪く非常に使いにくいです(2020/8現在)
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/c230d3a2-d266-44bc-6a65-31a2e48ff5d0.png">

そこでJavaアプレット版のArenaを使います。Java版Arenaインストールは以下のURLに従って行います。
https://www.topcoder.com/community/arena?ref=navb

- [Java JRE](http://java.com/en/download/index.jsp)をインストールします．設定の変更は不要です。(注意:かつてはJavaのセキュリティ設定変更が必要でしたが[この記事](https://stackoverflow.com/questions/43016220/java8u121-unable-open-topcoder-arena)の通り、最新のアプレットでこの変更は不要です)

- 先ほどのページから[TopCoderのJavaアプレットへのリンク](https://www.topcoder.com/contest/arena/ContestAppletProd7.2.jnlp)にアクセスします．このアプレットは保存しておき，デスクトップなどに置いておくことも可能です．ただし、Appletが更新されることもあると思うのでリンクのほうが好ましいのかもしれません。

- TopCoderのユーザ名とパスワードを入力しログインします．
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/daeeebf1-08f2-653e-0ed5-711e0b22886d.png">

# (C++/Python共通) Arenaの使い方: 過去問題にアクセスしてSubmitの流れ
TopCoderは他のコンテストサイトと比べて特異なインタフェースを持ちます。過去問題へのCommitを通して流れを確認します。

- ArenaのPractice Room -> SRMsから見たい過去問題を選択します<br>
<font color="red">コンテストが始まる数時間前は，一時的にSRMの過去問へのアクセスができません．コンテスト終了後に試しましょう．</font>
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/1a654ec5-b39a-0d84-d33b-584a944abe68.png">

- SRMは基本的に3問構成です．`Coding Phase`からアクセスしたい問題を選択します．
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/3386bbd1-c434-e4d5-cb07-e9e1cfeb2456.png">

- 問題が出るので解きます.
- コードを書いたら，`Compile -> Batch Test -> Submit`の順で実行します．(PythonでもCompileは必要です)
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/7bb313aa-87da-b47c-62ec-5a5f8e7e79c2.png">

- Submitし，TestにPASSすると以下のような表示になり，ポイントが付与されます．しかし，で終わってはいけません．これは提出が終わった，というだけで，各BatchTestが通ったかは確認しませんし，Codeforcesと違って，もう少し強いpre-testが行われるわけではありません．
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/fb743b7c-61e8-70ca-b79e-e47978164b54.png">

- 一度，このウィンドウを閉じ，SRMのトップ画面に遷移し，`Practice Option -> Run System Test`を選択します．
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/8a64ce0c-cc09-b366-6355-29e0fe78f7c4.png">

- 結果を確認します．例では，2つのSystemテストに失敗しました．ダブルクリックするとinput/outputが確認できます．
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/749b0189-40ca-a53b-2b84-e9a4f16bac68.png">



# (C++/Python共通)Editorをgreedに設定する
- [githubのGreedのページ](https://github.com/zen0wu/topcoder-greed)にアクセスします．Quick Startの通りですが，以下説明します．

- このページのDownloadsから[2.0RC](https://github.com/shivawu/topcoder-greed/releases/download/2.0-RC/Greed-2.0-RC-7.1.0.jar)のjarをダウンロードし適当なディレクトリに入れます．

- Arenaのログイン後のロビーページで`Options -> Editor -> Add`を選択します．次の通り入力します．(ClassPathはBrowseをクリックして，2でダウンロードしたjarを選択します)
<img size=50% src=https://github.com/shivawu/topcoder-greed/wiki/images/Add-Plugin.png> (githubより転載)

- DefaultとAt Startupにチェックを入れます．続けて，Configureを選択します．
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/8385c64a-165e-1cdc-3530-2d7df66f82be.png">

- ここで，問題のテンプレートが作成される親ディレクトリをフルパスで入れます．
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/c6f814be-255f-f896-6660-b9f3582c9fbb.png">

- 後の工程で問題にアクセスすると，このディレクトリに，SRMごとのディレクトリが下の図のように切られます．
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/75af1916-26b5-9858-eb06-e37f178d1abc.png">

# (Python/C++共通) Python か C++ かの設定
<font color="red">この設定は初回のみ必要です。</font>
問題を開いたら、以下の画面で、C++かPython(2.7)かのラジオボックスを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/4a4d50b5-06d3-beb9-5cd7-b8a8234e5d00.png)

# (Python/C++共通)実際に問題を解く
<font color="red">以下、拡張子がpyなところをcppに読み替えれば C++でも一緒です</font>

- Greedの導入が終わったら、先ほど解説したSRMの問題を開きます．すると，先ほどまで画面下部にテキストエディタが表示されていましたが，以下の通りとなり，コードを入力することが出来なくなっています．
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/76810b1e-d0f5-0e89-aebe-dfd98cacf59d.png">

- この状態で，`項番5`で指定したフォルダを開くと，(この問題の場合は)`Scissors.py`と`Scissors.html`が作成されています．Arenaの説明文は見ずにこちらのHTMLを問題文として参照します．
一覧性が段違いですし，一気にコピーアンドペーストできるので，全文を機械翻訳に突っ込むときにも便利です．
- 作成されたpyにはテストが含まれています．今回の場合は以下の部分の`return 0`を要件に合うようにコーディングしていきます．

```Python
class Scissors:
    def openingTime(self, N):
        return 0
(以下は自動生成されたコード)
```

- <b><font color="red">Pythonの人はPython2.7, C++の人はC++11であることを注意して</font></b>実行します．以下のようにPASS/FAILが表示されます．すべてPASSになるまでコードを直しましょう．

```
  Testcase #0 ... PASSED! (0.000 seconds)
  Testcase #1 ... FAILED! (0.000 seconds)
           Expected: 40
           Received: 20
  Testcase #2 ... FAILED! (0.000 seconds)
           Expected: 110
           Received: 20
Passed : 1 / 3 cases
```
- すべてPASSするようになったら，その状態(ソースコードが保存されている状態)で`Compile -> Batch Test -> Submit`をします．Compileを実行すると，`Getting source code from SRM ～`といってソースコードを取得していることが分かります．(内部的には# CUT beginまでのソースコードが渡されています)

<font color="red"><b>【超重要】Success: True と出ていますが、見るべきは"Correct example"です。これがTrueなことを確認しましょう。</b></font>

<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/11fe3ae0-eef0-23ac-07d2-bd4aaad2724f.png">


# FAQ: サンプルしかジャッジされない！　（再掲:システムテストの仕方）
<font color=red>まず、コンテストの直前や直後は以下のUIが存在しないことがあります。コンテストが行われていない時間にアクセスしましょう。</font>
なんでシステムテストがこんなにわかりにくい場所に・・と思いますよね。Practice Options -> Run System Testします。めでたく、すべて通っていればOKです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/46c3a59a-6152-c01e-dfa3-5cebe3520294.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/3d50fc9c-b818-786b-ac76-27b842f9464c.png)

# FAQ: どうしてもアプレットの起動ができない！(Java キャッシュクリア)
ダウンロードしたアプレットが壊れているかもしれません。Windowsの場合、コントロールパネルのJavaの設定から、
0. Appletを終了します。
1. まず、【一般】タブ -> 【インターネット一時ファイル】の【表示】-> TopCoderアプリを選んで【選択された項目を削除】します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/cb4c344c-bda7-0c89-02c5-62077cdb5252.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/c97b58b5-297d-946f-1a5a-ac5defb03e07.png)
2. 次に、同じく【インターネット一時ファイル】の【表示】から【ファイルの削除】を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/f7c43df5-2078-2f97-4f5e-5ec0d0d4715d.png)
3. Appletを再度起動します！



<b>gl, hf!</b>

# その他情報
- テンプレートを変える日本語の記事: https://minus9d.hatenablog.com/entry/2019/05/01/222914