Nimで競技プログラミングを始
めた話(1ヶ月)
tattaka(@tattaka_sun)
Agenda
1. 自己紹介
2. 競技プログラミングについて
3. Nimってどんな言語?
4. 環境のセットアップ
5. 他言語との比較・ベンチマーク
6. 競技プログラミングで使うときのTips
自己紹介
呼び名:tattaka
Twitter:@tattaka_sun
所属:R大学Nコース
サークル:RCC・RRST(どちらも引退)
興味:画像認識・ロボット・機械学習・マイコン(STM32)
競技プログラミングについて
競技プログラミングとは
● プログラミングの問題を限られた時間内に解くゲーム(のようなもの)
● 簡単なものでは標準入出力を使うだけのものからしっかりアルゴリズムを
知らないと解けないようなものまで
● オンラインサイトは色々あるがAtCoderが規模や使える言語の多さからお
すすめ
Nimってどんな言語?
Nimの特徴
● 静的型付け言語(とある程度の型推論)
● GCあり
● 文法はPythonっぽい(主観)
● ライブラリもそこそこ充実している
● コンパイルしたらCのコードに変換される
(生成されたCのコードをgccで解釈し
実行ファイルを生成)
環境のセットアップ
Nim v0.13.0の環境構築
● 現在の最新バージョンは0.19.0、AtCoder内のバージョンは0.13.0
● 辛い
● v0.13.0の環境構築する際はDockerが楽
(DockerHub -> https://hub.docker.com/r/nimlang/nim/)
● あんまり後方互換性が考えられてない
他言語との比較・ベンチマーク
Nim(v.0.13.0) vs C++(g++ 7.3.0) vs Python(2.7.15)
先ほどのFizzBuzzを100000回回した時の(コンパイル+実行)時間を測ってみ
る
Nim: real 1.073s, user 0.690s, sys 0.110s
C++(最適化なし): real 1.281s, user 0.340s, sys 0.370s
C++(-o3): real 0.880s, user 0.330s, sys 0.250s
Python: real 3.563s, user 1.520s, sys 1.930s
競技プログラミングで使うときのtips
標準入出力
● s = readLine(stdin) #文字列を受け取る
● a = parseInt(readLine(stdin)) # int型の整数を1つ受け取る
● bc = readLine(stdin).split().map(parseInt) #複数文字の整数を配列で
● seq = @[] # 配列を扱うときは空配列を定義してあげないとCE
for i in 0..n: seq.add(parseInt(readLine(stdin))) # 複数行読み込み
多重配列に対するスライス
● multiSeq = @[@[0, 0, 0], @[1, 1, 1], @[2, 2, 2], @[3, 3, 3]]
● multiSeq[0][0..1] # -> @[0, 0]:まあわかる
● multiSeq[0..1][0] # -> @[0, 0, 0] :??
● multiSeq[0..1][0..1] # -> @[@[0, 0, 0], @[1, 1, 1]]:???
● map(multiSeq[0..1], proc(x: seq[int]): seq[int] = x[0..1]) -> OK!
ご静聴ありがとうございました

Nimで競技プログラミングを始めた話(1ヶ月)