週記(2023/07/24-2023/07/30)

07/24(月)

午後4時半起床。インターン先の定例会に参加した。

自分が今取り組んでいるタスクは会社にとってそこそこ重要らしい。最近集中講義だったりであんまり稼働できておらず申し訳ない気持ちになった。機械学習だから学習の準備さえ整えればあとはGPUをぶん回すフェーズで稼働時間が少なくても何とかなるものと思うが、そこまで行くのがまず難しいということに最近気づき始めている。

勉強会は変分法というテーマでオイラー方程式の導出と最速降下線に関するちょっとした計算が紹介された。オイラー方程式を真面目に解いて最速降下線の式を立てるのは発表ではスルーされていて、実際にやってみようとしたらよく分からなくなってしまった。調べるとベルトラミの公式というものを使うのが簡単らしい。この公式の導出を確認した後、実際にそれを使って立式した。微分偏微分の扱いがあやふやなのであんまり自信はないがとりあえず正しい結果が出て満足。

終了後はずっと週記を書いて、日付が変わるギリギリで投稿した。日曜日のCFだけ穴あきになっている。

疲れたのでハーメルンに移行。まず「黒き太陽は神無き聖地にて一人輝く」を読んだ。これは先週の週記で言及した削除済みの作品だが、どうしても気になったのでGoogleのキャッシュから読んだ。

数日前に日間ランキングで見つけて読もうと思っていた作品が消えていることに気づいた。ワンピース世界に古龍をクロスオーバーしたものだったはず。

週記(2023/07/17-2023/07/23) - kotatsugameの日記

低評価や否定的な感想が大量に来て作者のモチベがなくなってしまったようだ。序盤も序盤で終わっており、この先どういう展開が予定されていたのかさっぱりわからない。もっと言えば設定が圧倒的すぎてこの先どうやったら話が展開するのかすらわからなかった。つまり続きを妄想することができず、どうしようもない。

syosetu.org

次に「美少女に転生したので配信者になりますっ!」を読了。チート能力+配信でまず設定が大好物。展開も好みだしチート能力の活かし方にもバラエティがあって非常にワクワクできた。面白い。

syosetu.org

週記のCFの部分を追記した後、朝方から午前11時までインターンの作業を行った。最近まで関わっていたタスクで使っているツールを別のところでも使いたいらしく、木曜日に説明のためのミーティングが入った。その準備として今日は、かなり特殊化されたコードを書いていたのを設計から見直して少しだけ一般のケースに対応できるようにしたり、ちょっとしたドキュメントを用意したりした。

7月末~8月に刊行される新刊を29冊注文した。なんと幼女戦記の13巻が出るらしい。12巻からは3年半空いたようだ。実は途中から積んだままなので、12巻で完結なのかとも考えていた。

www.kadokawa.co.jp

しばらくラノベを読んで時間を過ごし、3限が始まった後に学食に向かった。冷やしラーメンを注文しようとしたら直前で売り切れ。仕方なく熱いラーメンを注文したが暑い中で熱いものを食べるのは予想以上に辛かった。

帰宅してすぐ就寝。おそらく午後2時過ぎだったはず。

07/25(火)

午後7時から1時間の間起きてハーメルンを読んでいた。「美少女に転生したので配信者になりますっ!」の今朝方更新されていた分が改稿されたようだ。感想にいろいろ意見が来たらしい。自分はそういう展開もアリかとすんなり流した部分だったのでちょっと驚き。改稿前後でどちらが良いかというのはまあ正直どちらでも楽しめただろうが、ただ一点作者の下書きが無意味になったということで更新速度が落ちそうなのは残念。

二度寝して午後10時半起床。ABC307の賞品のアマギフが届いていた。ABC299、ABC304と2回連続でUnratedの憂き目に遭った東京海上日動プログラミングコンテストだが、ついにRatedということで東京海上日動からメールが届いていた。ABC299の賞品はAtCoderが補填しており、AtCoderから(Amazon経由で)送られてきたのだった。ABC304は順位が低かったので知らない。

午後11時半からCF #888 div.3に出た。ゾロ目回だが特にそれっぽい問題はなかった。

Dashboard - Codeforces Round 888 (Div. 3) - Codeforces

Aは|H-h_i|/kが整数で、m-1以下で、かつ0でないようなiを数える。最後の条件は二人がエスカレーターの異なる段に立つという制限から。

Bは条件を「偶奇が異なる」と誤読していてひどい目に。この場合は偶数と奇数が両方あれば好きにswapできる。正しい問題については偶数と奇数それぞれでソートするのが最適で、そうした後全体でもソートされているかを見ればよい。

Cはc_1k個辿った後c_nk個辿ればよい。切り替わる箇所を全探索して、左右からk個ずつ取れるか見る。これは前計算でできる。c_1=c_nの場合は全体から\max(k,2)個取れるかチェック。

書く:CF 888

www.youtube.com

その後は昼までラノベを読んでいた。2冊読了。

1冊目、「魔王2099」3巻。以下のような経緯があって楽しみにしていた作品だが、結局買ってから一か月ほど放置してしまった。気持ちが離れたか、400ページ超という分厚さにひるんだか。また、2巻までは非常に面白いという評価をしていたのに、この巻に対しては残念ながらそこまで強い感情を抱けなかった。

折り込みチラシで「魔王2099」のアニメ化を知りひっくり返った。2巻が出てから2年近く新刊がなく打ち切りだと思っていたところ、最近3巻が出ると聞いて非常に嬉しく思っていたが、それどころの話ではなかった。

週記(2023/05/22-2023/05/28) - kotatsugameの日記

今回は主人公ではなく仲間の一人「高橋」がメインだった。彼女の視点から見る主人公もなかなか味わい深い。主人公にかなり重めの信頼を向けていたり、翻って自分の能力について卑屈になったりしていた。信頼関係についてはもっと広く、仲間内でのものが特にクライマックスのシーンにおいてかなり強調されていたように思う。仲間を信じて自分の役目をひたすらに果たす様は読んでいて心地よかった。

2冊目、「迷子の女の子を家まで届けたら、玄関から出て来たのは学年一の美少女でした」。内容云々の前にちょっと文章がひどすぎる……。112ページ、バイトで注文を取りに行く描写の後に制服に着替える話を入れている。182ページ、「なぜ、彼女の友達が男なのか聞いたのかわからなかった」とあるが聞いていない。他にも夏祭りで焼きそばのあーんをしてもらった少し後に二人で焼きそばを食べるシーンが別で入ったりと、読んでいて違和感を覚える箇所が多かった。

カクヨムの書籍化ということだから元々はどうなっていたのだろうと見に行ったのだが、そもそも内容が本とまるっきり違っていてびっくりした。書籍化にあたってかなり大規模な改稿が行われたようだ。それでいろいろ書き足したり、順番を入れ替えたりした結果として上のような壊れた文章が出来上がるのはちょっと納得できる。ただしそれが校正を通って本になっているのは信じられない。

もう1冊読み始めたが眠くなってきたので途中でやめた。

収益化の申請が通った。広告の種類を設定するところで動画の前・途中・後に流れる広告をオフにしてみたが、これで本当に広告が消えたりするのだろうか。

午後2時半就寝。

07/26(水)

午後8時から2時間ほど起きてなろうを読んでいた。再度寝て、今度は午前0時に起床。

「現代転生した元魔王は穏やかな陰キャライフを送りたい!」を読了した。なかなか面白い。主人公が前世の力をあまり躊躇せずに使ってくれて爽快だった。主人公の一人称視点だがヒロインに地の文が聞こえたりとメタっぽい描写が頻繁にあったのは少し気になる。それほど好きではないやり方だからだ。

布団から出て食事・シャワーを済ませ、午前5時から5時間ほどインターン関連のコーディングを行った。人間の手で作られたExcelのデータをopenpyxlで読もうとして疲弊。文字や罫線の情報を読むものはすでに存在するが、今回は色情報も必要になって、これが大変だった。なぜ色の表現の方法が何種類もあるのか。テーマカラーのテーブルはなぜ可変なのか。

コードを設計する中でPythonのFlagというものの存在を知った。Linuxカーネルのコードを読んでいるとよく登場するbitでフラグを管理するテクニックだが、Pythonでは公式でサポートされているらしい。先ほど読んだ罫線の情報、つまりセルの上下左右あるいは斜めのどこに罫線が存在するかを表現するのに非常に都合が良かった。

enum --- 列挙型のサポート — Python 3.10.13 ドキュメント

しばらくラノベを読み、正午くらいに就寝。

07/27(木)

午後6時前に起床。月曜日の日記で言っていたミーティングに参加した。

説明自体は一瞬で終了して、では実際に使い始める準備をしましょう……ということで自分がEC2インスタンスを立ち上げることになったが、諸設定を完全に忘却しておりいろいろ確認しながら進めたためこれだけで30分以上溶かしてしまった。それよりは説明の詳細部分についてもうちょっと確認したりする時間を取るべきで、大反省。

直後から30分の1on1。結果だけ見ればインスタンス起動はこのタイミングで行うほうが良かった。時間もないので今週書いたコードをサッと説明して終了。

今日はゲーセンに行く。外出して、まず腹ごしらえで大戸屋に来た。なろうなりハーメルンなりに夢中になっていてこれまで気づかなかったが大戸屋は注文した商品が出てくるのが遅い。その分丁寧に調理しているのかなと思っているので悪い気はしないものの、ゲーセンで遊ぶ時間が削られるのはちょっと考える必要がある。

ゲーセンでは11クレプレイして現在進行中のチュウニズムデュエルを終わらせた。niconicoの譜面をいろいろ触っていただけなので成果は特になし。

午後11時に帰宅。シャワーを浴びて半からECR152に出た。

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

書く:ECR

www.youtube.com

収益化後初めて投稿する動画だが、設定項目が増えていた。収益化のオン・オフと動画にセンシティブな内容が含まれていないかの自己診断。初めてだったので注意深く確認する必要があり結構面倒だった。どうすればいいかは覚えたので次回からはまたスイスイ設定できるだろう。

朝までなろうを読んでいた。「【書籍化】魔力量歴代最強な転生聖女さまの学園生活は波乱に満ち溢れているようです~王子さまに悪役令嬢とヒロインぽい子たちがいるけれど、ここは乙女ゲー世界ですか?~」を読了。

https://ncode.syosetu.com/n8745hm/

今月の初めにTLに流れてきたのをうっかり開いて、それ以来チマチマ読み進め続けていた。面白かった。主人公陣営が強すぎるのでどんなトラブルも早期に解決してストレスフリー。序盤でゲームの主人公が調子に乗った行動をするのには読んでいて苦々しい思いをしたがそれもすぐ済んだ。正確には一つだけまだ片付いていなくて長引きそうな敵もいる。

また投稿ペースも驚異的で、去年の3月からスタートしたのにそれから年末まで1日に複数話更新するペースを保って600話を超えるくらいまで駆け抜けていた。それから書籍化作業で少し休載したり1日1話になったりしたがそれでも十分速い。

少しだけ日記を書いた後、なろうに夢中になっている間溜まっていた別作品の更新分を読んでいた。午前11時くらいに寝落ち。

07/28(金)

午後6時起床。1時間ほどハーメルンを読んで外出。学食で夕食を摂り、仙台駅に向かった。

みどりの窓口で新幹線の切符を購入した。08/10-13を予定している帰省用と8月末のトヨタコンの分である。後者は問題ないが前者はお盆の時期で大変。特に08/13の富山→大宮はすでに満席の新幹線が多く、予定していた時間をずらすことになったが、幸い夜のAGCに影響しないくらいの時間の席を取れた。

その後ゲーセンで閉店まで遊んだ。今日は14+の最近触っていない譜面を手あたり次第にプレイしたが、ほぼ一発なのにポコポコ伸びて非常に楽しかった。合計で8000点弱くらい伸びたはず。AJもMASとULTで一つずつ出た。

日付が変わる前に帰宅。しばらくハーメルンを読んだ後シャワーを浴び、講義の期末レポート課題を確認した。確認しただけで今日は終わり、午前4時就寝。明日はサークルで昼からICPC打ち上げのBBQがある。

07/29(土)

午前7時半に目を覚まし、眠れず期末レポートの課題と講義資料に目を通していた。思ったより何もわからなくてまずい。

3時間くらいして布団から脱出し自転車で会場の牛越橋に向かった。暑すぎるし後輪から空気が抜けていて走りにくい。たどり着くだけでヘトヘトだった。日陰に石でかまどを組んだり、朝市でホスフィンが買ってきた食材の運搬を手伝ったりして、ついに正午からBBQ開始。油がなかったので何もかも素焼きとなったが、案外ちゃんと美味しく食べられるようになるらしい。量は少なかった気もするものの満足感がある。

milkcoffeeさんに作問した中でおすすめの問題を聞いて、yukicoderからXerを解いた。XORだからbitごとに見れば解けて、A&~Xでソートして判定すればよいのだが、解説がシンプルで天才的すぎた。確かに面白い。

No.2024 Xer - yukicoder

午後3時帰宅。シャワーを浴びてしばらくTLを眺め、午後5時から3時間ちょっと仮眠した。起きて食事し午後9時からABC312。

UNIQUE VISION Programming Contest 2023 Summer(AtCoder Beginner Contest 312) - AtCoder

書く:ABC

www.youtube.com

午後11時半からはCF #889 div.1に出た。

Dashboard - Codeforces Round 889 (Div. 1) - Codeforces

書く:CF

A1とA2のみ、559位でレートが2981→2775(-206)。過去最大の下げ幅である。あまりに酷すぎるので録画データは即刻削除した。ということでこのコンテストの実況は投稿されていない。

書く:B・C upsolve

ぐんにゃりして朝までハーメルンを読んでいた。少し日記を書いて午前9時に布団へ。そこからまた2時間ハーメルンを読んで就寝。

07/30(日)

午後7時起床。思ったより眠くて昨日寝る前にハーメルンに熱中してしまったのを激しく後悔した。しかし今更どうしようもないし、これ以上寝ているとAGCまでに眠気を振り払えないかもと思って布団から出た。パソコンの前に座ってさらにハーメルンを読み進め時間を過ごした。

午後9時からAGC063に参加。

AtCoder Grand Contest 063 - AtCoder

Aはk=1,2を実験した。k=1Sの先頭2文字にAがあるかどうかで判定できる。k=2は先頭3文字にAが2文字以上あるかどうかで判定できる。ここで「先頭k+1文字の半分以上がA」がAliceの勝つ必要十分条件でないかと直感した。少なくともサンプルでは成り立つようだ。

証明を試みたところすぐできた。お互いにS_xが相手の文字となるようなxを入れていくべきで、上の条件で勝つとされたプレイヤーがこの行動を取った場合、もう一方のプレイヤーが何をしても自分の勝てるMEXにはたどり着けない。自信を持って提出しAC。

Bはまず判定問題を考えた。スタックを使えばできそう。列を先頭から順に見て、要素aに対してはa=1の場合はそのままプッシュし、a\ge 2の場合はa-1が現れるまでスタックをポップしてトップをaに置き換えるというもの。なければ失敗である。この判定に成功すると実際に列を構成する手順が得られるから、生成可能であることの十分条件にはなっている。

必要条件でもあることを確かめるためとりあえずランダムに列を生成して試してみたところ、正しそうだと分かった。実際、スタックによる判定ではできるだけ小さくまとまった列を作ろうとするから、他に列の生成方法があればその上位互換になっているだろう。例えば12123については(12(12)3)(12)(123)があって後者が選択されるが、そちらでないと(12(123)3)には拡張できない。

あんまり理論的な説明は付けられていないが十分納得はできたから、あとは数えるだけ。Lを固定してR=L\dots Nのうち生成可能でない最小のRR_Lと置くと、判定方法からR_L\le Rではずっと生成不可能となる。

R_LがわかっているときにR_{L-1}を求めてみる。調べるべき列の先頭はA_{L-1}だから、まずこれが1でなければならない。1だった場合スタックに積んで次にA_Lだが、ここからA_{R_L-1}までは生成可能だとわかっている。実はここはスキップできる。スタックの中身はA_{L-1}=1の上でいろいろ変化するだけ、しかも最後にはA_{R_L}のせいで全部ポップされてしまうからだ。

従って「1個入れる」→「LからR_Lまでスキップ」を繰り返すことでかなり高速に判定できそう。より精密には、各要素がスタックに入る回数が高々1回なので十分高速であるとわかる。出したら通った。

この時点で28分とまあまあ順調かなと思っていたのに順位表を見たら80位でひっくり返った。どうやら慎重になりすぎていたらしい。その後C問題に取り組んだが2時間半あっても解けず2完204位。パフォーマンス2348で2年以上ぶりに黄パフォを出し、レートは2883→2839(-44)となった。昨日のCFと同じくらいの大失敗だがAtCoderは失敗に優しい。

解説を見つつCのupsolveをした。早い段階でN+1手の構築はできていたが、そこから1手削る方法を見つけられなかった。いかにもコードゴルフらしいシチュエーションなのに……。考えても考えてもできないので方針から違うのだろうと思ってしまい、集中力を失っていたのが残念。実際にはほとんど合っていた。

まずN+1手の話から。最初にAの重複を取り除いておく。この段階で矛盾したらもう不可能。サンプル4の話だ。そういう自明なNo以外すべて構築可能であるというのは典型的。

操作で自由に弄ることのできる要素は全体の最大値くらいである。また全体ADDで目的の列を作る場合、数列の階差を取って足しながら必要ない部分をリセットしていく方法が一つ存在する。これらを組み合わせると、ABが共に降順になるように並べられれば「A_i\leftarrow 0」と「全体にB_i-B_{i+1}加算」をi=1\dots Nで繰り返すことでBに変換できる。

実際にはAを降順に並べてもBは降順にならないので、適当にK=10^9+1とでもしてKの倍数を足すことで無理やり降順にしておく。最後に\bmod Kを取ることでBが作れるというわけ。また実際に行える操作は「全体ADD」→「余りを取る」で上で述べたものとは逆になっていることに注意。

従って①「(x,y)=(0,A_1)」②「i=1\dots N-1について(x,y)=(B_i-B_{i+1},A_{i+1}+(B_1-B_{i+1}))」③「(x,y)=(B_N,K)」で実現できる。順に「A_1\leftarrow 0とする」「階差を足しつつA_{i+1}\leftarrow 0とする」「階差を足しつつ\bmod Kする」の意味がある。これでN+1手。

ここから削る鍵は、最初の操作のxが今のところ完全に無駄という点にある。これで最後の操作をうまいことカバーできないかとずっと考えていたが、それは不可能。実はカバーできるのはi=N-1についての操作であった。

先頭N-1項に対し上の操作を行うことを考えると、N項目にはB_1足されて最後に\bmod Kされる。ここで最初の操作のxを弄ると、なんとその値がそのままN項目に反映されるのだ。よってx:=(B_N-A_N-B_1)\bmod Kとすれば自然にN項目も揃ってくれる。これで1手削れた。N=1のときだけ別に構築しなければならないことに注意。

www.youtube.com

今日もシナシナになってハーメルンを読んでいた。「貴方は中央トレセン学園から追放されることを希望しています。」を再読。非常に面白い。

syosetu.org

初めて読んだのは1年前であまりウマ娘に詳しくなかったが、二次創作をいろいろ漁ってから改めて読むとキャラクターの細部を想像できるようになっていてより楽しめた。作者がレース描写はあまりやらないと宣言していて、これは確かに特徴的である。

勘違いモノに関する一般論として、周囲の人物と認識に差があるため主人公に真剣さが足りないのが少し気になることがあった。しかしこの作品の主人公はウマ娘に関わる事物に対しては必ず全力で臨むので、そのあたりの心配が一切なく安心して読める。またその姿勢が生み出す勘違いも良質。

古典部シリーズの愛蔵版の第二弾が出版されるらしい。Amazonで注文しておいた。

数時間日記を書いた後午前11時くらいに学食で食事した。ラノベや菓子パンを買って帰宅し、布団に入ってハーメルンを読み午後1時過ぎに就寝。