11月が終わったので11月の月報をまとめよう. 一昨日くらいにお風呂に入りながら, ちょうど月報に入るように neovim を使った感想を入れようと思ったけど間に合わなかった. 世ではアドベントカレンダーと称してみんなが一年ぶりにブログを更新している.
二週間くらい試しにヤクルト1000をやめてみた. そういえばやめたことを思い出した(次の宅配のときにそういえば私はこれを契約してたことを思い出したくらいに). 効果なんてなかった気がして契約を打ち切った.
夢日記。お姉ちゃんのDSを触る。NINTENDO の代わりに EPSON と書いてある。聞くと貰い物だといって、自分は正規のDSを起動する。文鳥が三羽部屋の中に放たれている。祖母が窓を開けようとするので厳しく注意すると逆上された。いつもおとなしいのにこんなに大声を出す人だったのかと驚いた。
コーヒー飲んでも眠気は覚めることとかなくて、確かな眠気を感じながら心臓だけバクバク言ってる
エレキギターを買った. エレキギターという楽器はギター本体だけでは楽器として不完全で, 周辺の機器を買って初めて音が出せる.
いつだったか名取さなが紹介していた
創作物の中で犬(その他)が殺されるか, 可愛そうな目にあうかどうかがまとめられている. ややネタバレを含むがそれよりも犬が可愛そうな目に合うことを見ることを避けることを目的にしている.
例えばサタンタンゴでは少女が猫(もちろん?ヌイグルミだが)を床に叩きつけて遊ぶシーンがある.
どうしてもそういうシーンを避けたい人には便利.
Rust の BTreeSet::range は大変よく出来たインターフェイスで, これがあるから Rust はプロコンに向いているといっても過言ではない. 出来ることは要するに lower_bound だが upper_bound もやってくれる. BTreeSet
で構築した集合(値には順序がついてることが要請される)について区間 min..max
を渡すと, 集合の内その区間( min
以上 max
未満)に入った値のイテレーションが返ってくる. このイテレーションは昇順に並んでいて, 先頭または末尾から順番に舐めることができる. 先頭を見れば最小値が, 末尾を見れば最大値が手に入る.
全く同様に BTreeMap::range
があり, こちらはキーに関する lower_bound, upper_bound が出来る.
数列の上で自前で二分探索をするくらいなら, BTreeSet
に値をすべて詰め込んで range
してしまう, といったやり方があり得る. ただし値が重複する数列だと書き方を気をつけるか自前でやってしまう方がいいかもしれない.
fn main() {
// 偶数の集合
let mut r = BTreeSet::new();
for i in 0..100 {
r.insert(i * 2);
}
// 区間に入る値の先頭(=最小値)
put!(r.range(..20).next().unwrap()); // 0
put!(r.range(1..20).next().unwrap()); // 2
put!(r.range(5..7).next().unwrap()); // 6
// min でも同じ意味
put!(r.range(5..7).min().unwrap()); // 6
// 区間の入る値の最後(=最大値)
put!(r.range(..20).next_back().unwrap()); // 18
put!(r.range(1..=20).next_back().unwrap()); // 20
put!(r.range(5..7).next_back().unwrap()); // 6
// last も next_back と同じ結果を返すが,
// 古いバージョンの last はイテレーションを先頭から舐めるので遅い
// 参考; https://maguro.dev/btree-maximum-value/
put!(r.range(5..7).last().unwrap()); // 6
}
maguro.dev - Rust の BTreeSet / BTreeMap で最大値を素早く取得する方法 にあるように, 最新の Rust を使ってるなら .min()
.max()
を使っていれば計算量も \(O(1)\) だし, 意味の通りが良いのでそれでいい. AtCoder を想定すると現在 v1.42.0 と古いので .max()
の代わりに .next_back()
を使うべき. .min()
はそのままでもいいが, 対称性から私は .next()
を使うことにしてる.
SAVE {
BEGIN -> 1
1 -> {2, *}
2 -> {3, *, *}
3 -> {4, *}
4 -> {5, *}
5 -> {6, *}
6 -> {7, *}
7 -> {8, *} # 迫る/ボケる
8 -> {9, *}
9 -> {10, *}
10 -> {11, *}
11 -> {12, *, *} # パンツを見る
12 -> {13, *}
13 -> {14, *}
14 -> {15, *}
15 -> {16, *} # 話しかける/部活に行く
16 -> {17, *} # 桜庭/友樹を誘う
17
}
気になったので記録した. トイレットペーパーを交換した日付をメモしており, 差を取ることで 1 ロールを何日で消費したかがわかる