LoginSignup
6
1

More than 1 year has passed since last update.

競プロでRustを1年間使ってできるようになったこと・ならなかったこと

Last updated at Posted at 2022-12-14

はじめに

弊社ではRustが主要開発言語になっています。

私はRustが何もわからなかったので、せっかくなら競プロを再開するついでに使ってみようと考えました。そこから1年ちょっと経ち、なんやかんやあって青コーダーになれたので、1年間何をやったのか振り返って、結局何ができるようになって何ができないままなのかを紹介します。

レーティング.png
2021年の6月からRustを使い始めています。Rustで1000問解いたみたいです。

image.png

結論

  • できるようになったこと
    • HashMap,BTreeSet,BinaryHeap,VecDequeなどのデータ構造が困らない程度に使えるようになった
    • OptionmapメソッドやIteratorsumメソッドなどで(forやifを使用せずに)簡単に書けるようになった
  • できるようにならなかったこと
    • 非同期処理, 並列処理
    • ライフタイムの理解
    • ファイル入出力
    • 1.42よりも新しいもの
      • オンラインジャッジシステムのバージョンが1.42なので......
    • Rustらしい書き方
      • 解くだけなら動けばOKなので、どう書くのがRust的なのかは身につきませんでした

要するに、競プロで要求される程度のことができるようになりますが、使わないものはできるようになりません(それはそう)。でもググって見つけたコードを読んだりコンパイルエラーに対処する能力は上がっている気がします。

やったこと

  1. 普通に解く
    コンテストの問題を普通に解きました。この時点で

    • usize型はマイナスになった瞬間にpanicするので不等号の比較はなるべく足し算で行う
    • 文字列型のn文字目をs.chars().nth(n).unwrap()でとると遅いのでs.chars().collect::<char>()のようにしてベクタで保持しておく
    • for v_i in vみたいに書くとmoveされるのでfor &v_i in &vみたいに書く
      あたりを知りました。
  2. シンプルな関数・構造体を自作ライブラリとして整備する
    簡単なアルゴリズムをwikipediaなどから引っ張ってきて実装しました。疑似コードをそのまま書いた感じでRust特有の問題は特に踏まなかったのですが、ドキュメンテーションコメントを書くのは楽しかったです。

    • UnionFind
    • 最大公約数、素因数分解など
    • modint
  3. ちょっと複雑な関数・構造体を自作ライブラリとして整備する
    型パラメータを受け付けるものを整備し始めました。

    • 二分探索
      • クロージャを引数に渡すようにしましたが、クロージャで型パラメータが必要なんだぁとなりました
    • セグメント木
      • 木に乗せる型も演算する関数も型パラメータです。結構頑張って実装しました

おわりに

12/24(土)に弊社主催のABCがありますのでよろしくお願いします!!!!!!!!

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1