Nimめっちゃ大好きなのでまとめました.
Nimは(C++並みの)速さと書きやすさを備えた最強の言語で競プロ向きです.
- 速いので安心. 富豪的な書き方をしても間に合う.
- 静的型付け. 知ってますか,Compile Error は Runtime Error ではないのでペナルティはありません.
- 変数を dump しやすい.
std::vector
をcout
するのはダルいが,Nimならecho @[1,2,3]
が動く. - 即時 named tuple が作れる.
let a = (x:100,y:100)
みたいな. - 実行時に落ちても落ちた場所を教えてくれる. C++だと
segmentation fault
とか出てつらいよね. - メソッドチェーン!
newSeqWith(n,(x:scan(),y:scan())).sortedByIt(it.y).mapIt(it.x*it.x+it.y*it.y)
(ベクトル(x,y)を取得してyの順にソートして絶対値に変える例) lowerBound
とかnextPermutation
とか競プロ的に欲しい関数がちゃんとある.(例:D言語にはindexを取れるlowerBoundが無い)const auto
がlet
で書ける. 不変性が簡潔に書けて便利.
Nimは最強の言語ですが、罠が無いわけではありません.
- Nimは互換性を気にしないタイプの言語なので,思わぬバグが発生しがち。
- 慣れないと毎コンテストで(バージョンに起因する)バグを踏むことが普通に起こるので必ず合わせるべき.
- 2019/10/8 時点で AtCoder:0.13.0 / YukiCoder:0.20.99
- Nimのバージョン変更自体は
choosenim
コマンドで簡単にできる。- Nim 0.13.0 は古いので自分でビルドする必要がある.
- ビルドを終えたらディレクトリ一式を
~/.choosenim/toolchains/nim-0.13.0/
に入れると使えるようになる.
以下は 最新のNim(>=0.20.0) では修正されている.
toSeq(0..<10)
とは書けない.- o :
toSeq(0..10-1)
- o :
sequtils.deduplicate
は O(N^2) かかる.random
(疑似乱数)モジュールが無い.- o : 自分で書く
heapqueue
(優先度付きキュー) モジュールが無い.- o : 自分で書く
sequtils.newSeqWith
は便利だが配列のコピーが余分に発生する.- およそ1e6以上の個数を扱うなら
newSeq
して代入の方が安心.
- およそ1e6以上の個数を扱うなら
- C++のSTLとの連携は可能だがサポートは弱い.
- 例えば,
std::map
にカスタムの比較関数を入れられない.
- 例えば,
intsets
モジュールは競プロ的には産廃では?使うことがあったら知りたい.seq[bool]
かHashSet[int]
か別のデータ構造を使うと思う.
algorithm.sort
は quick sort ではなく merge sort.- ref object を動的に構築するデータ構造は,C++の同様のものに比べて定数倍がかなり重たい.つらい.