【2023年8月時点】KotlinでAtCoderのコンテストに参加するための環境構築（最低限）

# 概要
KotlinでAtCoderのコンテストに参加するための最低限の環境構築メモです。

## 環境
* Windows 11
* IntelliJ IDEA Community Edition 2023.2
* AtCoder 2023/1 Language Updateの取り込み後の内容
    * Kotlin 1.8.20
    * JVM 19

## 方針
* 手元でKotlinコードを書いて実行やデバッグをするための最低限の環境を構築する
    * 非公式の便利な機能はとりあえずは使わない
    * なので考えてみたらAtCoderとかあんまり関係ないかも… でも面倒なのでこのまま書く
* WSLはとりあえず使わず、ホスト（Windows）側で構築する

## 登場するツールとそれらの雑な説明
* Kotlin
    * プログラミング言語。かわいい
* IntelliJ IDEA
    * 統合開発環境（IDE）
    * JavaでおなじみのIDEだったが、Kotlinでも使える
        * というかIntelliJ IDEAの開発元が作った言語がKotlin
    * 有償のUltimate Editionと無償のCommunity Editionがあるが、少なくとも今回の用途だとCommunity Editionで十分
* Java仮想マシン（JVM）
    * 基本的にはKotlinのコード（をコンパイルしたバイナリ）はこいつの上で動くので必要
* Gradle
    * ビルドツール。Kotlinのコードのコンパイル、実行を担当
        * 依存ライブラリの管理などの重要な役割が他にもあるけど、今回はあまり関係ない
    * 独立したツールだが、IntelliJ IDEAに統合されて使える

# 内容
## IntelliJ IDEAの導入
Kotlinの処理系、JVM、Gradleなどは一通りIntelliJ IDEAを経由して導入できるため、とにかくまずIntelliJ IDEAを導入する。

導入方法は大きく分けるとIntelliJ IDEAを直接インストールする方法、JetBrains Toolboxを使ってインストールする方法の2つがある。JetBrains Toolboxをインストールして、その画面からIntelliJ IDEA Community Editionを選ぶのが簡単。

## プロジェクトの作成
IntelliJ IDEAがインストールできたら、「New Project」を押してプロジェクト作成を開始する。

プロジェクト作成のモーダルが表示されるので、以下のように設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321705/2eb34f6a-09c0-a97b-a79f-4f29cb7e9f12.png)

* Name
    * 自分がわかりやすい名前なら何でもOK
* Location
    * なんでもいいけど、基本デフォルトのままでよいと思う
* Create Git repository
    * Gitで管理したければチェックを入れる
    * よくわかんなければチェックしなくていい
* Language
    * Kotlinを選択
* Build system
    * 今回はGradleにする
* JDK
    * バージョン19を選ぶ
    * インストールされていない場合、プルダウンを選んで「Add SDK」 -> 「Download JDK...」 を押してIntelliJ IDEAにダウンロードさせるとよい
        * Versionは19
        * VendorはAmazon Corretto、Azul Zulu、Eclipse temurinなどいくつかあるが、どれでもよい
* Gradle DSL
    * どっちでもいいけど今回はKotlinにする
* Add sample code
    * どっちでもいいけどとりあえずチェックが入ったままにする

上記の設定で「Create」を押下でプロジェクトの作成が開始される。画面が切り替わった後に自動ダウンロードやビルドなどの処理が実行されていくのでしばらく待つ。

画面の下にこんな感じのインジケータが表示されているうちはまだ実行中なので、これが完全に消えるまで待つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321705/83a77e98-8c4d-9e99-780d-ba68b2ab99a7.png)

### build.gradle.ktsを編集
動作が落ち着いたら、画面の左から「build.gradle.kts」を開く。

このファイルを以下のように書き換える。

```build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.8.20"
    idea
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation(kotlin("test"))
}

tasks.test {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "19"
}
```

あまり関係ない記述もあるが、特に重要なのは以下の記述。

```build.gradle.kts
plugins {
    kotlin("jvm") version "1.8.20"  // 執筆時点でAtCoderで使えるKotlinのバージョンを指定
    idea
}
```

```build.gradle.kts
tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "19"  // 執筆時点でAtCoderでKotlinを実行する際に指定している -jvm-target 
}
```

ファイルを編集したら、反映させるための操作を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321705/b9e080ba-0df3-2522-8c51-20301fe83773.png)

右端の縦書きの「🐘 Gradle」みたいなところを押すと上記の画面が出るので、この左上の🔄みたいなやつを押す。
すると内容を反映させるためにGradleがあれこれ処理するので、終わるまで待つ。

ここまでやればソースを書いて実行できるようになっているはず。

上記の設定で「Add sample code」にチェックを入れていた場合は「Main.kt」というファイルが表示されているはずなので、これをそのまま実行してみる。
右クリックして「Run 'Mainkt'」を押すか、もしくは「Ctrl + Shift + F10」を押すかすると実行できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321705/4bf402a9-e7cb-cec9-a4e9-ea90d9b424f7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321705/61beeee7-3bbc-9c9c-ba18-de3ac6412dc9.png)

このような表示が出ればちゃんと環境構築できている。（画面下に出る）


## 動作確認
とりあえず簡単な問題を解いてみる。
https://atcoder.jp/contests/language-test-202301/tasks/practice_1

```kotlin
fun main() {
    val a = readln().toInt()
    val (b, c) = readln().split(" ").map { it.toInt() }
    val s = readln()

    println("${a + b + c} $s")
}
```

今回は動作確認やテストを支援するツールを何もインストールしていないので、動作確認も提出もコピペで行う。

実行すると画面下で入力待ちのコンソールが出るので、そこにペーストして動作確認する。

コピペで提出なので、Main.ktを毎回書き換えてもいいし、別途ファイルを作っていくのでもよい。（ファイル名は適当でもいい）
ただ、別途ファイルをつくる場合、main以外のpublicな関数名がバッティングするとコンパイルエラーになるとか、他のファイルにあるpublicな関数に依存してしまって手元だとコンパイルエラーにならないが、提出するとCEになるとかのトラブルがあり得るので要注意。

## その他
### Live template（いわゆるスニペット）
`val (b, c) = readln().split(" ").map { it.toInt() }` とかをいちいち手動で入力するのは面倒なので、Live templateを使って自動補完させるようにしておくと少し楽になる。

Live templateは、略語を入力すると本来必要なコードを自動で補完してくれる機能。
たとえば `main` と入力してEnterで

```kotlin
fun main() {
    
}
```

が入力補完されるLive templateなどが最初から定義されている。
Live templateは自分で登録することもでき、上記の `val (b, c) = readln().split(" ").map { it.toInt() }` を自動補完させるためのLive templateを登録するといい。

Live templateの登録方法はこちら。
https://pleiades.io/help/idea/creating-and-editing-live-templates.html

私はとりあえず入力周りだけ以下のような感じでLive templateを登録している。本当はもっと充実させたい…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321705/35f552e3-a1be-41e0-3800-dddca4854bb1.png)

### 初回実行の遅さについて
今回の手順の通り環境構築した場合、実行はGradleによって行われる。初回実行時はGradleがあれこれ初期化処理を実行するらしく、かなり起動が遅いので注意。一度起動すると高速化のためにGradleのプロセスが常駐し、2回目以降の実行はけっこう速い。なのでコンテスト前に一度適当に何か実行しておくとよい。

また、原因は別かもしれないがLive templateによる補完も初回は遅いことがあるので、これもコンテスト前に適当に入力して補完させておくとよい。