/ 最近 .rdf 追記 設定 本棚

脳log[2022-09-26~]



2022年09月26日 (月) [AtCoder] 精進。第11回 PAST 過去問-O「面積クエリ」。最近 2022091020220518 で書いたように外積や複素数が関係する問題 ABC268-F「Best Concatenation」と ABC266-C「Convex Quadrilateral」と ABC251-G「Intersection of Polygons」が続いていたので、することはまあまあわかる。求める面積は外積だし、外積の式を見れば X と Y の2つの累積和があれば点を足し引きすることで増減する面積をまとめて計算できることがわかる。■提出 #35186967 (AC / 933 Byte / 3695 ms)。だからってするすると書けるわけではないけど。点を一列に並べて計算した累積和を点と原点が成す直線のあちら側とこちら側で分けるために(あちらとこちらでは面積の符号が異なるので)、点と点の原点対称の点を使って3つの部分に分けた。■この回の PAST は HIKLMN がまだ解けていなくて受検していたらたぶん初級だった。これまではだいたい中の上にいて上級をうかがっていたつもりなんだけど……。■■■精進。「偏角ソート」で検索して見つけた問題。ABC139-F「Engines」(ぎりぎり黄 diff)。ソートして尺取りか累積和で半円分のベクトルを合成していくのだろうとはすぐわかったんだけど、ときどき微妙に答えが合わなかった。なぜか。半円の角度を入力されたエンジンの1つによって決めてはいけなかったのだと思う。つまり、あるエンジンを1つ選び、それの左右 90 度(あるいは左右どちらかに 180 度でも)に含まれる他のエンジンを合成するという方法では最適解を取りこぼす。合成した結果が右に傾いてるなら左にぎりぎりいっぱいのベクトルを足すのは損になり得る。ってことは半円じゃないのか。■提出 #35208506 (AC / 387 Byte / 61 ms)。N<=100 なので累積和で効率化とか考える必要がなかった。愚直に長さが長くなる限り合成し続けるので十分だった。


2022年09月25日 (日) [AtCoder] 精進。昨日あったトヨタ自動車プログラミングコンテスト2022(AtCoder Beginner Contest 270)-F「Transportation」(青 diff)。すごく正統派の応用問題という感じで、解けて嬉しい。教科書で最小全域木を学んだあとで、さあ解きましょうと与えられるのにふさわしい問題だと思う。■道路と空港と港を使って最小コストで全域をつなぐ。2島間をつなぐ道路だけなら普通に UnionFind でクラスカル法をする。それに加えて、空港を造った島どうし、港を造った島どうしなら互いに行き交いできるとするとどうなるか。■港(空港)の建設コストが特殊なのは2点を結ぶ辺のコストではないというところ。1島だけが港を造ってもどことも繋がらないし、A 島と B 島が港を造って繋がるコストというのは、それだけにとどまらず A 島と C 島、B 島と D 島が港で繋がるためのコストの一部でもある。■原理的には、道路だけを使って最小全域木を構成する各ステップにおいて、各連結成分ごとに港の建設コストが最小の島に代表として港を造らせる、あるいは空港を造らせる、という仮定を置いてコストが計算できれば、道路と港と空港のベストバランスが発見できると思う。これは全探索なので非現実的な時間がかかる。どうにかして道路港空港の各手段を一列に優先順位をつけて並べて後戻りなくコストを調べたい。■頂点の偶奇を区別して同時に扱うために頂点数を倍加して UnionFind をしたりする。「おしゃれ解法@chokudai」の例もある。4つの平行世界を扱うために4倍の頂点を扱うことができる。4つとは、道路だけで繋がる世界、道路と港で繋がる世界、道路と空港で繋がる世界、道路と港と空港で繋がる世界(結果的に同時に扱う必要はなかったので4倍ではなく4回繰り返しただけだった)。港を必ず使う、空港を必ず使うと想定することで、港(空港)の建設コストを辺のコストへと変えられる。どういうことか。さっき書いた原理的な話において、港を使って繋がるとは、連結成分ごとに建設コスト最小の島に代表させて港を造ると書いた。全体を通して建設コストが最小の島は、どの連結成分に属していても必ず港が造られることがわかる(コスト最小が複数ある場合はどれでも1つだけ選んで決めて大丈夫)。1つを除いた他の島における港の建設コストとはコスト最小の島と繋がるための辺のコストと見なすことができる。■頂点4倍はコンテスト中に考えていた。全体で最小の建設コストが必須コストだということは終了後に考えていた。それでも昨日は答えにたどりつけなかった。サンプルの3が合わなかった。どうしてか。道路の建設コストの昇順に UnionFind を行うクラスカル法をベースにしていながら、道路をつなぐと同時に最初に仮に造っておいた港をなしにしてコストを節約するスペシャルな処理をしていた。これはクラスカル法だろうか。辺を処理する順番は島どうしをつなぐ真のコストの昇順になっているだろうか。変なところでオリジナリティを出してアルゴリズムの根幹を歪めては間違える。問題をアルゴリズムにあてはめる思考も必要。■提出 #35161366 (AC / 613 Byte / 1956 ms)。答えにつながる正解の方針がなかなか引けなくて四苦八苦していたのだけど、正解の方針はクラスカル法で決まっていた。珍奇な処理をでっちあげるより既知の処理に落とし込む方法を考えるべきだった。■港でつながる N+1 番目の島、空港でつながる N+2 番目の島を追加する解答を見た>提出 #35151300。スマートだなあ。何度か見聞きしてるけど頂点を追加する解法を自分で考えついて書けたためしがない。■イコール1文字のミスで二分探索を無限ループ化させてしまって TLE に終わった E 問題については書くまい。99% 解けていた問題より F 問題に時間を使う方がおもしろかったんだから。でもあれが通ってたら 50 分(+2ペナ)5完だったのになあ。自分のすべての提出。■■■E 問題。「E二分探索なんて頭いい事しなくても愚直スレスレの掛け算祭りで通るやん。rubyなのに」 二分探索はいらなかったらしい。自分の提出だけど、こっち(#35144735)がソート+累積和+二重二分探索で 151 ms。こっち(#35204328)がソート+線形探索で 138 ms。ソートのウェイトが大きいので大差はないけど、log^2 の有無で 10 ms ほど得をした、という感じ?


2022年09月18日 (日) [AtCoder] 昨日あった UNICORNプログラミングコンテスト2022(AtCoder Beginner Contest 269) のふりかえり(精進でも復習でもなく)。コンテスト成績証 - AtCoder自分のすべての提出。AC までの所要時間は A=1分半、B=4分、C=4分、D=16分、E=19分、F=40分。30分6完なら黄パフォもあったみたいだけど、自分は1時間半かかりました。E は取りかかるまでに数分考えたし、F は考えながら実装して詰まって考えて実装再開してまた詰まって飛ばした E 問題をチラ見してひらめいて完成させるまでに思いのほか時間がかかっていた。■A 問題「Anyway Takahashi」。自分の提出言語で入出力と四則演算ができますかという問題。参加賞。謎の Takahashi 推しだと思ったら(今日になって見た)問題名が自覚的だった。■B 問題「Rectangle Detection」。配列やループが使えますかという問題。どうとでも書くことができてかえって方向性を定めにくいかもね。B 問題を解くのに短く書くとか効率良く解くとかは邪念と変わらない。■C 問題「Submask」。ビット列の部分集合を列挙する問題。昇順で答えるところを見逃してはいけない。何桁目のビットが立っているかを列挙して、0個選ぶ組み合わせ、1個選ぶ組み合わせ、2個選ぶ組み合わせ……を考えるのが正攻法。いや違う。入力に1のビットが k 個あったとして 0 から (2^k)-1 まで繰り返すのが一番しっくりくる。昇順に答えが見つかるので順番に出力していける。この方法はつまり、入力から0のビットを取り除いて1のビットだけで 0/1 の2択を k 個組み合わせ(2^k 通り)、答えるときに取り除いた0のビットを再度補っていると考えられる。ちなみに知っていれば0のビットを取り除いたり補ったりする手間をかけずにそのままビット演算で列挙できる。この場合は降順に答えが得られるので逆順で答える。蟻本と典型90問で取り上げられているので知っている人は知っている。■D 問題「Do use hexagon grid」(茶 diff)。ハニカムグリッド上で UnionFind をやる問題。6個の隣接ノードが問題文に書いてあるので、文字通りにやるだけ。……なんだけど、考える前に手が動く性分なのでノードや辺がうまく見えなくて UnionFind が書けなかった。座標平面を1列に延ばしておよそ4メガの点列を探索した。←の提出は他の提出に比べて桁違いに遅かったので、方針は同じながら効率に配慮したものを再提出した(314 ms → 67 ms)。■F 問題「Numbered Checker」(ぎりぎり青 diff)。だいたいいつも E 問題と F 問題は同時に開いて、F 問題を先に読んでパッとは解けないことを確認してから E 問題に取りかかるんだけど、昨日の F 問題はあからさまに簡単だったのでそのまま取りかかった。チェス盤に連番が書かれていてクエリで指定された矩形領域の白マスに書かれた数字の和をおおよそ定数時間で求める問題。連番でも1つ飛ばしでも式は等差級数の式で変わらない。Wikipedia で「等差数列」を開いて2種類の式の使いやすい方を写すだけ。……だと思ったんだけど1行目の和を求めたあとで3行目5行目を含めた和を一括で求めるのに詰まってしまった。自分はこんなあからさまに単純な法則で増加する数字をまとめて数えることもできないのかと不甲斐ない思いをしたよね。各行先頭の白マスを見比べて 2M ずつ増えているなと数列の和の式を2階建てで適用したら、サンプル1に含まれる6つのクエリのうち最後の1つ以外は正解した。え、なんで1つだけ合わないとかそんな中途半端がありえるの? E 問題を読んだのはこのタイミング。「インタラクティブ」の文字が目に入るやそっ閉じした。インタラクティブ問題は、問題形式そのものの難しさゆえか解くべき問題は易しめに手加減されていると感じることが多いんだけど(実際 E 問題だけど緑 diff だった)、やっぱり問題形式に難しさがある。初めての人が標準ライブラリの入出力がバッファされていることフラッシュの必要があることを理解できなくて TLE になるのは通過儀礼。そこを抜けてもデバッグに手間がかかる。昨日の E 問題は返すべき答えを人間が用意するのに難しさはないからまだましだけど、デバッグのためにサーバープログラムを書くとなると時間がかかる。F 問題の方が早く解けそうだった。結局3行目5行目は 2M×列数 の割合で増えていたのだった。■E 問題「Last Rook」(緑 diff)。N×N のチェス盤に N 個目のルークを置く問題。ルークは飛車。どちらがわかりやすいかどっちもわからないか。矩形を指定してクエリできるので、領域を4つに分けながら絞っていくのかと最初は考えた。行と列が入り乱れて死ぬ未来しか見えない。最小2×2の盤面でクエリをシミュレートしてみたら、結局縦と横で2回のクエリが必要になるのであって、1つのクエリで盤面を4分の1に限定できるわけではないことがわかった。縦と横で独立して調べるとして、2の10乗はいくつか(クエリ総数が20だから縦と横にそれぞれ10回しか使えない)。1024。2の10乗と10の3乗の対応は覚えておいて損はない。10ビット20ビット30ビットがキロメガギガに(ほぼ)対応する。サウザンドミリオンビリオンでもいいけどね。制約は1辺 1000 以下。制約からも方針の正しさが示唆されるのであとは実装するだけ。以前の日記に「二分探索を使った解法でかつて最も衝撃を受けたのは Vacant Seat というインタラクティブ問題に対する提出 #2057817 と #2064531 だった。bsearch メソッドから呼び出されるブロックの中でクエリを行っている。いやね、自分も提出 #7970588 の中で二分探索を使って答えを出してるんだけど、そのことと、対象となる具体的なソート列がないまま空中で二分探索を行う、順序はクエリで動的に決定するということの間に、どれだけの隔たりがあることか」と書いたくらいなので、今回は自分が bsearch メソッドの中でクエリを行うターンだと当然考えたのだけど、制約が1回のクエリの無駄も許さないと言っているので、ブラックボックスの Range#bsearch メソッドを信頼することができなかった。今回も二分探索を手書きした。提出前に気がついたけど、手書きした二分探索は複数バグっていた。■結果は 85 分でノーミス6完の青パフォ。まだかつての Highest に届かない。


2022年09月11日 (日) [AtCoder] 今日あった ARC148 のふりかえり。自分のすべての提出。■■■A 問題「mod M」(茶 diff)。2以上の好きな数で割った余りの種類を最小化するのだから、答えは1か2。それを見分ける問題。ある数 M があって、A 数列のすべての要素が割り切れるときは種類数1。ある数とは GCD。ところでこの他にも、定数 B を使って A 数列のすべての要素がある数 M の倍数+B で表せるときも種類数は1になる。サンプルの3がこれ。■提出 #34784727 (WA×5)。A 数列の GCD を使う代わりに隣接2項の差の GCD を使えばサンプルの3も通る。WA は gcd メソッドが0を返す場合があることを知らなくて判定条件を間違えた。■提出 #34785321 (AC / 96 Byte / 177 ms)。■■■B 問題「dp」(緑 diff)。DP は解けないので貪欲法でやろうとした。先頭から見て最初の p は必ず反転させなければいけない。L が決まる。R の候補をすべてリストして1文字ずつふるいにかけた。■提出 #34791453 (WA×18/TLE×1)。AC が 60 個あるからそれほど悪くない。終了後の提出 #34804071 は WA 無しの TLE×1 なんだけど、10 行目の L+1L に変更しただけなんだな。off-by-one エラーってやつ。TLE である 04_corner_11.txt はどんなコーナーケースか。ppppp....ppppp だろうことは想像に難くない。■提出 #34804490 (AC / 64 ms)。連続する p を一塊で扱うようにした。一番後ろの p を使わないで得をすることがないので。■■■C 問題「Lights Out on Tree」(水 diff)。与えられた頂点集合の上下関係を知るためにダブリングを書いたり、深さの偶奇が関係するかと思って深さを記録したりしたけど、実は直接の親子関係しか関係しなかった。ボタン操作の基本は「表向いてる親を裏返して、つられて反転した子孫ノードを裏向きに戻すために直接の子を再度裏返す」なんだけど、直接の子が最初に表向きだったノードなら操作回数が節約できる。■提出 #34798597 (TLE×18)。クエリのたびに子ノードのリストをたどる愚直解。■提出 #34799643 (AC / 422 ms)。子ノードは数だけ数えておいて一律に操作回数を計上し、子から親を調べることで足しすぎた分を引く。終了 12 分前に2完のノルマ達成。■■■B 問題と C 問題の配点が同じだから AC の2完遅解きは AB の2完遅解きと同じであり、2完遅解きは A の1完早解きに毛が生えたパフォーマンスしか出ない。-27。ARC にはレートを吸われてばかり。上昇したレートだけ数えたらもう赤なのではないか(頭がパー)。未来のレート上昇を演出するために現在のレートを捧げるのだ。


2022年09月10日 (土) [AtCoder] 精進1。今日あったユニークビジョンプログラミングコンテスト2022 夏(AtCoder Beginner Contest 268)-E「Chinese Restaurant (Three-Star Version)」(青 diff)。やることは即座にわかった。ズレの大きさと回転に応じたズレの変化量。制約が大きいので変化量の増減を記録してその累積で変化量を知る。変化量の累積で操作後のズレを知る。N の偶奇に注意が必要なこともわかっていた。でも完成させられなかった。■提出 #34765127 (AC / 487 Byte / 200 ms)。結局終了後2時間近く時間をかけることになった。一発 AC は嬉しい。類題を2問知っている。ABC240-F「Sum Sum Max」(水 diff)と ARC077-E「guruguru」(黄 diff)。■尺取りで変化量を増減させても良かったみたい>ツイート。ややこしさは変わらんけど、特徴点とその取り扱い方はもうわかってるので、最初から整理して書けるはず。あとでやってみよう。■いや、だめだ。頭が爆発する。もう考えたくない。(ゲーム実況見てる)。提出 #34779383 (AC / 513 Byte / 236 ms)。尺取りです。二重累積和とどちらがわかりやすい? どっちももう見たくねー。■■■精進2。同 ABC268-F「Best Concatenation」(青 diff)。制約の大きさと制限時間が特に長くないことから、1回通り過ぎるだけでスコアが求まるのがわかる。そうするとソートが問題。最初は X が多い順かつ数字の和が小さい順でソートした。これは、X が多いけど数字も大きい文字列の配置を間違える。X が多ければ配置は前だけど、数字の大きさを優先すれば配置は後ろだ。■提出 #34767243 (AC / 308 Byte / 742 ms)。ヒントを見ました。「アライグマ「F問題は変なソートなのだ! 2つの文字列のどっちを前にした方が得か考えてソートするのだ!」 フェネック「どっちを前にした方が得か考えてソートするのはDPの前処理でよく出るから覚えてねー」 https://t.co/rr67x9BfRi https://t.co/BlGbkt3aBV https://t.co/NkWMSVs5Yu」 すでにわかっていたことに確証を与えただけにも見えるけど、「2つの文字列のどっちを前にした方が得か考えてソートするのだ」というのが無意識に作用していた。二項関係だけでソートしていいんだと、知らずに気付かされていた。推移律はどうですか? よくわかりませんよね。祈りながら提出したら AC だっただけです。■ゴルファーの提出(#34766963)を見てると複素数を使ってるんだけど、そういえば自分が書いたソートのための比較関数が外積と同じ式だった。この前の外積を使う問題(ABC266-C「Convex Quadrilateral」)を自分は複素数で解いたから(#34376180)、なにかしら関係があるのだろうか。ソートからどうして複素数が出てくるのか飛躍がありすぎてさっぱりわからんけど。「(解説を見て)なるほどこれ「Xの個数/1の個数」の降順にソートしてたのか」という声もあるけれど、こちらもさっぱりわからない。俺にもなるほどさせてくれ。


2022年09月09日 (金) 職場に絶対一人はいる、言い方がキツかったり棘がある人の周囲からの評判あるある『あれでも昔よりは丸くなった』 - Togetter」■あのね、「言い方がきつい」も「棘がある」も、問題の所在に疑問がある。「私はあほで無能だから本当のことを言われると傷つくのです。配慮して下さい」と訴えているのだろうか。「お上品な育ちなので強い言葉を使われると萎縮してしまうのです。配慮して下さい」と訴えているのだろうか。看過、受忍できない理由はなんだろうか。自分の基準は主として正誤にあるが好悪も人間として必ずある理由。もちろん嫌われるまでには経過があっただろう。自分なら「ひがみっぽくて被害者意識が強い」とか「何に対しても皮肉っぽい」とか「あえて言わなくていいことまで言う」ような人とは付き合いにくいし味方にもなりにくい。でもこの Togetter に同調するのも、嫌いな人間の揚げ足をとるような振る舞いであり、公平な態度ではないと思う。「職場に一人はいる」という表現で一人対その他の構図を設定するところが卑怯だし生理的に受け付けない。


2022年09月06日 (火) [AtCoder] 精進1。先週末あった NECプログラミングコンテスト2022 (AtCoder Beginner Contest 267)-F「Exactly K Steps」(青 diff)。木があって任意の頂点から任意の距離にある頂点(の1つ)を高速に求める問題。■提出 #34603482 (WA×14/TLE×2)。木の中心と、中心から出る頂点のうち2つの頂点について考えた(すべてを考えると星型の木で死ぬ)。与えられた頂点 U と中心と中心から出る頂点のうち U を含まないものがわかれば答えが出せる。距離 K が U の深さより大きいなら、中心から出る頂点のうち U を含まないものを根とする距離表を定数時間で引く。距離 K が U の深さより小さいなら、ダブリングで U の親をたどる。WA だった原因は中心を正しく求められていなかったことで、TLE の原因はダブリングのためのデータ作りで配列の比較を繰り返していたことだと思う。■提出 #34645281 (AC / 1549 ms)。WA の原因が誤った木の中心にあることを突き止めているあいだに、そもそも木の中心がいらないことに気がついた。木の直径の両端にある2頂点のどちらかを根とする木において U から K 個上の祖先をダブリングで求めれば良い。無駄にややこしくして無駄にバグらせていた。■いやしかし Ruby 最初の AC 提出 #34576790 の 41 行目に center = now #中心 とあるな。……使われてないけど。770 ms と自分の倍くらい速いのなんで? 直径を構成する頂点のリストを用意して、U から直径までの距離を愚直に(1ずつ)数えてる。1回のクエリごとに高々半径と同じだけの遡行回数で直径に行き当たるだろうけど、それでいつでも大丈夫? しかしこんなややこしいことをしていて早いし速いし間違えてないのすごいなー。■直径を幹として他のすべての頂点を幹から分かれた枝(※)と見る木のイメージはこれまで持ったことがなかったなあ。※枝の長さは分枝点から直径の両端までの距離のうち短い方より短いか同じ。■提出 #34582537 (tinsep19 さん / 1606 ms)。クエリ先読みもありか。そうか。まねまね>提出 #34647156 (AC / 1826 ms) うーん、遅い。■■■精進2。先週末あった ARC147-C「Min Diff Sum」(青 diff)。コンテスト中に三分探索を書いていたんだけど、そのときも今日も3分点を求める式を間違えていた。(l+l+r)/3 とか l+(r-l)*0.3 が書けなかった。もっとも、それが書けても不満度を妥当な計算量で求めるのがまた難しかったんだけど。この部分問題には ABC の C 問題と D 問題の中間くらいのポジションをあげてもいいと思う。■提出 #34655113 (TLE×23)。三分探索が書けて判定式が書けて不満度の計算ができても、ローカルで6秒かかっているのでジャッジサーバーでは3秒くらいかかると思う。TLE。■提出 #34656235 (AC / 746 ms)。ループの中の線形時間の処理を累積和+二分探索に書き換えて AC。■提出 #34660104 (AC / 1739 ms)。整理していくと結局区間の左端の数と右端の数を数えるだけになって、三分探索も二分探索も不要になった。速くなるかなと思ったけど倍以上遅くなった。さっきの 746 ms がソート(NlogN)+累積和(N)+二重探索(log^2(N))で、今度の 1739 ms がソート(NlogN)+線形探索(N)。オーダーは O(NlogN) で変わってないけどね、だからこそこんなに差をつけられて、しかも負けてるのが納得しがたい。考察が進んで遅くなるとか……。ローカルで若干速くなってるものがジャッジサーバーでは2倍遅くなってたりするから、ジャッジが詰まりまくってた影響があったりする? あとローカルでは入力の受け取り方を変えるだけで3秒が2秒になったりした。入力サイズがでかい。■提出 #34661754 (AC / 658 ms)。ちょこっと速くなった。二重探索に対して妥当な改善だと思う。


2022年09月05日 (月) 今日読んでた本に「あたうる限りの努力」という初めて見る表現があって、気持ち悪いなあと思った。それ以前から「できうる限り」というあまり珍しくない表現も気に入らないと思っていた。だってね、「~しうる」という表現にすでに可能の意味があるのに、~するの部分にできるを当てはめるのは二重表現に思えてくどい。「できる限り」で十分なところでもったいぶって「できうる限り」なんて気取ってんじゃねーよ、という感想が先に立つ。■「あたうる限り」はどうか。これには「できうる限り」の「できる」にさらにもったいを付けて「あたう」に置き換えただけではない悪さを感じる。つまり、「~しうる」に接続するのに「あた(う)」でいいのですか、という疑惑。あたうの「う」と~しうるの「う」の音が同じだから、つい、くっつけちゃったんじゃありませんかという寸詰まりの据わりの悪さ。■「あたう(能う)」について ATOK で明鏡国語辞典を引いたら自動詞五段活用らしい。「~しうる」についても一応引いて、動詞の連用形とともに複合動詞を作ることを確認した。「あたう」の連用形とは何か。「あたい」になりそう? ところで、明鏡で「あたう(能う)」を引いたときにそのものずばりこう書いてあった。「「能う限り」を「能うる限り・能ううる限り」とするのは誤り」。2つの誤用例のうち「あたうる限り」の方は我が意を得たりでわかる。次に考え得るのは「あたううる」なの? 「あたいうる」の扱いがないのがアリだからなのかそれとも想定外なほど完全にナシだからなのか判断できない。もちろん「あたいうる」が仮に合法でも、気取ってんじゃねーよ、という感想をもつだけだけど。■■■珍しくない表現と問題提起だったらしい。「「あたう限り」? 「あたうる限り」?|NHK放送文化研究所」「「できうる限り」か「できる限り」か | 毎日ことば」「首相演説の「能うる限り」は「能う限り」の誤りでは? | 毎日ことば」 五段活用は五段活用でもワ行五段活用であるらしい。いくつかの活用形がないんだっけ? 連用形がなさそう?


2022年09月04日 (日) 「C言語のint型を正しく理解しているか?」クイズ。GCC/LLVM x86/x64の挙動を仮定した問題だが、はっきりいって超難しい。新山は2問目からコケた。 https://t.co/Esjrcid1hs」■やったよ>結果(PNG)。○が16で✖が4。最後の✖は選択肢が1つしかないのに不正解にされて納得いかないけど。■復習コーナー。「What does the expression SCHAR_MAX == CHAR_MAX evaluate to?」 char の符号が処理系定義なのは知ってたけど、処理系定義と未定義を混同した。だいたい符号付きにされるから成り立つ(1)のを正解にするってさ。それとあとになって気がついたけど、この問いに答えるには SCHAR_MAX と CHAR_MAX の型の異同について考えるだけでは足りなくて、int 型へ昇格されて比較された結果がどうなるかを答えないといけなかった。だってビットパターンは2つとも同じなわけだから(追記:嘘だよ。符号付き最[小]値と負号無し最[大]値の話になってるよ)、型が異なることが比較結果が偽となることを即座に意味しない。左のように書いてから疑いを持って検索したら、C++ のリファレンスではあるけどこう書いてあった。「具体的な値は実装依存であるが、127(2^7 - 1)以上であることが規格で定められている。このマクロによって定義される値の型は int である。」 SCHAR_MAX の型は最初から int であると。そんな気がしたぜ。ちなみに UCHAR_MAX についても「具体的な値は実装依存であるが、255(2^8 - 1)以上であることが規格で定められている。このマクロによって定義される値の型は、 unsigned char の全ての値が int で表すことができれば int、そうでなければ unsigned int である」とあるので、基本的に int であると。UCHAR だけど char でもなければ unsigned でもないと。■「Assume x has type int . Is the expression x<<0 ...」 負の数の左シフトはシフト数によらず定義されないそうで。■「Assume x has type unsigned short . Is the expression x<<31 ...」 unsigned short の昇格先としてつい unsigned int を期待してしまったけど、int で十分だから int だった。C 言語の int 好きを十分頭に入れてクイズに臨んだのにほころびが。■「Does evaluating the expression INT_MIN % -1 invoke undefined behavior」 最後の問い。選択肢が「Who knows」(不正解)しかない。他の選択肢があっても普通に答えが返ってくると思ってたから不正解で間違いない。これの結果を保証すると効率に響くという不都合な式らしいけど、コンピュータの気持ちで余りを計算することができないので INT_MIN の何がまずいのかわからず。ひょっとして -INT_MIN が存在しないことが関係する?■■■近くにあったツイートでこちらが目に入った。「科学としてのソフトウェア工学研究の危険性。ほとんどの「定量的な結果」は非常に限定された条件下でのみ意味があるのに、ときにそれを金科玉条のようにして議論が進められる。この結果起こるのは、データに現れない心理的な部分の軽視である。 https://t.co/Shrb4HQn6G」■この手の指摘をつい最近オープンダイアローグの文脈で読んだ。この本『開かれた対話と未来』。オープンダイアローグの個別的な性質から成果を科学的に評価するのが難しいそう。難しいけどやってるみたい。■英語が不自由なので流し見だけどリンク先を読むと、新型コロナのときにも見られた「根拠はあるんですか」を戒める内容ぽい。つまり、有望そう妥当そうではあるけどまだ根拠がない論を「根拠は?」で潰して、安い根拠をそなえた愚策次善の策をありがたがるなよと、そういう雰囲気。私見ですけどね、データが必要なのは凡人と秀才だけで、馬鹿と天才にはデータの裏付けなんていらんのですよ。問題はデータがないと馬鹿と天才が見分けられないことで……。


2022年09月02日 (金) 今日読んでた本のタイポ(ではなく思い違い)。2009年初版の312ページ、進化アルゴリズムの節。「優性遺伝 (survival of the fittest)」「優性を改善する(突然変異)」と書いてあるが、それぞれ「適者生存」「適性(適応性)を改善する」がふさわしいと思う。■適者生存にしてからが特定個人、集団の独善的価値判断に染められがちなのに(Wikipedia)、優性遺伝なんて用語では優性優生思想から容易に連想されるこのような勘違いが避けられないよね。他所の国で使われているらしい顕性遺伝が、性質をより的確に表した名前だと思う。変わったみたい。「中学理科「優性・劣性」から「顕性・潜性」に。遺伝の用語、2021年度から一斉変更 | ハフポスト NEWS


2022年08月31日 (水) 「こする」「擦る」という言葉の知らない用法をそれなりに見かける最近。どこから湧いてきた?■一番最近はこのツイート。「これ本当ガチ。格ゲー超強い人周りにいたら聞いてみ? 「躊躇なく強いキャラ使って、強い技こすりまくる初心者」と「弱キャラ選んで、無駄な事も基礎だと思い模索しようとする初心者」 どっちが現実的に花開くと思うか。 マジで前者って答えるから。前者の継続率と、後者の引退率、ほんまエグいから」■@2022-09-26 もうひとつ。「最近一番SFを感じたの、当時ネットで散々擦られた革命機ヴァルヴレイヴの「安らかに」ボタンがデジタル献花という形で実装されて普通に受け入れられてるっぽいことかもしれない。」 執拗に繰り返すの意?


2022年08月30日 (火) [AtCoder] 精進。ABC133-E「Virus Tree 2」(水 diff)。1日かかりました。影響するのが隣のノードだけならまだ考えやすかったと思うけど、隣の隣まで影響するのがいやらしい。F = lambda{|a,p,k| } のシグニチャが見いだせたら9割解けている。それがなかなか解らなかった。シグニチャとは、親が p である(p の色は決定済みである)ノード a が取り得る色が k 種類のとき、a を根とする部分木を塗り分ける通り数。■提出 #34462566 (AC / 262 Byte / 313 ms)。こんがらかった考えをお風呂で整理したら、9行目の K-1,K-2 の場合分けが自然に出てきて、するするっと実装が完了しました。昨日から何度も解けた気がしては答えが合わないということを繰り返していたのにね。


2022年08月27日 (土) [AtCoder] 今日は ABC266。Ex は知らないけど A から G までいやに素直でおやさしい問題ばかりの不気味な回。コンテスト成績証 - AtCoder自分のすべての提出。黄パフォが初めてならコンテスト中に G 問題が解けたのも初めて。それなのに最近ダメダメだったせいで Highest ではないし入青もしない。水色半ばに復帰したのみ。それでもできすぎた結果ではある。■@atgolfer1 を見たら終了直後の時点では C,D,F,G で shortest だった。Ruby で普通に書くと1つ2つはわりとあるのだけど4つはない。記念キャプチャ。■E 問題「Throwing the Die」は期待値。ダイスは複数形。ついこの前 ABC263-E「Sugoroku 3」がさっぱり解けなかったから 2022080720220809 で計3問解いていた。■F 問題「Well-defined Path Queries on a Namori」はなもりグラフ。ABC226-E「Just one」について 20211107p01 に書いてから知ってる。閉路検出の決まったやり方は知らないけど、反復的に葉をちょん切っていって次数が2から減らせないノードがループを構成していると判断した。親を記録した配列をそのまま UnionFind の Find 用のデータにしたのがうまかったと思う。だからどうという違いはないけど。■G 問題「Yet Another RGB Sequence」は組み合わせ。RG と R と G と B を並べるのだけど、R と G が余分な RG を作らないように注意する。それには RG と R と B を並べたあとで R の直後以外の位置に G を挿入する。同じ位置に複数挿入してもいいので重複組合せ(Wikipedia)で数える。Wikipedia に書いてある「証明4(組分けに帰着する方法)」を高校でやった。■D 問題「Snuke Panic (1D)」に G 問題と同程度の時間をかけた。D は DP の D! DP の D は解けない D!