週記(2021/12/13-2021/12/19)

12/13(月)

先週は週記を投稿してから少し業務を進めようと思ったが、すぐわからないところにぶち当たったので布団に入り、なろうを読み始めた。しかしそのまま読み続けているうちに質問を投げてよい時間になったため、また起き出してしばらく作業を進めていた。一段落つくまでやっていたら昼前になったので、今度こそ布団に入って寝た。正午だった。

午後3時半、生協の弁当配達で起床。先週土曜日からずらしてもらったものだった。自分からこの時間帯を指定しておいて、寝過ごすようなことがなくて本当に良かった。

またすぐ寝るつもりだったし、実際物凄い眠気だったが、うっかりコードゴルフを始めて目が冴えてしまった。ABC231-Fに2時間ちょっとかけた。

atcoder.jp

座圧せずにBITに乗せるテクニックとして、mapを使うものがある。必要なところだけ作ればそう酷いことにはならないだろうという楽観に基づいていて、この問題はそれが通った。しかし詰めが甘く最短を取られてしまったので、別のところから攻めようとかなり試行錯誤していた。最終的には、負号をつけてソートすることで逆順ソートしていたところを、昇順ソートのままでも正しい値が求まるアルゴリズムに置き換えることで縮んだ。

もう一度問題を振り返ろう。この問題はA_i\ge A_jかつB_i\lt B_jなる(i,j)の組を数える問題だった。今、まずBの値で昇順ソートしている。このとき、B_i\lt B_jについてはBITを参照することで求まるが、B_i=B_jの場合が問題となる。Aで降順ソートしておけば、先のBITの参照でB_i=B_jかつA_i\gt A_jの場合がカウントできる。A_i=A_jの場合は相変わらず問題に見えて、l\le i\le j\le rA_i=A_jかつB_i=B_jとするならば、各l\le i\le rに対してまだBITに入っていない分、r-iを答えに加えたい。しかし実は、i-lを答えに加えることにしても値は変わらない。正方形領域に対角線を引いて、その上側を数えたいと思っているが、下側を数えても同じという寸法である。r-iは先を見てみないとわからなかったが、i-lは直前の要素と比較してカウンタを弄ることで容易に求まる。

Aを昇順ソートにすることを考えよう。実はこの場合も先ほどとほとんど同じ理屈が通用する。l\le i\le j\le rB_i=B_jとし、さらに(l\le)l'\le i\le j\le r'(\le r)A_i=A_jであるとする。各l'\le i\le r'について、BITを参照することで等号が成立する部分のi-l'+1個が答えに加えられる。残りは等号成立がr'-i個あって、さらにstrictに大きい要素もr-r'個ある。足し合わせてr-i個を新たに答えに加える必要があるが、これを先ほどの正方形領域の上下の話からi-lに読み替えることで、相変わらずカウンタを弄ることで求められる。

日付が変わってから、アドベントカレンダーの記事に着手した。とりあえず読書記録を手作業で集計してグラフを作成した。自分が読んだ本のレーベルごとの分布は個人的にかなり気になっていたが、題名からレーベルを思い出すことができない本がかなりあって、実際に本を読むときはあまり意識していないんだなあと感じた。各レーベルごとの本のリストも作成して、いよいよ記事の本題と目している、今年読んだ本から印象に残っているものを選ぶ作業に入った。とりあえずいくらか抜き出し少しだけコメントをつけ始めた段階で、思ったより大変なことに気づいたので、今日はここまでとした。

本のリストは長くなるので、折り畳みメニューをググってコピペしてきた。折りたたまれる文中に改行が効かなかったので焦ったが、HTMLを直書きしていると考えれば素直に<br>を使えばよかった。

布団に入ってなろうを読み始めたが、午前5時過ぎに寝落ちした。

12/14(火)

午前10時くらいに何かの検査で来客があって起床した。そのまましばらくなろうを読んでいて、午前11時半に再度入眠した。午後7時半起床。久しぶりに満足感のある睡眠だった。

チュウニズムで、代行により取得された皇帝の称号が剥奪されたという告知がなされた。代行を判別する方法としては、例えば離れた場所でのプレイ記録の間隔がどう頑張っても移動不可能なくらい短いと黒、というものが考えられる。もちろん何か一般プレイヤーに隠された情報が収集されているのかもしれないし、そうでなくてももっといろんな方法で検証しているのだろう。どういう判定をしているのか気にならないといえば嘘になるが、競技プログラミングにおける不正検出などと同様、広く公開してはいけない性質の技術になる。

日付が変わるまで一所懸命ととりにゃあアドベントカレンダーに向けた記事を書いていた。結局30分ほど間に合わなかったが、どうしようもない。買った本に関しても集計を行ったが、これに1時間強かかっている。しかしこれだけ時間をかけたとはいえ、249アイテムを分類してそれぞれの個数を数え、和を取ったときに、見事249に一致したときはちょっと感動した。ミスをしなかったということ。

kotatsugame.hatenablog.com

本に付けたコメントには、結構力が入っている。設定に少し触れた後、自分が何に惹かれたのか・どういうところが特徴的だと感じたかなど、とにかく自分の印象を言語化することを意識していた。これは僕のブログ記事であるから、ストーリーの通り一遍の説明などではなく、僕の気持ちを書くべきなのだ。またその中でも、同じ表現がそう連続することはないようにしているつもりだ。

今週のPythonの課題を熟した。今週は音声データを離散フーリエ変換してスペクトル分析を行うというもの。今週は結構難しく感じた。なんの断りもなく離散フーリエ変換後の配列の後ろ半分を無視しているが、実際に試してみるとその部分は前半部分を逆にしたような値になっていた。式を改めて確認すればそれはそうという感じで、三角関数\sin(-\theta)=-\sin(\theta)とか\cos(-\theta)=cos(\theta)とかの話。課題は、具体的にはスペクトル分析を行って音声の音階を調べよというもので、やってみると見事に倍音も検出してくれてかなり上手くいったという気分になった。

なろうを1作読了。「鷹は瑞穂の空を飛ぶ~プラスチックの専門家が華族の娘に転生したので日本は化学立国になります~」。

https://ncode.syosetu.com/n1453gs/

良かった。逆行転生し、日本の政治・経済・軍事に未来知識でテコ入れする系の話はいくつか読んでいて、これもその一つになった。タイトルにもあるように、この作品における未来知識は主にプラスチックに関するもので、化学的な説明もそこそこ挟まれる。そのあたりはシュッと読み飛ばしてしまったが、それ以外にも主人公が幼いころから積極的に表舞台に立てていること、またかなりのスピードで年齢を重ねていくことも特徴的に感じられた。他の作品では、幼い主人公は陰から操る(しかない)ことが多いように思うし、ずっと少女時代を描いているが、こちらは最新話までに出産をも済ませている。

ちょうど日付が変わってからTCB43が開催されていたようだったので、参加した。例によってこの日記が公開される頃には終了しているイベントなので、ここに結果と所感を書いておく。

https://techful-programming.com/user/event/2394

5問目まではよい。6問目は答えがAB未満になるという事実だけ覚えていた。証明をつけるのに少しだけ手間取ったが、とにかく線形結合で表してから、AB以上の値ならABの係数をうまくずらすことで同時に非負整数にできるということが言える。7問目は文字列長が長いのを見落として1ペナ。8問目はNからどれだけ離れるかを考えると、だいたい\sum_{k=1}^N(N+k-N\bmod k)になる。kNの約数の場合はずれるが、それは個別に計算できる。あとはN\bmod k=N-\lfloor N/k\rfloor kの和だが、これも商でまとめるテクで計算できる。

9問目は非常に難しかった。2時間半ほどかかり、ペナこそ付かなかったもののタイムボーナスはびた一文も残らなかった。行列式の求め方はいろいろあるが、ここではすべての置換を渡る和で計算することにする。和を取る値は積の形をしているので、行に対して列を選ぶと考えるならば、置換\sigmaであって\sigma(i)=i+pまたは\sigma(i)=i+qなるものだけを考えればよい。\sigma(i)を選ぶと\sigma(i+q-p)も決まるので、結局g=\gcd(pq,q-p)個それぞれの行き先を考えればよくなった。あとは置換の符号を求める必要があって、とりあえず2^g通り生成した後転倒数をそれぞれ計算してみたが、各置換に対してO(g)からどうにもうまくまとめられない。各行の形が3種類に分かれるはずだが、それぞれの幅がgの倍数でないのだ。

かなり長い間悩んでいたが、行列をいくらかずらすことで解消された。左にp回シフトすることで、行列式(-1)^{p\times(pq-p)}倍しつつ対角成分をすべてpにできる。この状態で考えると、行の形は上からpq-(q-p)行とq-p行の2種類に分かれてかなり扱いやすい。丁寧に丁寧に計算すると、結局転倒数に関係あるのはg個のうち何個を+pにしたか(今はずらしたので+0にするか)だけだとわかって、二項定理で閉じた式になる。無事愚直解とも一致してAC。

10問目は解けなかった。本当に何もわからない。N=1のときの答えは\frac x{1-x-x^2}x=\frac 1 Mを代入すればよいとわかって、それだけ提出したが、M=0にやられた。再度出しなおして、あとからN=0の場合もわかることに気づいてもう一度出した。13点である。

朝になって業務上のやり取りが可能な時間になったので、2時間くらい進捗を産んでいた。タスクが片付いてスッキリしたが、生活リズムが崩壊している。学食に行って昼食を摂り、注文していた本を受け取って帰宅。午後3時過ぎまで日記を書いていた。

1週間くらい前に何とか終わらせたと思っていたタスクだが、僕が完了後の操作を間違えていたらしく、今までチェックに回されていなかったらしい。あまりにも申し訳なさすぎる。1週間なにも音沙汰がなかったので、もっと早く違和感を覚えるべきだった。連絡に対して謝っては見たものの、最早どうしようもない。次から確実に成功させていくしかない。

午後4時就寝。

12/15(水)

消えた。

12/16(木)

12/15の午後10時半くらいに目を覚ました。

「やばいクレーマーのSUSURU TV」がネット流行語にノミネートされていて、SUSURU本人がトロフィーをもらっていた。これに対して「本人は何もしてないのに」などのコメントが見られたが、個人的にはその批判は当たらないものと思う。もちろん本人ver.を歌った動画をアップロードしたというのもあるが、そもそも対外的にこのコピペを許容するような振る舞いをしてくれたことに、並々ならぬ価値があるものだと考えている。それに、もともとの流行語大賞についてもネタ元ではなくネタの対象となった人物に対して賞を与えるような性格があったと記憶している。

そのままずっとハーメルンを読んでいて、午前2時前に読了。「ハンターズギルドは今日もブラック【未完】」。主人公がG級に上がってからの話はかなり好みだった。

syosetu.org

しばらく別のハーメルンを漁って、午前3時に再度就寝。続いて午前8時半にまた目を覚ました。しばらくハーメルンを読んでいたら寝るタイミングを逃し、ゼミの友人から連絡がきたことをきっかけに起床することにした。午前10時半だった。

夜から宅飲みの予定なので、念入りに部屋を掃除していたら、正午を回ってしまった。急いで家を出て、ゼミ後そのまま市街地に出ることを見越して地下鉄で山に登る。学食で昼食を摂っていたらゼミに3分ほど遅刻してしまい、また寝坊かと心配をかけたらしい。3分程度の遅刻では先生からのお咎めはなしだったので助かった。今日のゼミは4限から集中講義があるらしく、1限ぶんで終了。来年一発目の発表者は僕らしいので、なんとか頑張りたい。

ゼミ後、予定通り市街地まで出てゲーセンに行き、新曲を埋めた。目立った成果はなし。午後5時になってディズニーストア前に行き、ホスフィンとたいぺーと待ち合わせして焼肉屋に行った。

僕は焼き鳥を食べたいと思っていたが、他の2人に夕食として焼き鳥屋を選択する発想がなかったらしく、こちらになったという経緯がある。店はリーズナブルでよかったもののサワーを頼んだのは失敗だった。味もアルコール分も薄くただただ腹を壊すだけ。実際家に帰ってからしばらくトイレにこもることになった。1年前に焼き肉を食べて腹痛に苦しめられた経験から、今日はかなりしっかり肉を焼いたし、生肉をつかむトングと焼いた肉を食べる箸を明確に使い分けていたので、腹を壊したのは単純に飲み物を多く飲んだからだろう。

日記(2020/11/06)あるいは僕が深夜に救急車を呼んだ話 - kotatsugameの日記

ドンキで酒とつまみを購入し、3人で僕の家に行って飲み始めた。そのようなことをするのは、今年の07/22以来だ。前回、途中でお酒が切れたという記憶が強く残っていて、今日は途中で絶対になくならない量を買ったのだが、さすがに多かった。

結局右から3本は手つかずに終わってしまった。右から4本目の日本酒は味に慣れないので敬遠していたが、ホスフィンにコーラと混ぜて飲むやり方を教えてもらい、これがかなり飲みやすくて驚いた。左から3本はどれも牛乳で割って飲むもので、金色のボトルのものが前回非常においしかったため今日も購入。しかし飲みやすさという点ではやはりというか、カルーアミルクが一番だった。正直これだけ飲んでいても満足なくらい。

最初はアニメを見ようとしたが、冷静になると1クール見るだけで今日が終わってしまうので、結構気合いがいる。適当なものを1、2話見て、これ止めようか……みたいなことを繰り返した後、結局前回と同じくそれぞれがおすすめの動画を紹介することになった。前回はノートパソコンを使ったが、今回はデスクトップパソコンを使った。机の高い位置にモニターを増やしたので、そこに映せば床に座りながら見られるだろうという考えだ。画面の文字が小さくて操作はしづらかったが、動画自体はいい感じに見ることができた。

お互いのネタも切れたところでナブラ演算子ゲームを始めてみたものの、3人でやると誰か1人を負かすのが躊躇われて、ダラダラ続くうちにたいぺーが寝てしまったので終わりになった。また動画を流すフェーズに戻る。何かボードゲームの1つでも用意しておいたほうがいいのかもしれない。買ってきた牛乳3Lがなくなって、コンビニに少し買いに行こうかという話をしていた記憶を最後に、僕も眠りに落ちた。最後のツイートは午前4時半だった。

12/17(金)

午前7時半ごろに目を覚ました。微妙な気分の悪さはあるが、頭痛や吐き気はない。昨晩ホスフィンがキレートレモンをくれたり、お茶を出したりとコントロールしてくれていたからだろう。部屋の後片付けをして、ホスフィンは早々に帰っていった。たいぺーはまだ帰らないようだったので、2人でベッドに並んでもう一度眠ることにした。

午後1時過ぎに起きて、たいぺーも帰っていった。僕はまだ眠るつもりだったが、インターンの業務で連絡が来ていることに気づき、通話などしていた。進め方にいろいろ間違いがあったらしく、チェックの方に迷惑をかけてしまい申し訳ない。ただ、一概に僕が無能というわけでもないと思っている。あまり細かいことをここに書くのはよくないのでぼかすが、知らされていないことは知らないのだ。午後4時頃に再度就寝。

午後9時半起床。元気が出ず、ずっとパソコンを触りながらボーッとしていた。日付が変わったあたりで気合を入れ、とりあえず酒瓶を捨てた。

僕の「おすすめのなろう小説まとめ」を見ている人がいるらしい。最近更新していないなと思ってざっと眺めているうちに、うっかり1作読み始めてしまった。「比企谷八幡 「・・・もう一度会いたかった」」の中盤から終盤にかけてを再読した。かなり面白い逆行モノ。巻き戻る前に身につけた能力を活かすタイプの話が好きである。なぜか逆行転生と言ってしまいそうになるが、転生するか転移するか憑依するかは様々であるため、「逆行」とのみ言うほうがよさそうだ。ネット小説を検索するときもそうするべきかもしれない。

syosetu.org

kotatsugame.hatenablog.com

その後朝方まで日記を書いて、午前6時過ぎに布団に入った。窓の外を見ると雪がうっすら積もっており驚いた。まだ原付のタイヤ交換をしていない。去年はそもそも原付に乗らなかったので交換しなくても問題なかったのだが、今年はゼミに行くのでちょっと考える必要がある。それとも、週に1度ならウン千円払うほどでもないだろうか。

布団でラノベを1作読了。「西野 ~学内カースト最下位にして異能世界最強の少年~」8巻。7巻を読んでから15ヶ月経っており、内容をあまり覚えていない。前に読んだとき、下のようなことを日記に書いていたが、直後に放り出してしまった。相変わらず設定は面白いが読むのがつらい。主人公の言動が見ていられないのと、登場人物の行動原理が全部性欲絡みなのが肌に合わない。しかし設定は本当に面白いのである。

4巻で止まってしまったのは、そのときは主人公の扱いのあまりのひどさに辟易してしまったからだった。今はまた面白いと思って読んでいる。9巻まで出ていて、ちゃんと全部買ってあるので、今度は一気に読み切りたい。なんだか自分の中で評価が定まっていないので、またいつ放り出すかわからない。

週記(2020/09/07-2020/09/13) - kotatsugameの日記

読み終わったらちょうど午前10時半だった。HTTF2022本選のオープンコンテストに出た。

HACK TO THE FUTURE 2022 Final (Open Contest) - AtCoder

rFまたはlFを連打した後、まだ行っていないマスであって最も少ない操作回数でたどり着けるものに向かう、ということを繰り返し、しばらく1位に立っていた時間帯もあった。最後に、ループに入ってからもしばらくrFやらを連打しておくことで後の移動回数を少なくするというものを提出し、11064913点。正午過ぎに出したこのスコアはそのとき3位だった。

午後0時半就寝。

12/18(土)

午後9時起床。マラソンが終わっていた。

寝る前の提出は40位まで落ちていて、一位は僕の5倍以上の点数を出しており、非常に驚いた。ちょっとTLを見た感じ右手法と左手法を繰り返すのがよかったらしい。それぞれRllFLrrFである。自分はRlFLrFを試して、全然よくならなかったのを見てやめていたが、それは右手法でもなんでもなかったのである。

午後10時5分からTROC #24に出た。前回#22に出てからおよそ3か月ぶりのようだ。

https://tlx.toki.id/contests/troc-24

Aはよい。Bは全然わからなくて焦るが、符号の変化だけ見てみると高々2種類しかないことに気づけた。Cは左から貪欲に10に変えるか、右から貪欲に01に変えるのがよいとわかるので、左右それぞれ何回操作するかを全探索した。

Dは結構面白かった。ある範囲に存在する辺の本数は、使われている頂点数に、その範囲の境界を跨ぐ辺の本数の半分を足したものになる。このことは、境界を跨ぐ辺をペアにしてループをたくさん作るとわかる。N\times Nのマスを適当に2分割してそれぞれ聞くと、その答えの和から全体の辺数N^2-1を引くことで境界を跨ぐ辺の本数がわかり、この情報から2分割されたどちらに使われなかった頂点が存在するかわかる。あとは縦横それぞれ二分探索すればよい。

E1は、移動中の各マスに対して隣接しうるマスを列挙し、それぞれどの移動のタイミングで隣接しているかを求めた。これは区間になっていて、対応する頂点も区間になるため、imos法で足せる。E2はかなり悩んだが、先ほど求めた情報から各移動ごとにどの人にどれだけ寄与するかを差分更新で配列に持ち、実際にO(NQ)かけて足したら間に合った。実際、配列を別の配列に足すような形で書けるので、ベクトル化がかなり効くのだろう。

E2まで解いて9位、レートは2596→2651(+55)と最高値を更新した。E2の公式解説はbitset解だった。確かに、マスに対して何回目の移動で隣接するかを考えれば、shiftとcountで計算できる形になるようだ。一方、僕のような方法もベクトル化が効いて通るということが言及されており、なかなか攻めた出題だったと感じる。

TROC直後からECR119。コンテスト終了時点で全完2位である。

Dashboard - Educational Codeforces Round 119 (Rated for Div. 2) - Codeforces

AはNが1つだけかどうかを判定する。Bはやるだけ。Cは連続する*を何個のbに変換できるかで置き換え、後ろが何通りあるか見つつ先頭からbを増やしていくというもの。実は後ろからxのあまりを取りつつ求めることもできたようで、そちらはかなり頭が良いと感じる。Dは最大値で場合分けで、最大値を3で割ったあまりが0か2なら簡単、1の場合は3+1を除けば2+22+1+1を判定する必要があって、それだけは実際に試してみた。Eはクエリを後ろから見ればUFすら必要なかった。

Fは、二部グラフに分解した後を考えると、同じ側に属する頂点たちの間に辺が張られていないという条件から、並べたときに単調増加になっているとわかる。つまり単調増加列2つに分解できればよくて、これは末尾の値の組として(-p,\ast)(+p,\ast)の2状態を考えたとき、それぞれ\astに適する最小値を持つdpで計算できる。Gは包除原理をゼータ変換で行うだけ。

Fで2^{23}\times 26要素のint型配列を宣言したのだが、これをvectorで行ってMLEしたという話を見聞きした。グローバル変数でないと持てないようだ。通常のローカル変数宣言だとスタック領域に取られて、それだと当然ダメなのだが、vectorは調べるとヒープ領域に取られるらしく、そちらでもダメであるというのはびっくり。グローバル変数は先の2つとも違う静的領域に取られるが、それぞれどのくらい違いがあるのだろうか。

朝までずっと日記を書いていた。布団に入って、金曜日の日記に書いたように「逆行」タグでハーメルンを検索し、見つけたものを読み始めた。これがかなり面白く、そのまま正午過ぎまで読みふけっていた。午後0時半就寝。

12/19(日)

午後8時半起床。かなり眠く、布団で10分ほどゴロゴロしていたが、この10分のせいでせっかく弁当を温めたのにABC前に食べきれそうにない。手を付けないまま放置して、午後9時からABC232。

M-SOLUTIONS Programming Contest 2021(AtCoder Beginner Contest 232) - AtCoder

Aはどう縮めたものかわからずとりあえずPerlで出したが、dcでただ?と読み込むだけでよいことに気づいて出しなおした。以降はC++。Bは先頭の差を見て、残りと一致するか確かめた。Cは順列を全探索。Dはやるだけで、400点である意味が分からずちょっと怯んだが何事もなく通った。Eは難しい。縦と横にそれぞれ何回動かすか全探索かと思って適当に書いたが合わず、細かく係数を考えているうちに4通りの状態を持つdpを思いついた。Fは順当にbitDP。

Gは難しかった。まずB_iの値でソートしておく。今ある頂点iにコストcでたどり着けたとすると、A_i+B_j\ge Mなる最小のjを取って、k\lt jに対してはc+A_i+B_kk\ge jに対してはc+A_i+B_k-Mで移動できる。dijkstraっぽく考えれば、とりあえず今興味があるのはk=1,jのみであるとわかるためそれを優先度付きキューに入れて、さらにk=i+1も入れるとよいだろう。コストを更新する必要があって、範囲chminに見えて面倒そうだが、逆転の発想で1点更新区間minによって取得できる。範囲k\dots Nに対してchminするのは、インデックスkに値を入れて範囲1\dots i区間minで取得するのと同じということ。実装上はまだ到達していない頂点をsetで管理して、k=1,j,i+1の代わりにそのlower_boundを使ったりしていた。

kanpurinさんのユーザ解説を読んで知ったが、これはそのままグラフを陽に作成してdijkstraできる。iからは1,j,i+1にそれぞれ辺を張り、コストは先ほど述べたものと、i\rightarrow i+1に対してはB_{i+1}-B_iを割り振るとよいようだ。正直自分のコードの計算量解析もよくわかっていなかったが、このことからそうひどいことにはならないと予想がつく。

Hを読んで、嫌そうに見えたのでしばらくBコードゴルフをして、戻ってきたら解けた。残り15分程度でそこそこ重い実装になりちょっと絶望していたが、書いてみると結構すんなりいって、しかも一発で通った。問題文中の「この問題の制約下において解は必ず存在することが証明できます」が肝で、ならば問題の制約を崩さないようにマスを狭めていけるのではないかと考えた。実際、縦と横がそれぞれ3マス以上存在するとき、左上からスタートして左下に行き1マス右に進むルートと、右上に行き1マス下に進むルートのどちらかは必ず通行可能である。そしてどちらも縦または横を1マス狭めつつ、適宜回転・反転することで左上からスタートする状態に直せるため、再帰的に解ける。あとは縦または横が2マスの場合のみで、これも適当にひっくり返すと縦が2マスと決め打ってよく、ここまで絞れば十分場合分け可能であった。

全完12位。学生6位に見えて絶望。Hを見ていったん絶望するフェーズが完全に要らなかった……。

コードゴルフ。Aは速度で負け、意気消沈。僕の1回目の提出から7秒後に最短コードが出ているので、無難にPerlを投げた時点で負けが確定していたようだ。どうせ迷った時点でFAは取れないのだから、落ち着いて考えてみるべきだった。BはRakuで書いたらVimに負けた。CはRubyで、負けたかと思ったがto_ihexに変えて縮め返した。1桁の整数ならhexで読んでも変わらないというのは久しぶりに見るテクな気がして、どこかに縮め忘れているものがあったような感覚があり、恐ろしい。DもEもRubyで、Eは縮められてしまったのでVimに移ってまた少しバトルし、今のところ最短を保持している。VimRubyコードを書くと縮むのはいいのだが、普段のコードゴルフと全く別のことをしている気がしてかなり疲れる。Fはすでに提出されていたRubyコードを眺めていたが縮まず、以降は手付かず。

午後11時半からCodeChef、December Cook-Off。いつの間にかSnackDownの最終予選の結果でレートが変わっていて、2463→2571(+108)と赤になっていた。たった3か月、6回のコンテストでたどり着けてホクホク。

https://www.codechef.com/COOK136A

BINSTRGAMEは、隣り合う文字が同じ位置を1か所か2か所選んで消すという操作に言い換えられるので、1手で1個か2個石を取れる1山のNimになる。考察自体は一瞬で終わったが、典型の積み重ね、それも思いがけないところからゲーム問題に飛ぶもので結構面白かった。RGBCONSTはしばらくいろいろ試していたらR+G\ge Bで構成できることに気づいた。Bと何かをペアにして、RBGBを1つつないだ後、残りのRBは先ほどつないだGBにつなぐ。逆もそうである。この条件の必要性は、ある頂点に直接つながるBが2つ以上存在できないことから言える。

BREAKBALは、どれか1文字だけを動かすのが最適ではないかとかいろいろ考えていたが、結局やりたいことはある区間に存在する')'をできるだけ前に持ってくることで(中途半端な位置で止めるくらいなら動かさないほうがマシ)、必要なだけの')'が用意できる区間は尺取り法で求められ、各区間での操作回数は01列の転倒数になるためセグメント木に乗る、ということで操作の最適性を考察する必要性はなかった。DESTRUCTは3山くらいまで手で試した感じ1の個数が重要そうで、その情報を持って実験を回そうとしたとき、そもそも山の個数が1000以下なのだから全部計算できるということに気づいた。ちなみに実験結果には規則性があるようだった。1の個数だけで決定できるかは示していないが、投げたら通った。残り時間はANGSPLITを考え続けて終了した。

4完42位。ANGSPLITが解けなかったのが痛い。前回SnackDownのときは40位で入赤したので平気だろうと思っていたが、今回は強い人が少なかったのか2571→2516(-55)となってしまった。レートの変動幅が大きすぎる。赤になるのが速かったのも、このvolatilityの高さが原因だろう。次回失敗したら赤から転げ落ちてしまうようだ。なかなか気が抜けないコンテストサイトである。

TCB43が終了していた。12位だった。賞金圏内から転げ落ちてしまった。1ペナさえなければと悔しい思い。それにしても10問目を解いた人が6人もいて驚きである。へのk氏から「高度知識ではない」という助言をもらったが、コンテスト中に考えているうちに自力では解けないと屈服してしまったので、解説が公開されたら読むようにしたい。

昨日布団で読み始めたハーメルンを読了。「クラップスタナーは2度鳴る。」。暗殺教室の二次創作で逆行モノである。非常に面白かった。原作前、本校舎での話は、原作で描かれた描写を深堀りしてそれっぽい設定がいくつも付け足されており、読んでいて感心した。また主人公のチートっぷりも好み。

syosetu.org

暗殺教室は漫画を全巻持っている。文章を読むと、その場面のコマが思い出せたりして、かなり懐かしい気持ちになった。しかし漫画の表現によるギャグを文章で再現するのは難しそう。ほぼ同じコマが2つ続けて描かれて、2番目のコマではキャラ達が殺せんせーの超スピードにより奇抜な格好をさせられるというギャグがたびたび登場するが、文章ではうまく切れ目を作れていないように感じられた。

しかしそれにしても、浅野学秀というキャラはこんなに印象が良かったのか。登場時は純粋な敵キャラだったが、原作でもたびたび描かれ、だんだん彼の人となりというものがわかってきて、卒業式における行動で決定的に味方になったという記憶がある。まあそれにしてもこの作品ではデレすぎに見えるが、二次創作なので全く問題ない。こういう浅野学秀も好きだ。

逆行モノを探していたはずが、暗殺教室の面白さを再発見してしまった。さらに1作、「『暗殺教室RPGRTA 殺せんせー札害チャート」を読了。RTA形式というのはハーメルンに特有の形態だと思っていて、文章になった淫夢語録がちょっとキツくて敬遠していたが、それはそれとしてかなり面白かった。もしかして、RTA走者の軽薄な描写と、それを原作キャラの視点から見るギャップを楽しむものだろうか?そういう第3者視点で主人公の凄さを語るシーンは僕の好みのものだ。勘違いモノとかもそういうシーンを楽しみに読んでいる向きがある。

syosetu.org

yukicoderのテスターを1件行った。

本当は12/20の夜まで起きているつもりだが、このあたりで日付を区切っておく。今週水曜日は遠慮なく消し飛ばしたのに来週月曜日は消し飛ばさないのか、という非対称性はあるが、週記という性質上仕方のないことである。