/ 最近 .rdf 追記 編集 設定 本棚

脳log[20221015]



2022年10月15日 (土) [AtCoder] 今日はパナソニックグループプログラミングコンテスト2022(AtCoder Beginner Contest 273)があった。コンテスト成績証 - AtCoder自分のすべての提出。F 問題に黄色の壁があったからなのかなんなのか、2度目の黄パフォは棚ぼた以外のなにものでもなかったな。AC までにかかった時間が A=1分半、B=3分、C=8分(うち問題文が理解できるまで5回以上読み直すのに体感10分)、D=14分、E=8分なのだから、単に解ける問題を早く解いただけ。せめて時間があるときは壁を越えたい(早解き遅解きでパフォーマンスに報いがないとしても)。■いいパフォーマンスだったので気分良く振り返っていこう。■A 問題「A Recursive Function」。他の人の提出にある factorial という関数名を見て、階乗を求める関数だったと気がついた。N が 1 ギガとかでもなければ定義の通りに実装するだけです。Hash のデフォルトプロックを使って実装した。再帰関数と比べると…… 1.(今回は不要だったけどフィボナッチ数を求める場合などに)自動でメモ化される。2.再帰の停止条件が関数の外に書けてすっきりする。3.(デメリット)呼び出しが遅い。■B 問題「Broken Rounding」。他の人の提出で知ったんだけど、Ruby の Integer は高機能な round メソッドを持っていてそれが使える。そういうメソッドは小数にしか期待していないので知らなかったな。K 回割って K 回掛けて答えを出した。■C 問題「(K+1)-th Largest Number」。問題文が理解できないしサンプルの解説が理解できないし何を出力するのかもわからなかった。嫌がらせなの? 5回以上読み直したし2回は飛ばして D 問題へ行こうとした。問題の輪郭がやっと見えてきても大きい数が K 個なのか K 種類なのかという罠があり、ほんと嫌がらせなの? ひとたび理解できれば Array#tally で得られる数字がほぼ答えだし、足りない 0 を補えばそれが答え。それだけのことをよくも難しく文章にしたと思う。■D 問題「LRUD Instructions」。グリッド問題は制約を一番に見る。すべてのマスをなぞれるのかどうか。今回はできない。壁の数(の上限)がおなじみ 20 万個だから、グリッドはメモリ上に実体を確保せず仮想的な存在にしておき、壁の位置を扱いやすく蓄えてそれを処理対象にする。行ごと列ごとにソート列として持っておいて二分探索をする。変数名について。他の(複数の)人の提出を見ると、ある行にある壁の座標(列番号)列を蓄えるのに R や R の付く名前を使っていた(列に対しては C が付く名前)。こういうデータとアクセス方法になる。R[r1] = [c1,c2,c3] Ruby の AC 提出を順番に見ていったけど、独特な例外を除いてほぼそういう、自分と逆の命名なのがおもしろいなと思った。どう読むんだろう。walls_of_row[r1] という感じで、添字の r1 が変数名の row を修飾すると読むのだろうか。それは良い。でもそれを縮めたときに何を残すのか。R[r1] や row[r1] にすると、「行 r1 (のデータ)」しか読み取れない。すべてがワーキングメモリに収まる競プロではそれで十分ではある。しかし……。自分が C[r1] = [c1,c2,c2] という名前を付ける気持ちは、C(olumns) of r1 = c1,c2,c3 というもの。利用するときは cs = C[r1] という形で名前が揃う。名前を揃えるのが「間違ったコードは間違って見えるようにする」原則に沿うと思うからそうしている。行に対して列以外の別次元の情報が1種類か2種類付け加わったときにどうするかを考えてみてもいいと思う。■E 問題「Notebook」。4つの操作を読んでデータがどういう形に育つかを考える。必要なのは末尾の1字。ただし ADD の履歴が必要。DELETE & ADD により分岐して先が分かれる。ノートはポインタ。ノートの存在によりすべての履歴が最後まで参照できなければいけない(データを使い捨てにできない)。自分は逆向きのリンクリストだと思ったけど、Git のデータ構造を連想した人はさすが。2009 年出版で今ではもう古い部分もあるかもだけど根幹は変わらないだろう、『入門 Git』(著:濱野 純(Junio C Hamano))にそういうことも書いてある。Git は名前の変更を追跡していないヒューリスティクスでやっているということは書いてなかったかな。その疑問にはっきり答えてくれたのは GitHub ブログ「コミットはスナップショットであり差分ではない」。コミットがスナップショットなら名前の変更(スナップショット間の関係)のありかが気になるというもの。きちんと答えてくれていた。■F 問題「Hammer 2」は DP かなと思ったけど頭のいいことが思いつかないのでプライオリティキューで素直にシミュレーションをした(そもそも頭の良さは思いつきの良さではないという説)。結果は (TLE×28/AC×74)。まあそうでしょう。後日>20221019■解説放送「パナソニックグループプログラミングコンテスト2022(AtCoder Beginner Contest 273) - YouTube」で E 問題に関連して木構造の Undo/Redo の話題が出ていた。それは TATEditor のことか。履歴の見せ方が難しいだろうなあとは思う。