競技プログラミング

訓練

Notion の問題表に 時系列の view を追加した 。これで正確に振り返りできる。

青 diff DP

青 diff DP を 7 問解いて、 diff 1,600 ~ 1,700 の青 diff DP がすべて埋まった (計 13 問) 。最近の問題ほど、深く考察しなければ解けない傾向がある。自然と Kotatsugame スタイルの怒涛の実装フェーズを再現したくなる。

Haskell では関数適用が右から左に評価される都合上、左から右へ一挙に書くのは難しい。何気ない 1 行でも、式全体を脳内メモリに載せてからコードを書き始める必要がある。

-- 何気ない 1 行 (3 番目に大きい奇数を選び出す)
(VU.! 2) . VU.modify (VAI.sortBy (comparing Down)) $ VU.filter (== odd) xs

まだまだ実装でモタつくし、タイプミスは見苦しい。今回のコンテストでは、淀み無い実装を志したい。

ARC 166

ARC 166 に参加した。

A 問題では操作 3 で文字 A を任意の数だけ右へ動かせることに気が付いた。こうした『ギャグ』らしき着眼点が問われる出題が多そうだ。

B 問題では全探索で TLE となり、丁寧な貪欲法で AC した。 B 問題で緑 diff は珍しい。集合 DP と瞬時に見破って実装した人も多かったようだ。

C 問題は数え上げの問題だった。解説を読んでも詰められない箇所があり、 upsolve できていない。実は愚直解を数列として OEIS に投げれば答えが浮かび上がるらしいが……

B 問題を畳み込み・集合 DP で upsolve した。 \(s \in \mathrm{Power} \{ A, B, C \}\) に大して \(dp[|s|]\) を \(\gcd s\) の倍数がこれまでに存在した場合の最小コストとする。畳み込み操作は新たな数をいずれかの \(\gcd s\) の倍数とすることであり、すべての場合を試して各状態の min を更新していく。

ABC 324

ABC 324 に参加した。 A, B, C の 3 完で大敗だった。

解き方

A 問題 では開始時スクリプトのおかげで Haskell 界の first AC を取ることができた。スクリプトは Misc に記載する。

B 問題 では素因数分解を使ったところ TLE した。素因数分解の最悪計算量は \(O(\sqrt N)\) 程度であるため、 \(N\) が大きいと停止しなくなる。反射で解くなと言われた気がした。

C 問題 では丁寧に場合分けして解いた。 ByteString の関数を調べる良い機会となった。 ByteString 同士の比較には zipWith が役立った。 ByteString の中の 1 文字を除去するためには、まず splitAtspan で 2 分割し、片側から 1 文字消してから再度連結 (<>) すれば良かった。

D 問題 では全探索は定数倍込みで \(O(10^8)\) 程度と判断して避けてしまった。定数倍高速化のため埋め込みを試すも、スタック領域が足りず断念。実は全探索での計算量は \(O(10^7)\) 程度だったため、全探索で upsolve した。 1 桁読み違えてるじゃん〜〜

E 問題 では何重にも誤解があり解けなかった。まず読解の誤りとして、部分列を連続部分列と読んだり、 i, j が互いに異なると思い込んでいた。実装の沼も多く、正しく問題を整理してシンプルに解けるようにならないと厳しい。

別解も確認したい。

振り返り

思い込みの強さが結果に現れた。脱却方法を考えたい。

まず問題に取り組む際は、別人格に切り替えたつもりで考察やコードを確認したい。作家が得意そう。意識すれば習得できると思う。

次に『マスター・オブ・場合の数』を解き始めた。場合の数は、 (答えを見ない限り) 自分が正しい答えを出せたのか検証できない。しかもパターンマッチでは解きにくい。バイアスを免れた明晰な頭脳が要求される訓練になる。

レーティングの上げ方に関して

コンテストの参加回数を増やすほど、レーティングの収束は速まる。つまり ARC に出たほうが速くレーティングが上がると思う。うおお ARC 167 出るぞ

AHC 025

AHC 025 に参加している。 7 時間のコンテストだと思いこんでいたが、 8 日間のコンテストだった。うおお

コンテストが終わるまで感想は書けない。

読書

色々

CAREER SKILLS を 85% まで読んだ (+ 15%) 。 (社会的な) 人間の価値はその人間が作ったネットワークで決まる、など目を背けたくなる話も多いが、エッセイとして読めば楽しめる。 SOFTWARE SKILLS も購入した。

積み本の CRACKING the CODING INTERVIEW をちらちらと見た。最終章の Advanced Topics の中にトポロジカルソートが入っていて、茶色コーダー時代に通った道なんだよなと思う。今読むなら『競技プログラマーハンドブック』の方が面白そうだった。

骨しゃぶり書簡 で渋々おすすめされていた あなたを天才にするスマートノート・電子版プラス を 40% までお風呂で聴いた。プレゼンが上手いので話の構造を抽出してみたい。来週の自分に期待。

そろそろハンズオンもやりたい。 リアルタイムグラフィックスの数学Shadertoy で使われるような full-screen quad のフラグメントシェーダを題材にした本で、ノイズと SDF を扱うらしい。数式で絵が書けると、時間補完で動かせる気がして良さそう。

Haskell で 2D 描画をやるならまず gloss だが、昨年以来更新が止まっている。既に保守モードなのだろうか。

Misc

ナード業務

開始時スクリプト

コンテスト開始時のセットアップ用スクリプトを書いた。僅か 10 秒の差を生む程度で、実用的な効果は無い。一応ソース: go スクリプト (bash)

2023-10-15-go.gif
Figure 1: acc 実行、 tmux の pane 分割、 cd, エディタの起動を 1 コマンドに

AA は figlet が表示してくれた。 figlet は映えるのに、エディタの起動画面で台無しだ。改良の余地がある。

ダークテーマ

ブラウザ拡張 (Stylus/Stylish) でユーザ定義の CSS を追加できる。人が書いた CSS を元に、 AtCoder をダークテーマに変更してみた。

2023-10-15-stylus-for-atcoder.png
Figure 2: ヘッダの border は綺麗にしたい

エディタとのコントラスト差が減り、目に優しくなったと思う。逆にエディタをライトテーマに変えても良かった。

モダンエディタと繰り返し操作

meow / kakoune / helix などのモダンエディタでは、まず範囲選択を行い、次に操作を決める。特に範囲選択はカーソル移動の際に自動で行われるため、 move -> action と称される (Migrating from Vim - Kakkoune) 。

一方 Vim では、操作対象を最後に決める。この操作順序は . キーによる繰り返し操作 (ドットリピート) と相性が良く好まれる。 3 単語消すなら dw.. の 4 タイプ。日常生活が小さなマクロで満ちている。

count? operator count? (motion | text-object)

例外的に visual mode では操作対象を前置できるが、選択範囲が文字単位で記録されるため、『単語』などの範囲情報が持つ意味は失われてしまう。したがってドットリピートと相性が悪く、アンチパタンとして認識されている。

helix

モダンエディタは、 move -> action とドットリピートの折り合いを付けたのだろうか。 helix をエアプして確かめてみよう。

vimtutor 的なものがあった。 Implement hx –tutor and :tutor to load tutor.txt #898

$ hx --tutor

helix では挿入文字や範囲選択をリピートできるが、 Vim の . のように任意の編集操作を繰り返す機能は無かった (#501) 。 wc をリピートしたければ、明示的にマクロをレコーディングするしかないと思う。

Practical Vim の読者としては、ドットリピートの無い環境への移行は考えにくい。その他キー操作も、モードを上手く使ったからこそ Vim よりもタイプ数が増えている。

操作 キーバインディング 備考
行頭へ移動 gh ggoto mode
行末へ移動 gl ggoto mode
1 行スクロール zj zview mode
1 行スクロール zk zview mode

NeoVim が強過ぎて、凄いのが来たという感じではない。ただ開発側は圧倒的に楽しいだろうから、その空気が羨ましい。

その他乗り遅れたものとしては zellijNushell, Pijul などがある。あまり分かったようなことは言えない。

応用情報技術者試験 (AP)

訓練は……無だった。心の病気かも知れない。

午前試験は国語力で乗り切った。他のページに SMTP はメールのプロトコルとあるので除外、のような小細工を重ねると十分解ける。解き方が酷過ぎる。

午後試験では、そもそも出題側が国語力を問うてきた。対応する文章を抜き出せ、行間を読み取れ、問題文を正しく読め。本当にその出題で良いのだろうか。

合格できたかはかなり不安。教本・問題集は買っていたので、追々ちゃんと復習したい。

Blender VSE (video sequence editor)

Blender VSE を動画編集ソフトとして、読み上げ環境を整えたい。

VSE には 32 の channel があり、 channel 上には複数の strip を配置できる。音楽編集ソフトにおける track と parts の関係に似ている。ただし VSE における channel 番号は Z 軸に相当するため、用途だけではなく画面配置に応じて channel 分けをすることになりそうだ。

字幕データは Text Strips として表現できる。字幕データ、あるいは text strip の集まりは、 .srt (SubRip subTitle) ファイルとして import/export できる。これは Whisper のテキスト出力と似ていて、簡単に変換できる。

字幕データが動画の主体となる場合は、アドオンの tin2tin/Subtitle_Editor を入れれば満足の行く UI になりそうだ。この人の Youtube も参考にしたい。

後は字幕を合成音声に読み上げてもらうだけ。リアルタイム再生が理想的だが、text strips を元に audio strips を生成するのでも構わない。 espeak は既にアドオンがあるが、日本語音声が入っていなかった。 VOICEVOXCLI client (非公式?) などを試してみたい。