月報 2022/12

Fri 02 Dec 2022

00:12:21

11月が終わったので11月の月報をまとめよう. 一昨日くらいにお風呂に入りながら, ちょうど月報に入るように neovim を使った感想を入れようと思ったけど間に合わなかった. 世ではアドベントカレンダーと称してみんなが一年ぶりにブログを更新している.

00:14:39

二週間くらい試しにヤクルト1000をやめてみた. そういえばやめたことを思い出した(次の宅配のときにそういえば私はこれを契約してたことを思い出したくらいに). 効果なんてなかった気がして契約を打ち切った.

13:00:57

夢日記。お姉ちゃんのDSを触る。NINTENDO の代わりに EPSON と書いてある。聞くと貰い物だといって、自分は正規のDSを起動する。文鳥が三羽部屋の中に放たれている。祖母が窓を開けようとするので厳しく注意すると逆上された。いつもおとなしいのにこんなに大声を出す人だったのかと驚いた。

Sun 04 Dec 2022

15:09:52

コーヒー飲んでも眠気は覚めることとかなくて、確かな眠気を感じながら心臓だけバクバク言ってる

エレキギターを買った. エレキギターという楽器はギター本体だけでは楽器として不完全で, 周辺の機器を買って初めて音が出せる.

Mon 05 Dec 2022

20:49:45

いつだったか名取さなが紹介していた


DoesTheDogDie.com
Crowdsourced emotional spoilers for movies, tv, books and more.
 
www.doesthedogdie.com

創作物の中で犬(その他)が殺されるか, 可愛そうな目にあうかどうかがまとめられている. ややネタバレを含むがそれよりも犬が可愛そうな目に合うことを見ることを避けることを目的にしている.

例えばサタンタンゴでは少女が猫(もちろん?ヌイグルミだが)を床に叩きつけて遊ぶシーンがある.


Satantango (Movie, 1994)
Does the dog die in Satantango? Click for that and many other emotional spoilers.
 
www.doesthedogdie.com/media/11131

どうしてもそういうシーンを避けたい人には便利.

Mon 12 Dec 2022

16:15:59

Sun 18 Dec 2022

03:20:19

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() を使うことにしてる.

Wed 21 Dec 2022

18:17:06

CROSS+CHANNEL

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 ロールを何日で消費したかがわかる