Clash of Codeへの誘い

# 0.はじめに

こんにちは、中学3年生のsoraieです。
競技プログラミングをしていて[AtCoder](https://atcoder.jp/user/soraie)青だったりします。
記事で分からないことや不備などがあれば[Twitter](https://twitter.com/soraie_)で教えてください。

この記事では `CodinGame` というサイトの `Clash of Code` というコンテンツの楽しさを知ってもらい、皆さんに「始めたい」と思ってもらうのが目的です。

# きっかけ

上でも書いた `CodinGame` というサイトの `Clash of Code` というコンテンツで日本一位をとりました。

![Japan champion](https://user-images.githubusercontent.com/66059019/114856245-d9cafb80-9e21-11eb-9ecd-cdb81c1016b7.png)  

今は結構抜かされて転落してしまっていますが、一瞬でも1位になることができてとても嬉しかったので `Clash of Code` の楽しさを共有したいと思い、この記事を書くことにしました。

# 目次

|章|タイトル|
|-|-|
|0|[はじめに](#0はじめに)|
|1|[CodinGameとは？](#1-codingameとは)|
|2|[Clash of Codeとは？](#2-clash-of-codeとは)|
|3|[Clash of Code を始めよう！](#3-clash-of-code-を始めよう)|
|4|[おわりに](#4-おわりに)|

# 1. CodinGameとは？

`CodinGame` は  `AtCoder` `Codeforces` などのサイトのように出された問題を解くプログラムを作って他の人と競ったり、問題を解きながら技術を向上させることができるサイトです。たまに大規模な大会も開かれています。

問題はいくつかの分野に分かれていて具体的には

- AIを作って他人のものと競う `BOT programing`
- アルゴリズムを使って問題を解く `ALGORITHMS`
- 簡単な問題をルールに沿って解いて他人と競う `Clash of Code`

などがあります。

### BOT programing
`BOT programing` はこの中で一番人気のあるコンテンツだと思います。自分の作ったAIが他の人と競い合うのを見るのはとても面白いです。大会が開かれるとき、問題は `BOT programing` であることが多い気がします。
とても楽しいのですがかなり奥が深く、ここの記事に書こうとすると文が長くなりすぎてしまうことや、僕自身あまり詳しくないこともあるので、ここでは他の方の記事へのリンクを貼っておきます。

- [【CodinGame】ブラウザでコーディングの基礎からトレーニングできるサイト (疑似ゲーム開発環境を使って学べます。解答は25種類のプログラミング言語から選択して記述可能！)](https://qiita.com/javacommons/items/86efba2d0ce6b2a21fb9)
- [CodinGame はBOT(AIプログラム)でバトルするのが正しい楽しみ方かもしれません](https://qiita.com/javacommons/items/b178c924199d1a6d524d)

### ALGORITHMS
`ALGORITHMS` の問題の難易度は `AtCoder` `Codeforces` などの競技プログラミングサイトと比べると非常に簡単になっています。
競技プログラミングを普段している人はつまらないと感じてしまうかもしれません。
しかし、問題によってはテストケースを実行するとそれに応じて左上の画面が動くものがあり、これは見ていて結構面白いです。

### Clash of Code
これから説明します。出された問題を解くところは `AtCoder` `Codeforces` などと似ていますが、ルールが一風変わっていて普段競技プログラミングをしている人でも楽しめるようになっていると思います。

また、 `CodinGame` の中には世界中の人と会話できるチャットもあり、分からないことがあれば質問をすることができます。結構優しい人が多いです。(体験談)

# 2. Clash of Codeとは？

上でも書いた通り出された問題をルールにしたがって解くものです。
毎回のゲームの結果(順位)に応じて自分のレートが上下します。

では `Clash of Code` と `AtCoder` `Codeforces` の異なる点は何でしょうか？
それをいくつか説明します。

## 常時開催されている

`Clash of Code` は **常時開催** されています。参加者が8人集まるとゲームが開始されます。いつでも好きな時に参加することができます。

## モードが複数ある

出された問題に対してそれを解くプログラムを時間内に書くということは同じなのですが、それらに加えて以下の3つのモードのうちどれかが選択されます。
選択されたモードに応じてコードを書きます。

- `fastest mode`
できるだけ速く問題を解く
- `reverse mode`
問題文が **与えられない** のでテストケースだけを見て問題をできるだけ速く解く
- `shortest mode`
できるだけ短いコードで問題を解く
いわゆるコードゴルフ

`fastest mode` は `AtCoder` `Codeforces` と似ていますね。
しかし `shortest mode`,`reverse mode` はあまり馴染みがないのではないでしょうか？

## 時間が短い

一般的なプログラミングコンテストは問題 3~9 問ほどを 1~2 時間で解くというものが多いと思いますが、`Clash of Code` は問題1問を15分で解きます。15分の間にコードを書いたり、`shortest mode` の場合にはもっとコードを短くできないかを検討したりします。
時間が短いので気軽に参加することができます。

## 作問がかなり気軽にできる

これは異なる点といっていいのか分かりませんが、 `Clash of Code` では問題をかなり気軽に作ることができます。
問題を作って3人の人に認めてもらえばすぐにそれが出題されます。私は自分で作った問題がその日のうちに出題されるという経験をしたことがあります。

# 3. Clash of Code を始めよう！

ある程度他のサイトとの違いが分かったと思うので、ここからは `Clash of Code` を始めるに当たってのサポートをしたいと思います。

## 3-1. ゲームの流れ

ゲームの流れとしては、

1. [Clash of Code](https://www.codingame.com/multiplayer/clashofcode)のページに行き、` Join a 5min coding battle!` というところをクリック

2. 8人集まるかホストがスタートするとゲームが始まります

3. 始まったら問題とモードを確認する

4. 問題を解いて手元でテストケースを確認する

5. 提出して自分の結果を確認

という感じです。

問題画面です。(一応問題文は隠しています)
![example](https://user-images.githubusercontent.com/66059019/114861710-96c05680-9e28-11eb-9a42-fda7c68e777c.jpg)

- 左上にモードと残り時間
- その下に問題文
- 左下に他の人の状況
- 右にIDE(コードを書く場所)
- コードを書き終わったら右下の `PLAY ALL TESTCASES` でテスト

という感じです。
今回のゲームのモードは `fastest mode` なので他の人よりも速くコードを書かなければいけません。

「これで大丈夫！」というコードが書けて、テストケースも全て試したら `SUBMIT` ボタンを押して結果を確認しましょう。
結果画面はこんな感じです。

![result](https://user-images.githubusercontent.com/66059019/114863113-4d710680-9e2a-11eb-8f06-ce27209f3ffd.png)

~~負けてますが何か！？！？！？！？~~
結果画面では他の人の結果、もしその人が許可しているならばその人のコードを見ることができます。

今回私は8人中3位で多分これはレートが下がってしまいます。
しかし、レートが下がったところで一回のゲーム時間は高々15分なのでまた別のゲームに参加してレートを戻すことができるのですのです。
ですので、ここでレートが下がったところで痛くもかゆくもありません。(嘘)

## 3-2. 実践的なこと

さて、ここまでの説明で `Clash of Code` がどのようなものか、ゲームの流れはどんな感じか、ということがなんとなく分かったかと思います。
ここからは `Clash of Code` で上位に入っていくためにしたこと、各モードにおける基本的な戦略を書いておきます。

もちろん、以下に書いている戦略に無理に従う必要はありません。以下に書いてあることはあくまで私がしたことです。

### 新しく言語を学んだ

これは `Clash of Code` のために学んだという訳ではないのですが、`Python`,`Ruby` を少し書けるようになりました。
普段 `AtCoder` のコンテストでは 多くの人が `C++` でコードを書いています。しかし、`C++` では `Clash of Code` の上位に入っていくのは少し難しいかもしれません。
これは、`C++` ではコードを書く時間が他の言語と比べて長くなってしまう、コードが長くなってしまうためです。

`shortest mode` ではこの影響は顕著に現れます。また、このほかのモードでもかなりの影響があります。

コードを書くときに `C++` 以外の言語のほうが多くのメソッドがあり、有利だと実感することが多いです。例えば、入力された n の各桁の和を求めたいときに
`C++` だと

```c++
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin >> n;
    int sum_of_digits = 0;
    while(n){
        sum_of_digits += n % 10;
        n /= 10;
    }
    cout << sum_of_digits << endl;
}
```

と書かなければいけませんが、
`ruby` では

```ruby
p gets.to_i.digits.sum
```

と書くだけでいいです。

`Clash of Code` は問題があまりにも単純なので、` C++` で速くコードを書くことに自信がある人も勉強してでも別の言語をほうが順位が伸びやすいかもしれません。

#### 強い言語

`Clash of Code` で強い言語をいくつか書いておきます。

- `Python`
- `Ruby`
- `Perl`
- `Javascript`

これらの言語が書けるととても強いです。
`CodinGame` では `Javascript` の入出力をサポートをする `readline` 関数と `print` 関数があり、これがかなり強いです。

### 各モードの戦略

#### fastest mode

まず問題文を読まずにテストケースを少し見てみます。テストケースからどんな問題か分かった場合はコードを書きましょう。テストケースを見ても分からない場合に問題文を見ればいいです。
問題文を読むときは `Output` の部分を見ると出力しなければいけないものが書いてある場合があります。
このモードでは `Python` で提出することが多いです。

たまに[正規表現](https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html)が使いたい時に `Ruby` で提出します。

#### shortest mode

15分フルに使えるのでとりあえず問題を読みながらどうすれば短いコードを書けるかを考えます。
自分の知ってるメソッドを頭に思い浮かべて書いてみて色々な言語で書いたり他の解法で書いたりします。
このモードでは `Python`,`Ruby` で提出することが多いです。たまに `Bash` を使うこともあります。
`Perl` を使う人も多少いるようです。
`言語名 コードゴルフ` で調べるとその言語でコードを短く書くテクニックが出てきますので調べてみるとよいでしょう。

また、近いうちに同級生の @souta_1326 君が `shortest mode` の攻略記事を出すらしく、その記事が出たらこの下にリンクを貼るのでそれも見てみてください。

<font color="red">2021/6/8 22:06 追記</font> 記事が出されました！
[リンク](https://qiita.com/souta_1326/items/52e9243b96fcda655d04)

#### reverse mode

このモードが一番好きです。何故なら問題文がないので英語を読む必要がないからです！！(英弱ですみませんでした)
テストケースを見て解法を考えます。これに関してては勘だけが頼りで、結構ギャンブル要素が強いです。
このモードでは `Python` で提出することが多いです。

### 総合的なこと

説明していませんでしたが、これらのモードではいずれも正答数が第一です。速く解こうと意識しすぎてミスをしてしまっては良い順位は出ず、本末転倒です。
これを防ぐためにテストケースは絶対に全部試しましょう。試さないと大変なことになります。(自戒)

また、 `shortest mode` で短く書こうと意識しすぎて結局コードが書き終わらないということもあってはなりません。

# 4. おわりに

`Clash of Code` はとても単純で面白いゲームです。ごくたまにヤバい問題(語彙力)が来たり、途中で回線が切れたり(これは自分の責任です)するとキレますがとても楽しいです。

普段競技プログラミングをしている人なら簡単にレートが上がると思いますので是非一度息抜き感覚で遊んでみてはいかがでしょうか？

それではまた別の記事で会いましょう！良い競技プログラミングライフを！