/ 最近 .rdf 追記 設定 本棚

脳log[2020-08-04~]



2020年08月04日 (火) 1年目に片付けて9年間その状態を維持するのと、9年間散らかしたままにして10年目に片付けるのと、かけた労力と最終結果が同じでも9年間の QOL がまるで違う。これが(改心した)片付ける者の考え。散らかり度合いの上げ下げで労力を計り、時間軸の積分で QOL への悪影響を計る。一方で片付けない者に片付いた状態は永遠に訪れないので、比較が意味を成さない。■右折でどこかに入りたい車が対向車線を塞いでいる状態もこれに似ている。1台目が譲るのと100台目が譲るのでは、譲った側の車線のスローダウンが同じでも、対向車線がストールしていた時間がまるで違う。職業ドライバーは自分が苦労するからか全体最適をよく考えていると思う。


2020年08月03日 (月) Ruby には商と余りを同時に求める Integer#divmod メソッドがあるけど、それを q,r = 7777.divmod(101) みたいに多重代入で受けると、多重代入が遅いせいで(20200428p01.08.01)密かに期待するパフォーマンスメリットが相殺されてしまう罠がある。

最終更新: 2020-09-03T17:14+0900

[AtCoder] AtCoder Beginner Contest 174C 問題 Repsept

時間内に B 問題までしか解けなかったので今日の日記は C 問題。AGC の C なら解けないのは残念ながら当然だけど、昨日あったのは ABC で、C 問題は 300 点問題だ。嘆かわしい。

解るような気がしながら解らなくて、でもやっぱり解りそうな気がするという堂々巡りを繰り返すだけで考えがさっぱり焦点を結ばなかった。具体的には 7,77,777,7777,... という数列を規定するルールを、どのように捉えれば解きやすいか考えあぐねていた。

 提出 #15651178 (AC / 306 Byte / 136 ms / 14428 KB)

 提出 #15663806 (AC / 294 Byte / 118 ms / 14508 KB) ※無駄を省いて整理したもの

布団の中でも考えていて眠る前に AC が出た。だけどまだ解らない。このプログラムが停止するかどうかさえ自分には不確かだ。

たどり着けるならK回目までにたどり着くので「K回目までにたどり着かなかったら到達不能と判断」でもよかったか

うん、これが解らない。

K の余りをとるなら余りの種類が K 種類しかないのはわかる。同じ余りが出たら以降が循環ルートに入るのもわかる。K+1 回目以降の余りが必ず既出なのもわかる。わからないのは、自分が提出したスクリプトでははっきりとわかる形で K の余りを求めていないところ。たぶん変数 k に配列7の要素( 0 以上 9K 以下の値)を足して 10 で割ったあとの k の値がそれっぽいから、この k の値が既出かどうかをチェックする方法があると思う。

でも問題に用意された入力について言えば、答えが出そうな K からは必ず答えが求まっているようではある。それは必然なのか偶然(出題者の作為)なのか。

 Ruby によるすべての提出

他の人の提出を見ると明らかに自分だけ*おかしなことをしている(嬉しい)。え? 停止条件さえ判れば(※自分には判らない)、数列を順番に K で割るだけでいいの? (※桁が大きくなりすぎるので余りにだけ注目する必要はある)

たぶんやっていることは実質的に同じで、一方が難読化されているというだけなのだろう。問題の理解がこんがらかっているからスクリプトもそうなる。過去に2回くらい日記に書いてるけど、アホの子は自分で問題を難しくする。(問題の本質、抽象化された実質が理解できないから、無駄や回り道がなくせないという意味)。

 「おかしなこと」の説明をば

  1. 与えられた K の1の位の数字を見る。
  2. 1、3、7、9なら掛ける数を(1から9から)選べば1の位に7が作れる。
  3. 作りました。1の位の7はもう無視します。(K にある数を掛けてできた数の)1の位ではないところに7か7ではない数字が残ります。
  4. 次はそれに、K に(0から9の)何を掛けたものを足せば末尾に7が作れるかを考えます。
  5. 以下3へループ。
  6. 3から5は要は K に何を掛ければ7の列になるのか、1の位から順に決定していこうという手順。筆算をイメージしながら。
  7. たぶん、運が良ければ、もしくは不思議な法則に従って、掛けてできた数字のどの桁も7になることがあるでしょう。
  8. 全部で7がいくつ作られましたか? というのが答え。

 「7,77,777,7777,... という数列を規定するルールを、どのように捉えれば解きやすいか考えあぐねていた」

「レプユニット数」という概念があるらしい>「[AtCoder] ABC 174 C – Repsept | ヤマカサの競技プログラミング」 そういえば問題名が Repeat でも Respect でもなく Repsept だ(今初めて読んだ)。

 逆元?

この問題の2つの解法というのは、逆元とか割り算を含む式の余りについて理解を深めるチャンスだという気がするんだよね。何か関係がありそう。以前解けなかった問題>「階乗が法外な大きさになるので余りを答える問題。割り算を含む式の余りが求められなかった。

(別の問題の解説だけど)これも理解の手がかりにできそうな雰囲気。雰囲気しかわからぬ……

公式解説は累積和だね、横一列を1回の掛け算で済ます方法

僕の解法は「単純に2で割れないから逆元を使った難しい解法になる」と言われてた

抽象的に考えすぎて難しいだけでは。11ぐらいの小さい数で試したことがあれば難しくなく思いつけると思う

* この提出はお仲間かな。 https://atcoder.jp/contests/abc174/submissions/15654939

本日のツッコミ(全2件) ツッコミを入れる

nishio「循環ルートに入る」=「kの1の位が偶数か5」ということみたいです、追記しました。

ds14050お知らせありがとうございます。しかも代わりに考えていただいて^^。 循環する場合に「B-AはKの倍数」からの「..


2020年07月29日 (水) バッチファイルってどうやら実行中に内容の書き換えができる。現在実行中のコマンドの次の行に新しくコマンドを挿入したりできる。先読みとかないし、書き込みの禁止もない。


2020年07月27日 (月) リツイートとトリミングと権利の侵害の話。最高裁上告棄却。新聞の見出しから受けた印象とは裏腹に、記事を読めばトンデモとは思えなかった。■転載禁止の写真をツイートしたのが悪の根源。ではそのツイートをリツイートして転載禁止の画像を URL としてではなく見える状態で拡散した者の責任は? 悪人を一人挟むだけで、数や実際に及ぼす影響力の点で権利者の権利をより大きく踏みにじりかねないリツイートを行った者の責任が消えるのか?■クリックすれば権利表記を含む画像の全体が見えるというのなら、リツイートをした者が、リツイートをする前に権利表記と転載禁止の文言を確認してリツイートをやめる分別を見せるべきだったろう。「クリックすれば」は通らない。■フェイクニュースの拡散など負の側面が話題になるなかで、リツイートが無節操に後押しされるべき行為だとも思えない。一人なら無力であり無知であっても目こぼしが可能かもしれないけど、数が集まれば力になり暴力ともなる。ツイッター社に考えさせるのがいいのでは。■■■批判的。「リツイート行為と著作者人格権最判令2.7.21(平30受1412) - IT・システム判例メモ」 知らなかったのだけど、「原審では,リツイート行為について,複製権侵害,公衆送信権侵害を否定」していたらしい。この結論は変わっていない。転載禁止をツイートするのがダメだとして、リツイートはその限りではないと。その代わり「最高裁では,このうち,氏名表示権侵害の点について主に判断された。」■その判断に関わってくるのがインラインリンク、直リンクとかいう、定義が紛糾しそうな概念。「インラインリンク(直リンク)と著作権侵害 | デライブ知的財産事務所」■20世紀のインターネットではバナー画像の直リンク(IMGタグのSRC属性にオリジナルのバナー画像ファイルのURLを指定して、バナー作成者、バナー置き場のサーバーに負荷をかける行為)を戒める文言がよく見られ、宣伝に協力する者は自分が管理するWebサーバーにバナー画像をコピーして、Webページに画像を埋め込むときにはそのURLを呼び出すことが求められていた。■このような価値観になじんできたので、他人のサーバーに置かれた転載禁止の画像ファイルを、自分が作成するWebページに埋め込んで表示した場合、これは複製して表示するよりも悪質度が高いと考える。もし、他所のサーバーに置かれた画像を直に埋め込むことで何らかの権利の侵害行為を回避できる、責任を逃れられるという判断が為されるとしたら、これほど有害なことはない。同じような理屈でリツイートにある種の責任がないと判断されるなら、これもまた有害であると考える。■知財高裁も最高裁も問題を正面から捉えていないと思えるし、判断の根拠が誤っていると思う。画像のビット列がどのサーバーからどのサーバーを経由して送信されてくるかは事の本質ではない。それってストリーミングかローカルキャッシュかみたいなクッソどうでもいい議論と同じでしょう。■つまるところ、判断の向いている方向は間違っていないと思うけど、裁判所が駆使するテクニカルな部分が現実から乖離していてナンセンスだから、結論を支持したくない。


2020年07月26日 (日) [AtCoder] 昨日は ABC 級の「M-SOLUTIONS プロコンオープン 2020」があった。パフォーマンス 1683 でレートが 83 上がって Highest を更新したが、あまり喜ばしいことではない。というのも、昨日の自分が一皮むけた結果というわけでは全然なく、いつも通りの不甲斐なさを味わっていたからだ。では何が違ったか。コンテストの(自分より優れた)他の参加者が自分同様に E 問題、F 問題が解けなかった(だから提出の早さを評価する上限が高くなった)というだけのことだ(たぶん)。臨時ボーナスをもらったみたいなもので、自分は何も変わっていない。■E 問題。手を抜くと WA になり、総当たりすると TLE になる。制限時間がいつもの2秒でなく3秒であり、N の上限が 15 と相当に控えめであることから、想定解法の複雑度はかなり高いと考えられる。Ruby で工夫のない総当たりをすると N=10 と 11 のあいだに TLE の壁がある。2^20(=約100万) と 2^22(=約400万) の違い。N=15 が遠い。解説はまだ見たくない。しかしこれがヒントか。@chokudai「E、自分だったら4^Nと3^N区別したくないからめちゃゆるい制約で出すんだけど、Writerが調整めちゃ頑張ってた。」 いやでも 3^15(=約1400万) は手の抜きどころがないと Ruby では無理だけどね。■(お風呂にて) ポイントごとに縦・横・無の三択の総当たりということなのか。そうなのか。ポイントの数と同じだけの直線を選べば確実に S が 0 になることを踏まえれば、あるポイントに縦か横の直線を引いたあとは他のポイントに注意を移していいわけだ。■TLE の壁が N=12 と 13 のあいだに移動した雰囲気。3^12(=約53万) と 3^13(=約160万) の違い。■結局 C++ で書いて TLE を回避しても MLE と WA になるという。ただの総当たりなのにな。WA になるテストケースがないとデバッグが捗らないよ。■■■@chokudai「作問窓眺めてみたら、「大きいと書かれてますが同じの場合はどうなりますか?」みたいな質問が来るので、「真に」をつけてみたけど、今度は「真に大きいとはどういうことですか?」って質問が来てる、みたいな感じの流れだった twitter.com/yamasaKit_/sta…」 問題文を読んでいてちょっと引っかかった表現だった。「真に」が自分の知らない専門用語であり、わざわざ書くからには明確に画された無視できない定義があるのかと疑った。自分は「同じかより大きい」という表現をある時点から知っており、そこから「より大きい(more than)」がイコールを含まないことを覚えていった。「真に」というのが謎用語だったのなら、ある語(「より大きい」)の定義を他の語(「真に大きい」)に丸投げしているだけであり、そういうこと(循環定義)は国語辞典でときどきあるみたいだけど、説明しようという親切が伝わらないものになっていると思う。■■■@2020-07-29 E 問題。綱引きにおいて 1×22×1(1×1)+(1×1) の中には仲間外れがあるんだけどどれも一緒くたにしていた。最初によく考えて当然の前提としていたところにこんな見落としがあっちゃあ答えにはたどりつかねーよ。


2020年07月18日 (土) 何故お役所ってオワコンIEが大好きなの?|楠 正憲(国際大学GLOCOM 客員研究員)」■ブラウザにインフラがないのは知ってた。頭のいい人が正しいが機能しないやり方でやろうとしてるのも薄々知ってる。日本人(国民と消費者)って採算とかリスクとかまるで度外視するよね。とりあえず不完全でもやってやろう、では済まさないよね。■関連「国政選挙のインターネット投票はなぜ解禁されないのか?若者の投票率の低下を解決することはできる?|本日もトントン拍子」「[B! 選挙] 高梨ひひひ on Twitter: "いやまじで、どんなに技術が発達してもネット投票は基本的に無理なんです。 上司が後ろに立ってて、「じゃあ今から目の前で⚪︎⚪︎さんに投票してね」ができちゃうんで… 効率性とか技術力の問題じゃないんです。"


2020年07月14日 (火) 形式的べき級数って聞くと「何それ怖い」しかないんだけど、formal power series って聞くと、「累乗の、連なりの、一般形? う……ん、ちょっとだけならどうにかなるかも」という気がしてくる。錯覚だけどな!


2020年07月13日 (月) fujisan.co.jp を何度か利用しているが、今回初めて良くないふるまいを身につけていると思った。自動継続とメールマガジンのオプションだ。自動継続オプションは購読確定画面とそこまでの経路にはなく、別画面に、デフォルト ON の状態で隠されていた。選ばせる気がない。お知らせ(宣伝)メールのオプションは確定ボタン下方の画面外に配置されていた。購読確定前に選ばせる気がない。下を見て右へ倣えで自ら落ちていくんだろうか。


2020年07月09日 (木) コンテスト時間中に F 問題が解けたことはまだない。時間をかけさえすれば解けるということでもなく、解けた問題だけが日記になっているのだ。

最終更新: 2020-08-15T20:50+0900

[AtCoder] AtCoder Beginner Contest 173F 問題 Intervals on Tree

コンテスト中に解けなかった(問題文を読むところまでいかなかった)問題に挑戦。

「連結成分」っていうのがわかんないよね、まず。出力例1の解説を読むに、頂点集合が辺で繋がれたいくつの部分に分かれるかを数えるみたい。

 考えたこと

  1. 頂点集合は考え得るすべての通し番号から作られる(1~2、1~3、2~7など)。頂点番号と木の構造に関連はない。
  2. 頂点集合ごとに Union-Find するのはどう考えても間に合わない。
  3. LCA が高速に求められたらいけるだろうか。頂点集合に含まれる任意の2頂点をすべて試していたらどう考えても間に合わない。
  4. トポロジカルソートして割り振った番号と実際の頂点番号を見比べて何かわかるだろうか。わかんない。
  5. 木を構成する頂点を「決まったやり方で並べていったら(20200607p01.02)」連結成分が配列の連続する部分として見出せるだろうか。そんなにうまくない。
  6. 木ってどこが根とか決まってたっけ? どのノードでも根になれる? 葉でも根になる? なる。
  7. 一番考えやすいのは、葉が単独で連結成分を構成するとき。葉Cと親Pのあいだに辺があるような(=CとPが共に頂点集合に含まれるような) L,R の選び方が L<=[C,P].min && [C,P].max<=R だから、その否定。(追記:これは嘘。実装中に気がついたがこれだと頂点 C が頂点集合に含まれないケースが紛れている)
  8. 大元の根(※勝手に1つ決めます)に一番近いノードに連結成分を代表させることにすると、あるノードCを根とする連結成分がカウントされるかどうかはノードCと親とのあいだに辺があるかどうかでわかる。
  9. すべての連結成分(=任意のノードを根とする連結成分)について、それがカウントされるような L,R の選び方を数えよう。

 提出 #15106396 (AC / 307 Byte / 351 ms / 35716 KB)

スクリプト化にあたって一番考えたのって、重複組合せの求め方だった。最初 N×N にして間違っていて、仕切りを置く場所を考えるんだったような、と思い出すのに時間がかかった。そして最終的に補集合ではなく目的のものを直接数えられることがわかって無駄になった。

あと、ちょこざいなやり方だとは思うけど、C と P の大小で場合分けをしたくないなと思って符号を利用した>[(c+1)*(p-c),(p-c)*(c-N),].max。あ、カンマが余分。これは「2頂点間の最短パスは短絡辺を通るか通らないかのどちらかである」が最後まで見抜けなかった恨みである。

こうしたら最後の計算で根(c==0)の場合を例外扱いしないで済む。

P[0] = N # 0 を根にする。N は計算のため。
p (0...N).sum{|c|
	p = P[c]
	[(c+1)*(p-c),(p-c)*(c-N)].max
}

 Ruby(2.7)によるすべての提出

ワンライナーとかわけがわかりません><

あ、これ? 「閉路が存在しないならば「連結成分の個数 = 頂点数 - 辺の数」が成り立つ。」 木のどの部分を切り取っても木だろうし、木なら頂点数と辺の数は N 対 N-1 に決まってるので、頂点数と辺の数のずれの大きさがそのまま森を構成する木(連結成分)の数というのは、まあ、言われたらそうかもね、という感じ。

言われなきゃわからないし、なんなら、連結なグラフで頂点数と辺の数の比が N 対 N-1 ならそれは木だというのも、最初からなんだか化かされてるような気がしてる。


2020年07月06日 (月) このツイートに対して今の自分が答えにしているのがこちら


2020年07月03日 (金) 【疑問】車のルームミラーを90°くらい回転させてる人は何なの??? : 乗り物速報」■何度か言及されてるけど、トラックだと飾りなんだよね。教習車は空荷なのでそこまでではなかったけど、信号待ちで後ろについた原付は完全に見えなくなった。そんで左下がりの縦にすると(※実際に確認すると30度も傾いてなかったけども)たぶん助手席の窓から後方をのぞき込むような視界が得られる。不十分だけど足しにはなるので飾りにしておくより役に立つ。歩道を走る自転車が真横を通り過ぎるより先にミラーの中を横切るんですよ、大型車の場合は知らんけど。■うちの親父さんは後ろの車にわずらわされたくないので見えないように歪めてると言っていた。自分はあらゆることを把握したうえで素行の悪い車を無視したいと思っているので賛同できない。それにね、あなたの運転のああいうところとかこういうところとか、独り善がりだと思うんだよね。いつまでも後ろについて走りたくないからさっさと追い越すかルートを変えたくなる。自分自身が他人に合わせられないタチだということを差し引いても相当ですよ。■赤信号が見えるやエンジンブレーキでだらだら減速とか、信号が変わってから殊更マイペースで発進前ルーティーンとか。他にも1つくらい嫌だなと思った癖が強いというか主張が強い運転があったんだけど思い出せない。■周りを気にしすぎてあせったり、煽られて(もしくはそう思い込んで)結果的に周囲を危険にさらすような運転をしてしまうよりよっぽどましだとは思うけどね。


2020年07月01日 (水)

最終更新: 2020-07-09T19:18+0900

[AtCoder] AtCoder Beginner Contest 160D 問題 Line++

コンテスト中に解けなかった問題に再挑戦。(C 問題まで11分で終わらせてそこで力尽きていた。そんだけ時間を余らせてなぜ解けない?)

距離を求めるのに頂点の分類が必要だったのだけど、分類して組み合わせを網羅して距離を計算することができなかった。

今回は頂点を2次元座標に配置することを思い付いて、そうすると組み合わせの網羅や距離の計算が if 文ではなくデータを中心に構成できたので、解答の提出にまで至った。

 提出 #14892703 (AC / 1842 ms / 14560 KB)

N の上限が 2000 だから N×N(=400万)のループは TLE のおそれがあり、実際に 2 秒制限ギリギリだった。提出一覧を見たところ 100 ms は切れないみたいだが 500 ms くらいは普通に切りたい感じ。

  • 距離を求めるのに頂点を3つか4つにクラス分けすれば直接計算できるのではないか
  • クラスに属する頂点は連続する値を持っていて、求める距離も連続する範囲に分布するのではないか

というあたりでもうちょっと。


atcoder.jp/contests/abc16… すべてのiをBFSで最短距離出すところまではすぐ思いついたけど分岐する場所の計算がわからなくて敗北した

BFS とは思いもよらなかった。たぶんグリッドでなくほぼ直線だったからだろう。そういう先入観でプランBが見えなかった。

 提出 #14909026 (AC / 66 ms / 14388 KB)

期待以上に速くなった! 2桁ms!

すでに書いた通り頂点を4つにクラス分けして、始点4クラス×終点4クラスの場合に距離 k の頂点ペアがいくつになるかを計算した。計算は定数時間なので全体で k(=1..N-1) に比例した時間。

L[n][k] が主な道具。n 頂点で直線を作るときに距離 k の頂点ペアがいくつあるかを返す。

C[n][k] は n 頂点の円に対応する。頂点X,Yを除外する-4,-2 がアドホック。

k=1 の場合は例外。他と同じ式に組み込めなかった。


300 ms 台の人の十分に速くてシンプルな提出を見た>#14717011。長さ N の二重ループだった。ありうる2通りの距離のうち短い方を採用するだけだった。これをコンテスト時間中に書きたかったね。まあ、あとからでも書けなかったんだけど。

「2頂点間の最短パスは短絡辺を通るか通らないかのどちらかである」ということが最後まで見抜けなかったからなんだけど、それでも、何らかの方法で答えにたどり着きたかった。


たぶん Python のこの提出(#11387294)が自分と似た方針で同じようなコード構成だと思う。難しくてよくわからんけど。


2020年06月30日 (火) toxic な人