はじめの一歩

Nim で競技プログラミングしようという記事です.

そもそも Nim とは

Nim は Python のようにインデントを文法に含んだ静的型付け言語です.
コードが非常に綺麗な見た目になるので,こことか見て興味が出るようなら向いていると思います.
テンプレートとかマクロとかも持っているので,そのあたりが好きな人も向いているんじゃないでしょうか? という感じ.

ひとまずインストールから

今となっちゃ brew で入っちゃいます.
ということで,Mac なら

brew install nim

でどうぞ.
これで

brew upgrade

で更新されて嬉しいですね.

他の OS でも多分これに類するもので入るんじゃないでしょうか?
ダメなら https://nim-lang.org/install.html からどうぞ.

現在の version は 0.19.0 です
atcoder では version 0.13.0 の使用を強要されます.
私の記憶にある限り,複数行コメントが打てない以外は大きな障害は無い気がします.
まあ競技プログラミングで複数行コメントなんてなかなか打たないでしょうしひとまず気にしないことにしましょう.
というか,みんなで Nim を盛り上げて version を上げてもらいましょう.

Nim へようこそ

ということで,AtCoder の練習用コンテストの第一問,「はじめてのあっとこーだー (Welcome to AtCoder)」を解きます.

こんな感じですね.
ちょっとずつ見ていきましょう

import

import strutils
import sequtils

インポート文です.

import strutils, sequtils

でも行けます.

それぞれのモジュールのドキュメントは
https://nim-lang.org/docs/strutils.html
https://nim-lang.org/docs/sequtils.html
にあります.
GitHub に飛んでソースが見れたり,めっちゃ丁寧で良い感じです.
そもそもが最新のコンパイラのコードから自動生成されているみたいです.
その辺のデザインはソースを見てみると面白いです.
そしてあわよくばコミッターになりましょう.

var

var
  a = stdin.readline.parseInt
  bc = stdin.readline.split.map(parseInt)
  str = stdin.readline

変数宣言です.
インデントされているところが全て var に修飾されたブロックです.
構文木がどうなっているかは覚えてないけど,このあたりまでは解説されていた気がするので気になる人はドキュメントをあさってみれば良いと思います.

ドットについて

stdin.readline.parseInt

ってなんぞやという話ですが,こいつはメソッドチェインです.
というわけで

parseInt(readline(stdin))

の意味です.
つまり, arg.function が function の最初のパラメータに arg を渡すよ.という意味です.

最初のパラメータに,と言ったのは,map を見るとよく分かると思います.

stdin.readline.split.map(parseInt)

は,

map((split(readline(stdin))), parseInt)

の意味です.
map の引数の順番が function, IterableObject じゃないのは "." をこういう使い方にしたかったからなんですね.
個人的には Nim のこういうところが好きです.

echo, format

見たまんまです.

$(a + bc[0] + bc[1])

の "$" は文字列へのキャストです.
Nim では割と色々なオブジェクトがこの演算をサポートしています.
文字列にしたいときはとりあえず "$" つけてみれば良いんじゃないでしょうか.

まとめ

久々に Nim を書きましたが,とりあえず "." の使い方を思い出すところからでした.
自分で Object を定義したりするのはもうちょっと先になりそうだなぁ.
そういう事情により,競技プログラミングはコンテストに出るよりも色々書いてみることが先になりそうです.
それと,久々に Nim を書いて,Nim でレキサジェネレータとパーサジェネレータを書いていたことを思い出したので,そちらも進めていきたい.

あと,関係ないですが,ブログにコードを載せる方法をもうちょっとスマートにしたいなぁと感じました.
暇ができたらそっちも作らないとなぁ.

2018/03/03