blog.bouzuya.net

2022-02-19 rust365

ぼくは rust365 という取り組みをしている。この取り組みについては 2021-05-14 に書いた。開始は 2021-04-21 だ。年をまたいでいるので現状を踏まえて書き直してみようと思う。

rust365 は毎日 Rust で書かれたアプリをバージョンアップする取り組みだ。 Rust を 365 日書くので rust365 だ。ぼくがそう呼んでいるだけのもので世間的には "Write Code Every Day" と呼ばれているものの一種だと思う。

2021 版のルールは↓だった。

  • 毎日 Rust で書かれたアプリをバージョンアップする
  • 毎日バージョンアップしてタグをつける
  • バージョンアップは次の 3 種類
    • アプリを新規作成する (0.0.0 -> 0.1.0)
    • アプリに機能を追加する
    • アプリの機能を変更する

このルールから次のこともわかる。

  • リファクタリングはバージョンアップに含まれない
  • 修正は「アプリの機能を変更する」の解釈次第でバージョンアップに含まれる
  • 「機能」の粒度は決められていないので 1 コミットで「バージョンアップ」としても良い
  • 日単位の制限はあるが時間単位の制限はない
  • バージョンを自身でコントロールできない OSS への contribution は含まれない

実際に 2021-04-21 からやってきてどうか。

  • OUTPUT は増えた
  • 競プロ (AtCoder) だけでなく CLI にも自身の Rust の適用範囲を広げられた
  • ものをつくるハードルを下げることができた
  • 毎日 1 つはコミットする習慣ができた
  • OUTPUT の質は低い
  • 寝る前に慌ててコミットしてしまっている
  • リファクタリングでバージョンアップしてしまっている (ルール違反)
  • バージョンアップコミット分だけコミットを水増ししてしまっている

2021 年版を書いた際に挙げた目的はおおむね達成できている。これは良いことだ。一方で質の低い OUTPUT やルール違反は気になるところだ。

2022 年版ではルールを↓のようにする。

  • 毎日 Rust で書かれたアプリをバージョンアップする
  • 毎日バージョンアップしてタグをつける
  • バージョンアップは次の 5 種類
    • アプリを新規作成する (0.0.0 -> 0.1.0)
    • アプリの機能を追加する
    • アプリの機能を変更する
    • アプリの機能を修正する
    • アプリのリファクタリングする

ルール違反になっていた箇所はルールの側を変えてしまった。わりと習慣化できているのであまり崩したくないなと思ってのことだ。

質の低い OUTPUT を改善するためにルール以外の運用で工夫してみようと思っている。具体的には朝に 1 コミットする。これだけだ。

朝に 1 コミットする意図としては "Write Code Every Day" https://johnresig.com/blog/write-code-every-day/ における "Background processing" のような状況をつくることだ。現状は夜遅くノルマをこなすようにコミットをつくってしまっている。睡眠を挟むと体感としてリセットされてしまう。朝にコミットすることでその日のバックグラウンドで動いているような状態にしたい。これは競プロ典型 90 問 https://qiita.com/e869120/items/1b2a5f0f07fd927e44e9 でも使われていた考え方だ。

既に朝 1 コミットを 2022-02-11https://github.com/bouzuya/rust-sandbox/commit/547082f8d41ec159820d1b33a8101698e4b53462 からはじめている。いまのところなかなか良さそうだ。これからも続くかどうかは分からない。

また rust365 からは外れるのだけど、もっと標準ライブラリ・定番 crate などのコードリーディングや出版されている書籍についてももっと読んだほうが良いのだろうなと思っている。自分なりの工夫だけじゃなく他の人がどうやっているのかをもっと知るべきだろうなと。

引き続きやっていく。

(TODO: ねらいを改めて書くかもしれない)


アルゴリズムと数学 演習問題集 048 - Small Multiple を解いた。

問題: https://atcoder.jp/contests/math-and-algorithm/tasks/arc084_b

AtCoder Regular Contest 084 (ARC084) の D https://atcoder.jp/contests/arc084/tasks/arc084_b と同じ問題。自力では解けなかった。

とっかかりがよくわからないのだけどメタなアプローチで「これがグラフの演習問題にあるのでグラフだろう」と考えてみたけど分からなかった。分かっていたのは各桁の和は 10 倍……としても同じになること。 +1 すると 10 以外は +1 になりそうなこと。 K の倍数というのがどう活きるのかピンと来なかった。

解説: https://atcoder.jp/contests/arc084/editorial

解説によると各桁の和は 1 から K を頂点として 10 倍を重み 0 +1 を重み 0 の辺としたグラフにおける 1 から K の倍数の頂点への最短距離 + 1 になる。また K の倍数なので各頂点を剰余 mod K で考えて 0 の頂点までと考えれば良いらしい。これで頂点数を K に抑えられる。

あとは最短距離を求めれば良い。解説では 01BFS でと書いてあったのだけどうまく実装できなかったのでダイクストラ法で通した。

提出: https://atcoder.jp/contests/math-and-algorithm/submissions/29419941


アルゴリズムと数学 演習問題集 049 - Fibonacci Easy (mod 1000000007) を解いた。

問題: https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_ap

フィボナッチ数列の第 N 項 (N >= 3) は N - 1 項と N - 2 項が分かれば求められる。 let mut dp = (1, 1) の形で直前の 2 つを持って N - 2 回 (dp.1, (dp.0 + dp.1) % MOD) に変更することを繰り返せば dp.1 が答えになる。

提出: https://atcoder.jp/contests/math-and-algorithm/submissions/29420333


今日のコミット。