Rustでプログラミングコンテスト

最近は熱心にプロコンをやる気力が起きないが、Rustの勉強として気が向いた時にちょくちょくAtCoderの問題をRustで解くということをしている。
AtCoderではRust 1.15.1とちょっと古めのバージョンしか対応していないため(今だとstableが1.24.0)、ちょくちょく不便なこともあるがまあなんとかなっている。
コンパイル言語でJavaやScalaのようなJVMの初期化処理もないおかげで、理不尽なTLEを食らうことは今のところない(とは言ってもABCのD問題程度ではそんなことはそもそも稀か)

最近解いた問題を貼ってみる。まだまだRustには不慣れなので、めちゃくちゃなコードも結構混ざっている。

D - Wide Flip | ARC088

方針を考察するのが辛いが実装はシンプルにすむ。自分の提出

D - 2017-like Number | ABC084

前処理で2017-like Numberの数を数えればおしまい。なのだが、前処理のテーブルをつくる関数がひどい。make_memoの引数は借用にするべきだった。
自分の提出

C - 駆引取引 | みんなのプロコン2018

メモ化再帰。前処理のテーブルをつくるときに18182^18になる解法
手元では最適化をかけずにコンパイルしたせいか結構遅く感じたが、蓋を開けてみれば比較的余裕だった。 自分の提出

D - Grid Repainting | ABC088

よく考えると(というかネタバレツイートを見てしまった)最短距離を求めるだけなのでダイクストラしている。
隣接マスへの移動をループで表現するためdx[] = {-1,0,1,0}という感じの配列をつくるというのを他の言語ではやるのだが、Rustだと配列のインデックスの指定はusize型で行わなければならないため、キャストを連発している。
i32やusize、i64へのキャストはC++では暗黙でやってくれたが、Rustでは明示的にやらないといけないのはいろいろなところで辛い。
もちろん、それで未然に気がつくミスというのもあるのだろうが、多分プロコンでは足を引っ張ることのほうが多そう
自分の提出