Topcoder Marathon Matchの始め方（最新版）




# 概要

日本のコンテストサイト、AtCoderの繁栄により日本の競技プログラミング界隈は盛り上がりを見せています。
一方で、人気の高いAlgorithm系のコンテストに対しMarathon系のコンテストはまだまだ人口が少ないのが現状です。
この要因として、

- マラソンの面白さがまだまだ伝わっていない
- 参加方法が分かりづらい

の2つが大きなものとして考えられると思います。
特に2019年はTopcoder Marathonのプラットフォームがごっそり変更され、以前に増して扱いがややこしく、既存の資料も参考にすることができません。
1つ目に関しては既に色々な方がマラソンの紹介記事を書いてくださっているので、この記事では2つ目の、MMの具体的な始め方について紹介します。

# 登録する

Topcoderのアカウントを持っていない方は、まず登録をしましょう。
[こちら](https://accounts.topcoder.com/member/registration)から指示の通りに登録すれば大丈夫です。
アカウントを持っている方は[こちら](https://accounts.topcoder.com/member)からログインします。

# コンテストに参加する

[こちら](https://www.topcoder.com/challenges?filter[tracks][data_science]=true)で現在行われている/これから予定されているコンテストを確認できます。
左のアイコンが「MM」であるコンテストがマラソンです。本記事の執筆時点で、「Marathon Match 112」が開催中なのでこちらをクリックします。
（たまたまこのコンテストが開催されているので以降この記事ではMM112に参加する想定で説明しますが、他のコンテストでも同様です。）
![mm112koko.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/6e322bc9-1042-20f6-39a7-0343a10785e7.png)
すると、このようなコンテストページに進みます。
![contestpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/2a131a4b-013b-7eea-b014-7d2f359aac9f.png)

見たままRegisterボタンを押すことでコンテストに参加できます。
なお、実際にはこの「参加」にはあまり意味はなく、何らかの提出をして初めてRatedのContestantとなります。

# 環境整備

できればUnix系が望ましいです。Windowsであれば、WSL等を使えばなんとかなります。ただ、以下では一応Windowsを想定した説明も加えます。
また、テスター（以下で説明）を動かすにはJavaの実行環境が必要です。これも入っていない場合はインストールしましょう。
WSLやJavaの導入方法に関しては本筋と外れてしまうのでGoogle先生に投げます。

コンテストに参加するにあたってはそのコンテストのディレクトリ/フォルダを作成することを推奨します。ここでは仮に「mm112」という名前で作成したことにします。

# 各種ツールをダウンロードする

コンテストページを下にスクロールすると、スコア算出方法など問題の概要が記載されています。
さらに下の方を見ると、ありがたいことに各言語でのサンプルコードが用意されています。
![sanplecodes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/e77a2e41-82e7-5142-925a-e836c1fc811e.png)

自分の使う言語のものを落として、mm112の中に保存しましょう。

また、その下にはテスター（ローカルで自分のプログラムのスコアを確認したり、ビジュアライズできるツール）が置いてあります。
こちらも同様にmm112へ保存します。
![tools.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/acd85de6-020e-59a9-50ac-f60a3fa773c2.png)


# サンプルコードを動かす

ここまで来ればMMへ参戦する準備は整いました。
まずは先ほど落としたサンプルコードを実際に動かしてみましょう。

もしC++を使っているのであれば、適当にコンパイルして実行ファイルを生成します。
そして、生成した実行ファイルを`a.out`とすると、`java -jar tester.jar -exec "./a.out" -seed 1`のように端末から入力して実行することでビジュアライザのウィンドウが表示されるはずです。
Windowsであれば`-exec "./a.out"`の代わりに`-exec "a.exe"`のようにすればよいでしょう。
![seed1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/80926d43-c102-8ef3-a2ee-3f9388ea8f3b.png)

画面の見方については特に説明しなくても分かるかと思います。右上にはこのケースのスコアが表示されています。（今回はスコアを最大化する問題なので、この"36"が大きくなるほど嬉しいです）

# 問題に取り組む

先ほど動かしたのは公式に提供されたサンプルコードです。大抵、正のスコアを出せる自明な貪欲法などが実装されています。
それでは自分でコードを改善してみましょう（もちろん、一から新しく作ってもよいです）。
Algoと違い、マラソンには「正解」はありません。
**ぼくのかんがえたさいきょうの解法**を思い思いに実装して点数を伸ばしていきましょう。

# 提出する

次に、コードを提出してみます。なお、最初にまずサンプルコードをそのまま提出してみる、というのも雰囲気を掴むにはありだと思います。

実行するコードのファイル名は予め指定されています。今回は`GlowingBacteria.xxx`とする必要があるようです。これはコンテストページのDETAILS下部、Submission Formatに指示されています。

![submissionformat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/cab59249-d9ce-940a-5b81-156a02eb2963.png)


`zip GlowingBacteria.zip -j GlowingBacteria.cpp`のようにコマンドを実行することで提出用のzipファイルを生成します。
Windowsであれば、対象ファイルを右クリックして「送る」から「圧縮（zip形式）フォルダー」を選べばよいです。

そして、コンテストページ右上のSubmitボタンを押すとこのような画面になるので、提出ファイルをアップロードします。
![submit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/a4449051-27f6-bd84-5edc-cd1b43950572.png)

I UNDERSTAND AND AGREEにチェックを入れてSubmitを押せば提出完了です。


# スコアの確認

提出すると、コンパイルが終了してジャッジ中であるという意味でスコアが1点と表示されます。
さらにしばらく待つと採点が完了し、順位表にスコアが反映されます。
早ければ10分程度、長いと数十分～1時間以上掛かるので、気長に待ちましょう。

![standings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/11b4ffcd-70fb-ec7a-a4e7-b39fe2f69cc9.png)

スコアが0になっていたり赤い×が表示されていたら、何か変なことをしています。

思うようにジャッジされず困った場合は公式Forum（コンテストページのCHALLENGE FORUMタブ）やTwitterで質問すれば優しい人が教えてくれるでしょう。
ただし、スコアが0や異常に低い場合は単に問題自体を勘違いしていたりプログラムにバグがある可能性が高いです。
そのような議論はAlgo同様にコンテスト期間中は**御法度**なので、実行時間もOKで手元のテスターではちゃんと点数が出ているのに提出するとなぜかどうしても0点になる、のような場合以外は頑張って自力解決しましょう。

以下の項で説明しているSubmission-Reviewを用いればデバッグし易いと思います。
もしシステム自体のバグが疑われる場合はForumで報告するとよいです（ジャッジシステムの方が壊れていることも結構あります……）。


# Submission-Reviewを確認する

最後に、提出したプログラムが正常にジャッジされているか、Exampleケースのスコアはどう出ているかなどを確認してみます。
コンテストトップページにSubmission-Reviewのリンクがあるので、こちらを開いてみます（だいぶ気づきにくいです）。
![submissionreview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/b3f3ecab-9e3a-263a-7f6e-9c8b3b7d89d6.png)

すると、このようにちょっと雰囲気の違うページに移ります。
Submissionsの右下の方の矢印ボタンを押すと今までの自分の提出が展開されます。
![reviewpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/47cbee4f-4335-db5b-beb7-230904f20a7d.png)

![reviewexpand.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/fed27df5-0f51-6bad-b9ee-04e0644621c5.png)

好きな提出をクリックすると、その提出の詳細が表示されます。
![reviewsenni.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/649dfa6e-1a7d-4963-5673-998f42d3f139.png)
（この項については終了後のコンテストを用いて説明しているので、コンテスト中の様子とは若干異なっていると思います）

この状態ではスコアが表示されていますが、次にArtifactsタブをクリックしてジャッジ結果のダウンロード用のページへ遷移します。
![artifacts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/9f94389c-132e-c693-ea82-49b4310eb9ed.png)

終了後のコンテストなので xxxxxxxx-system というファイルがありますが、コンテスト中はexampleとprovisionalのみが置いてあるはずです。
右のボタンを押して、exampleの結果をダウンロードします。zipファイルなので適当に解凍します。
output.txt、execution-xxxxxxxx.txt、error-xxxxxxxx.txtとありますが、output.txtを覗いてみます。
![outputtxt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386945/975b7b36-b348-07a7-5cab-aea032305b1f.png)

このように、Exampleケースのジャッジ結果を確認することができました。
実行時間も教えてくれるので、これを用いて時間調節も行えます。
残りの2ファイルにはあまり有益な情報はありませんが、正常にスコアが出ない場合などにエラーログを確認するのに使えます。

# おわりに

私達とマラソン沼に嵌って一緒に人生を終了させましょう！