/ 最近 .rdf 追記 設定 本棚

log[2020-11-28]



20201128() 作業の待ち時間に Firefox22 (古い) を使って時間潰しや情報収集をしたのだけどその動作の(ESR 52.9と比較した)キビキビ具合は感動ものだったSSD とかいらないーバーと暗号化方式で合意できなくて閲覧を拒絶される割合が半分を超えていたチラシの裏に HTTPS はいらないとの考えのもとこの日記は HTTP で転送されています。いらないもののために何を捨てるの

最終更: 2021-01-05T18:27+0900

[COSMOS] シスドライブを SSD に移した(SSD 初体)

っとである2012年と2015年と2017年に SSD 化の思惑を書いてるけど(2012111220150812p01)今や2020年の末である500GB6500円である

2007年に買ったHDDが丸13年間もったいや実はもっていない最近になって不良セクタが見つかって名前も知らないファイルがいくつかロトしたのだけどーブルを抜き差しして問題はなかったことにしていたそれからょくちょくプログラムが一時的に停止するような状況が続いていてIO 待ちなのかなとスクがお隠れになってるのかなとァイルバックアップが正常に終了することが珍しくなったし3回ほど INTERNAL_POWER_ERROR を理由とする BSoD を見たりもした検索するとグラックドライバが悪いとかHDDが壊れてるとかで生じると書いてあるがドライバの再イールとチックスクは不良セクタが見つかったときにもう済ませてある処置無しである完全な破局が訪れる前の今を限られた猶予として動かねばならぬ

以前書いたとおりまずは Complete PCックアップをシスドライブが入っているのとは別の HDD にとったックアップは毎月やっていることなのだけど直前にまたとろうとしたら罠があった少し前にとあるボリームの容量を拡張しようとしてそれは HDD の末尾に配置されていて後ろに空き領域がなかったものだから拡張するにはベーシックスクからダイナミックスクへの変換が必要だという誘われるままに変換したのが罠だったーシックスク上のボリームである C ドライブのバックアップをダイナミックスク上のボリームに保存することはできないらしいダイナミックスクをベーシックスクに戻すにはボリームをすべて削除する必要があるらしい罠であるよりによってこのタイミングで

ともあれバックアップを保存した HDD とフーマトもしていない新しい SSD だけを接続した状態で Windows のイール DVD から起動したールは選ばずにその他のオプションから Complete PCックアップからの復元を選んだのだけど警告された復元するとスクはフーマトされすべてのデータが失われるとそれでも実行するかとったのはどのスクがフーマトされるのか全く示されなかったこと画面上にはどのバックアップから復元するかを選ばせるリトがありT ドライブを選択したのだけどそれをどこに復元するのかどのスクがフーマトされるのか選ばなかったし提示されなかった考えてみれば10年以上前にプスされた DVD が昨日買ってきた SSD のメーカーや型番を知っているはずがないしーマトしていないかドライブレターの割り当てもないしどういう識別情報が提示できたかわからなくはある……ような気がしたがEFI でブートドライブの優先順位を決めるときに型番が利用できるのだからデバイスに刻まれた文字列が利用できるはずでは? なんにせよいちかばちかで実行したらちゃんと SSDC ドライブ( Y ドライブも含めていた)が復元されていた

っきから C とか Y とか T とかその他にドライブレターの割り当てはないけど特定のパスに接合されたボリームがいくつか存在しているように細かくパョンを分けているNTFS ではそういうことは一度もないんだけどァイルシスムが FAT32ったときはファイルの全ロトが何度もあったBSoD もしっちゅうだったしそこからのコンボが現実の恐怖だった失われるのはパョン単位だから巻き添えを少なくするために分けているマウスを使ったファイル移動の既定がボリームをまたぐ場合に(名前の変更だけで済まないからか)コピーになったりするけどそれだShiftーを押すか後で削除するだけの手間

アイコンや文字のサイズなどデスップの設定がリセトされていたり復元された Y ドライブ(まさしく自分の設定(レジトリ)が保存されている場所)が壊れているからチックスクを実行しろとファイルシスムからの鬼のような催促がイベトビーアに記録されていたりしたけど他は何も変わらず。もちろんスポスは速いM.2 スロトなんてしゃれたものは 2011 年発売の MSI 990FXA-GD80 には付いていないし NVMe にも対応しないので転送速度は SATA3(実効転送速度 600MB/s)に律速される500 MB/s 台が出ていたので大変満足です。HDD だとシーケンシャルでも 80 MB/s いけばいいところ

SSD を知らない OS (Windows Vista)SSD にイールしてどうなるかはよくわからないった SSD のメーカーであるサムスンのユに期待していたのだけどSamsung Magician 6Windows 7 以降でないとイールできないらしいMagician 4 はイールできたけど当然ながら最近の自社製 SSD を認識しないので役に立たないデフラグのスケジールからは外したけど他は何もTrim はどうする? TxBENCH のイールはした総容量の4分の1しか埋まっていないしデータスクは別にあるからここから大きく増えることもない空き容量に任せてどうとでもなるんじゃないかな(ったらいいな)


20201127() このところここ半年ほどとくらべてあまりおなかが減らないわりに食欲も減ってなくて冬に向けて太る準備をしているなという感じ抜け目なく体重と体脂肪率の推移を注視していかねばならないとそう思うのでした(思うだけ)


20201124()

最終更: 2020-12-08T00:48+0900

[Ruby] 多重代入の難しさの一例(Ruby 2.7Ruby 1.9 で確)

4月多重代入は遅くて時々評価順が難しいと書いたけどさらに難しいケースを考えたクイズです。

a = *0..5 #=> [0,1,2,3,4,5]
b = *0..5 #=> [0,1,2,3,4,5]
a[i=2] #=> 2
b[j=2] #=> 2

a[i+=1] = a[i] # a はどうなる?
b[j+=1],= b[j] # b はどうなる?

a #=> [0,1,2,3,4,5]
b #=> [0,1,2,2,4,5]

a の結果を確認してから予想してカンマを付けたら予想通りの結果になったので驚きはないけどっぱり普通の代入とは違うんだなあとそれが遅くなる理由かなあと思いました

ゴルフーしかこんなコドを書こうとはしない? その通り


20201123() KLX300 が日本で買えるようになるといいなあ(アメリカ仕様) 137 kgってDRXRWRそして KLX もなくなってるもんなあ


20201122()

最終更: 2021-05-07T14:51+0900

[AtCoder] AtCoder Beginner Contest 184C,D,E

 C 問題 Super Ryuma

超竜馬の移動ルールを読み解くのが難しすぎると思うんだ数学の言葉が通じない人のことを考えてほしいなんとか解読した結果はマンハッタン距離が3までの菱形の中と傾きが ±1 の直線上を移動できるだと思った

 提出 #18323156 (AC)

これ以上ない可読性を誉めてほしい可読性とはこういうことだ(他人が言うただの手癖レベルの)可読性なんぞいらない(どうして自分が書いたコドをあなたにとって読みやすく自分にとってはそうではないように書き直さなければいけないのですか?)この提出の可読性も認めてもらわなくて全然構わない

 提出 #18373736 (WA×1)

先の AC 提出と全く同じ内容だが after_contest_01.txt という入力だけ WA になったトケースが弱かったので追加されたらしいのだがみごとそれに甘えた嘘解答だったことが明らかになったということ

 提出 #18374012 (AC)

after_contest_01.txt を通して本当の AC可読性は維持している

もちろん誇大表現は話半分に受け取らなければいけない数学の言葉が通じない人向けに日本語で移動ルールを書けば曖昧さが入り込む余地が大きくなる同じように定義式を見て理解できることに日本語のラベルを付けたところでラベルの妥当性には疑問の余地がある可読性(ラベル)は誰のためのもの正確な理解ができない人間のためではない時間がなくて式を読む時間を省略したい人に向けた補助である時間があれば定義式を読むべきだし時間がなくても即座に読み解ければそれに越したことがない

異なる可読性もあると思う読者を惑わせる無駄や回り道曖昧さがなく目的に直結する論理的で考え抜かれたシンプルなコドだそちらは追求していきたい考え抜かれた結晶を目で字をなぞっただけで読み解けるはずがない読みやすさとは密度の薄さのことではない一行を読むのにかける時間を変えればいいだけのこと薄い内容をいっぱい読むだけ読んでも理解ができていなければ意味がない理解するには知識と考える頭が必要だその時の対象はごく小さく限られている方が集中できて良いというのが自分の考えであり性質読むときも書くときもそちらを追求していきたい

 D 問題 increment of coins

期待値? 定義しかわかりません試行回数が不定? 一瞬で放り投げかけたが踏みとどまった

A, B, C 3つも変数があると頭がパニックなので A*10000+B*100+C と1変数にエンコドしてみたらやや落ち着いた試行を繰り返す遷移を書いて計算して足し合わせたら答えになった求めたのではな「なったのである

ただし += とすべき確率を = で上書きしていたためになぜかサンプル4だけ答えが合わなかった「なぜかはサンプル1から3の答えが合ったことに対する疑問これのデバッグに30分ちかく溶かした

 提出 #18339328 (AC / 867 ms)

同じ Ruby300 ms 台の提出があるのと比べると 867 ms はかなり遅いしかしもう考えたくない

 E 問題 Third Avenue

10分しか残っていなかったのでコンテト時間中の提出は適わなかったただやるだけだと思ったけどそれを手早く正確にやる能力がなかった多少の時間の余裕があってもダメだったろう

 提出 #18348009 (WA×1 / TLE×3)

TLE はいいけど WA はいただけない今日は寝る

 提出 #18371108 (AC / 2995 ms)

はいやるだけでした(だがそれができなかった)TLE まであと 5 ms なのは改善の余地があるだろう

WA の原因は再訪防止のマーキングを行こうとするときにチックを付けるか着いたときにチックを付けるかの差だと思う効率を優先して先走ると間違える過去に何度も同じやらかしをしているので多分そうだと思う(今ここでよく考えないから次もまた同じミスをするんじゃないか?)

 提出 #18397451 (AC / 1883 ms)

30% あまり速くなったがあまり本質的ではない改善要因(予想)が5つあるだけである

  • 再訪防止フラグ(配列 T)のインデックスを誤って使用していた

    問題として与えられるグリド文字列に番兵として1行1列を加えていたのだけど再訪防止フラグはそうではなかったそれにもかかわらず番兵込みのインデックスを使って(予防的な)再訪チックをしていた

    訪れるべき所を訪れ損なっていなかったのは運が良かっただけだし訪れなくてもいいところを無駄に再訪していたと思われる

  • 壁のあるマスにも再訪防止フラグをセトするようにして予防的な再訪チックに引っかかるようにした
  • テレポーターの前処理をする際に正規表現を引数にした String#index を使っていたのだけどパターンを /[Sa-z]/ から /[a-z]+/ にした

    S の有無は関係なくて連続するテレポーターをひとまとめに処理対象にした

    String#each_char で1文字ずつ文字種をテトするのにくらべて正規表現という仰々しい道具を持ち出した String#index が有利になる条件はテレポーターが疎に配置されていて処理対象外の文字を大きくスキップできる場合だと思う

    逆に言えばテレポーターが密に配置されていて index が1ずつしか増加しないときただの文字種比較とパターンマッチングを伴うメソド呼び出しの1回あたりのコト差が顕在化する

    index メソドの呼び出し回数を減らすためのパターン変更

  • 上下左右の移動先を処理する4要素の配列のイテレーションを展開してべた書きした
  • 使用済みのテレポーターの処理に関して空の配列を concat しないように事前にチックするようにした結果が同じでも記述が煩わしくてもパフーマスのためには事前にチックする方が良い

    インクルドガドにも内部インクルドガドと冗長インクルドガドの2種類があって冗長でもインクルドそのものをスキップするように書けばファイルを開いて閉じる手間が省略できてコンパイル時間が短くなる最新のコンパイラプリプロセッサがそんな愚直なやり方をしていると信じる理由はないけども原理的にはそういう差がある

 提出 #18446644 (AC / 1490 ms)

もう 20 % ほど速くなった

  • 添字を使った文字列へのアクセスと配列へのアクセスは倍ちっと速さが違う(Ruby 2.7)添字の大きさは関係ないみたいちなみに Ruby 1.910 倍違った
  • 再訪防止フラグを早めに立てるようにしたからキーが長くなりにくいと思う予防的なチックが本式のチックになったからメインループでのチックも不要になった
  • 前処理に正規表現を使うのをやめて1文字ずつ細かく準備できるようになったから再訪防止フラグを利用してメインループの when 節が1つ分減った

それから1つだけの WA の原因はよくわからなくなった少なくとも再訪防止フラグをセトするタイミングが必ずしも理由になるわけではない(今回の提出では移動しようとする先のフラグを立てるようにしたから)何かをミスればそれを咎めるテトケースがちゃんと用意されているというだ別の提出では別のケースが1つだけ WA になった


20201121()

最終更: 2020-11-22T08:26+0900

[AtCoder] AtCoder Regular Contest 108C 問題 Keep Graph Connected

コンテト中に問題文は理解していたと思う文は問題まで理解していたかは知らない

  1. 頂点対抗で辺の奪い合いをする
  2. 各頂点は自身に繋がる辺からこれはと思うグループをひとつ選びそれら辺に共通する番号を名乗る
  3. このときその頂点に直接繋がる他の頂点は同じ番号を名乗ることができなくなる
  4. そうして全頂点がちょうどひとつの番号と辺(のグループ)を選び取ったとき選ばれた辺で全体がひとつに繋がっていればそれが答え

これを DFS で探索しようとしただめな選択に早々に見切りをつけて手戻りを減らすために選択肢の少ない頂点に優先して選ばせようとした

あとで提出して確かめるTLE になるならさらに考えないといけないWA になるなら問題文を読み直さないといけない


選ばなくていい頂点もあるの木の根に相当する頂点選ばれる辺の数は N-1 以上になるから必ずなにがしかの木+余分な辺になるわけだけどそれがどういう意味を持つの最後の頂点だけ選べなくてもいいってだけ? わからなくなってきた


20201111()

最終更: 2021-02-20T23:02+0900

[AtCoder] 第四回 アルゴリズム実技検定

自分の提出第一回第二回第三回

今回は K 問題までたどり着けなくてJ 問題で詰まったまだ解けていない特定のカテゴリの入力が全滅しているから見落としているパターンがあるしそれを除いてもまだ AC は遠そうだけど ABC184E 問題 Third Avenue は解けてるんですよ>20201122p01.03不思議だなあ

その後 K 問題は解けたしなんなら L 問題も解けたけど時間はかけたそして M 問題

 M 問題 筆塗り

まだ3つの TLE に阻まれている

何について繰り返すかその通りがかりに素早く答えを出すためにどんな最適化されたデータが準備できるかというのが考えどころ

実行時間の制限が長めの4秒ではあるけど制約上の上限がどれもこれも 10^5 だから何かについて繰り返しているあいだに探索やら配列埋めやら時間がかかる処理をするわけにはいかない

たとえばクエリごとに色記録配列を埋めるとか(=頂点集合を左右に分ける)ごとに関与するクエリを逆順に検索するとかは間に合わないRuby では間違いなく

 提出 #18035280 (TLE×18 / AC×16 / 4419 ms / 234280 KB)

Array にはない ^ メソドが使いたくて require 'set'; した「対称差を求めるメソドらしいしかし遅い

 提出 #18036165 (TLE×9 / AC×25 / 4445 ms / 1224160 KB)

3つの演算子(+, -, &)を使って自分で Array#^ メソドを実装した+ の代わりに | メソドを使うこともできるが速くなる気がしないまだ遅い

 提出 #18053537 (TLE×3 / AC×31 / 4416 ms / 210696 KB)

bsearch_indexconcatArray#^ メソドを実装した演算子を使ったシンプル実装より必ずしも速くなるわけではないが遅くなるのは TLE になるほどではない小さいケースだし直線に近い(色リトが長くなりやすい)木では有利になるためか TLE が減ったしかし残った3つの TLE (random_17.txt, random_19.txt, random_28.txt) はどの提出に対しても実行時間が上限に張り付いたままで打開するヒトが見えないどういう形の木なの

 方針
  1. 根を1つ決めて木全体を葉から根へ遡るように処理する(なぜか根が上)
  2. ドは色リトを持っている色は z-order で識別するz-order1 から Q の範囲の値をとる
  3. 子が持つ色リトを親のものにマージしていくージする過程でペアができればリトから取り除く
  4. ドが持つ色リトのうちもっとも手前にある(z-order が大きい)色がそのドと親を結ぶ辺の色となる

N 個のドについて繰り返しながらソト列(色リ)のマージを繰り返すのが時間的にもメモリ的にも厳しいだけどこれが嘘のように時間制限をクリアできる魔法があるとも思えない十分にトレトで迷いのないコドだと思うこの方針のままなんとか滑り込みたい

「打開するヒトが見えないどういう形の木なのかと書いたけど直線の反対ということで子供が 100, 1000 あるような木を用意したらてきめんに遅くなったどうしようかな

 提出 #18059514 (TLE×2 / AC×32 / 4418 ms / 201508 KB)

変更点はソト済み配列から最大値を取り出すのに max メソドを使っていたうっかりの訂正と子の色リトを得るのにランダムアクセスをやめてスタックから連続する領域を取り出すようにしたことこれで1減って残る TLE は2個

4400 ms4200 ms になったりするとあとちっとだとわかるんだけど……

あるドに合流してきた色リトは LCAz-order がともに昇順になるように並べ替えることができてそこから外れる色は色塗りの出番がなくて無視できるんだけど()それで良くなるものか……

z-order が大きければ他の色より前に出られるLCA が小さければ前にある色が LCA に到達して退場するのを待てるどちらでもなければ前に出る前に退場させられる

 提出 #18069462 (AC / 1394 ms / 106192 KB)

った!!!

LCA が正解だったみたい木を遡りながら色リトをマージするのは同じだけどLCA を利用してリトを短くしたら TLE が解消した

うれしいってもうれしいここ2トイレでもお風呂でもふとんの中でも考えていたっさり AC されているとやる気が萎えるので見ないようにしていたがRubyAC 一番乗り

ところで PyPy3 のこのシンプルかつ Python 系で一番速い提出 #18047488 (819 ms) はなんの魔法だろう半分以上が入力の処理で残りでヒープの出し入れをしているだ

JIT で速いから余計な手をかけないで済むということなら Ruby には関係のないことだけど考察が足りていなくて自分のアルゴリズムがヘボだというなら学ばなければいけない

それはそれとしてLCAの確定を待つ色のリトはソト済み配列をやめてプライオリーにすべきだしlambda M の中の Array#slice!Array#insert は配列に相応しいメソドではない配列を酷使しすぎている2点に改善の余地がある

 提出 #18102965 (Crystal / 559 ms / 56432 KB)

初めて Crystal を書いた色々言いたい

  • Web で見られるランゲージリファレスがないドキュメトがあることとアクセスしやすいことは必須リファレスだけあればいいgetting started はいらない
  • Ruby を知っているからこそ罠が多い
    • delete_ifinject メソドがないreject!delete_if は完全に同じではないしreduceinject がただのエイリアスなら用意しないのは罠でしかない

      inject は配列の各要素のあいだに演算子を挿入するイメージのメソドらしいそれを読んでから inject の仕様に悩んだことはない

    • lambda メソドがないーに Proc.new と書いてみたけどダメだったので -> () {} と書いたアロー記法は好きではない

      パラメータには型注釈が必須だったけどコロンの前か後ろか両方にスペースが必要だったらしい詰めて書いた「ダメだ我は ) を所望すると怒られ素直に ) を書いたら型注釈を付けろと怒られる無限ループ

      後付けするなら記号は選ばなければいけないRuby の仕様(メソド名と文字リテラル)なら条件演算子はむしろないほうがいいしだけど条件演算子とシンボルリテラルは現実に存在しているし記号は選ばなければいけない

    • each メソドが self を返さないなぜ?
    • ブロック変数名に _ が使えないなぜ?
    • 定数に多重代入ができないなぜ?
    • 定数と変数が同じスコープ見た目通りの実行軸にないように思う

      n,q = gets.split.map(&.to_i)
      N = n; Q = q

      これは変数 n が定義されていないというエラーになった

      (記:下の方で答えを書いてたかもmap が遅延評価? .to_a を付けないと期待したタイミングで副作用が起こらない map が遅延評価であることと代入が行われないことは別だと思うのだが違うの違う(別ではない)なら大変に興味深い Crystal の特徴だと思)

    • &:to_i と書いていたものを &.to_i と書かせる

      .to_iCrystal という言語を構成する部分として定義されておりプログラマが操作可能な対象であるなら評価は変わるけど単に & という目印のバリエーションとして &. を追加したならただの好き嫌いでただの罠

    • ブロックパラメータは必ず1つ? {|i,|} とか {|i,j|} とかできない雰囲気それとも StaticArrayったから?
    • map が遅延評価? .to_a を付けないと期待したタイミングで副作用が起こらない
    • Enumerator のチェインができない具体的には map.with_index と書くと map にブロックパラメータが必須だというエラーになったスペックを読んだら map_with_index というメソドがあったので使ったがmap だけ?
    • nil が非常に煩わしいRuby はすべての変数が Nullable だし偽と評価される値が nilfalse だけなのもあってあらゆる部分に nil が現れるそのすべての nil に対応を迫られる一例が gets.to_i とは書けなくて gets.to_s.to_i と書かされるところたぶん (gets||"").to_i でもいいとは思う

      実行時エラーをコンパイルエラーにしたいのだとしようだけど視野が狭いこちらは getsnil を返すかどうかそのような入力が与えられるかどうかに関する知識を持っておりnil が返るような入力が仕様違反であることを知っているバグがあったときに修正すべき対象は Crystal のソースコドではなくそのような入力を与えた外部にある事の決定権はコンパイラにはない

      &. によるメソド呼び出しに対応していれば話は違った

    • 空の配列から pop できない空の配列を reduce できないこれらも nil がらみであろう
    • 空の配列空の Hash の作成がめんどくさい。[] とか {} とか書けないとりあえず領域を確保するために [nil]*N と書くのもタイプミスマッチで都合が悪い
    • "1(スペース)2".to_i がエラーになった1 を期待していた0 をデフトとして解釈できるところまで解釈することを .to_i には期待している

すべドキュメトの不足が悪いスペックしか頼れるものがなかった


俺は人類の手には多少余るとしてもプログラマを信頼し力を与えてくれる言語が好きだ安全のためと称して枷をはめようとする言語は選ばない安全な(なまくら)は退屈だ

では Ruby の切れ味は? Ruby はプログラマがやりたいことの邪魔をしないのがいいRuby がコドゴルフに向いているということとも関連するーワドやら形式やら本筋の処理と無関係でありながら書かなければいけないお約束が少ないということ

Crystal の型はどうプログラマに力を与えるためではなく処理系が力を得るためにプログラマが受け入れる枷だというのが少し触っての印象枷を受け入れるなら C++ が選択肢に入る

const 教の信者というのは最も“const と書きたくない”人種のことだと自認しているconst という当たり前のことをどうしてあちこちそちこちに書いて回らなければいけないの所有権も魅力的だけどconst と書かなくてもいいという1点でまずRust の評価が高い

C++Ruby も好きだけど弱点があるRust には期待ができるでもコンパイラが起動できないんだよなあrustc.exe -トリ ポイトが見つかりませんプロシージャ エトリ ポイK32EnumProcessModules がダイナミック リンク ライブラリ KERNEL32.dll から見つかりませんでした 本でも読む

 別解@2021-02-20 提出 #20275440 (AC / 1168 Byte / 1081 ms / 73084 KB)

#18069462 と比べて、-1016 Byte / -313 ms / -33108 KB短くて速くて省メモリ

先に書いたように「クエリごとに色記録配列を埋めるとか(=頂点集合を左右に分ける)ごとに関与するクエリを逆順に検索するとかは間に合わないのはたぶん間違いないけども2つを混ぜてクエリの逆順に効率良く色記録配列を埋めるところまでは考えが及んでいなかった

時間軸を反転することで一度塗ったところを再度塗らないでスキップしたい

PAST4M - 西尾泰和のScrapbox

その方針でやってみれば前半はほとんど同じことをやってるんだけど下準備を終えたあとのメインループではト済み配列をマージする代わりにスキップしながら親をたどっていた親をたどる方が短く書けて簡単!


20201108() [AtCoder] AtCoder Beginner Contest 182なんか呪われていたデバッグ出力を消し忘れて All WA を食らった何度も提出直前のささいな()修正によってサンプル入力すら通らなくなっているのに気付かずに提出して WA を食らった何度も問題の読み損ねも複数あったしサンプル出力が一致しているかどうかの判断ミスもあった(実行結果が1なのか0なのか読み取れていなかった)コンテトが終了してから B 問題()に取りかかって3分後に初 AC が出たその8分後に D 問題に初 AC が出たその11分後に E 問題に初 AC が出たつまりコンテト中には A 問題と C 問題しか通っていなかったBD も時間をかけて通せていなかったあと思い出した1分前にスマホのアラームをセトしていたのに鳴る前に始まっていた常時基地局とやりとりしていて2分も遅れるなんてことがある? なんの呪いなんだ


20201107()

最終更: 2021-05-07T15:06+0900

[AtCoder] AtCoder Beginner Contest 015D 問題 高橋くんの苦悩

DP の基本形といっていいほど典型的な DP見え見えの誘いに乗りたくなくて他の解法を考えてみたけど思い付かなかったそれに心配しなくても Ruby ならではのお楽しみポイトがちゃんとあった

実行時間の変遷が見どころ

 提出 #17933561 (TLE×7 / AC×40)

N×K×W のループは上限が2500万回でありRubyTLE を避けようと思ったら桁を1つ減らさないといけない予想された結果

 提出 #17934141 (AC / 1033 ms)

N のループが K 回に達するまでは K のループを K 回まわす必要がないよねっていう節約作戦で AC になった制約は K <= N <= 50

 提出 #17934762 (AC / 554 ms)

提出一覧1000 ms を超えるグループと超えないグループに分かれていたので中を見たら添字と値が入れ違っていた

  • 遅い方 - Array[K][W] = sum of B (K<=50, W<=10000)
  • 速い方 - Array[K][sum of B] = W (N<=50, B<=100, sum of B<=5000)

B の値域が(W にくらべて)かなり狭い範囲に限定されているのがポイトで速い方はループで走査する DP 配列のサイズがおよそ半分で済む

 提出 #17935118 (AC / 111 ms)

2番手以降の集団をダブルスコアで突き放す zazaboon さんの提出 #11417636 (150 ms) を調べた結果

  • DP 配列のサイズを制約上の上限ではなくトケースに応じた必要最小限のサイズにする
  • B を小さい順に処理することによりープの初期に更新する DP 配列の範囲を限定する
  • 答えを見つけたら即終了する

以上の点を真似したのに加えて考えられるこちらのドバンテージが

  • Ruby のバージョンが上がっている(2.32.7)
  • 最初に簡単なチックで N を減らした
  • 初期値を整数にした(とりあえず大きな数としての初期値に Float::INFINITY を使うと10**9 のような整数型を使うより比較にコトがかかる)
  • 演算子を極力書かないようにした(vsum+1 は美意識とボキャブラリに起因する例)
  • 配列参照を極力書かないようにした特に二重のものはひとつも書かなかった
  • 見た目がださくても a = [a,b].min と書くより a = b if b < a と書いて代入を省略できる方が速い(だけど本当は宣言的な変数定義がしたい操作ではなく結果について書きた)
  • よくわからない処理を真似しなかった41 行目の if44 行目

前後のリトを比べると後ろは問題と関係のない比較的どうでもいい内容が並んでいるね

 Python のこの提出 #287540 (AC / 66 ms)

いまのところの Python 最速AB 配列を幅対重要度比でソトしてからの DFS なんだけどすごいのが _greedy_by_width_greedy_by_num という先読み関数で探索の打ち切りを判断しているところそれでペイするんだってところと1枚のスクリーンシトを刻む発想が(って刻んだ画像の価値はゼロですよ常考)

使う使わないの二択だと比率がちっと悪くても残った隙間にぴったり収まる方が重要度を高められることがある先読みでその可能性を取りこぼしては答えを誤るだからあくまでも比率のいいスクリーンシトから使うったり収まらないなら切り取って収まる分だけ使うそういう考え

最近別の問題を自分が DFS で解いたときのことだけどっきの TLE 提出を微修正したら AC になった事前に XY 配列をソトするだ二択による手戻りを最小限にするために選択肢の優劣が明らかで覆りにくいものを最初に選ぶようにしたなんてぬるいやり方よりずっと突き詰めているすごいなあ


20201101()

最終更: 2020-11-06T01:42+0900

[AtCoder] AtCoder Beginner Contest 181D,E,A

 D 問題 Hachi

ほんの一瞬1,10,100,1000,10000,... を8で割った余りに与えられた数字を掛け合わせて8の倍数を作るゲームかと思ったけど組み合わせが膨大で無理そうだった

こういうのって8の倍数が千とか万とかキリのいい数字になったらそれより上の桁の数字が何であっても千とか万の倍数であり8の倍数だから無視していいんだよねってことで irb で実験したら4桁目から上はもう無視していいみたいだった1000 = 8×1253桁で8の倍数が作れれば良し

 提出 #17805410 (TLE)

物量に頼った雑なやり方で TLE を食らった

 提出 #17808009 (AC)

お留守だった脳みそをなんとか働かせて tally メソドで集計をすることにした

 E 問題 Transformable Teacher

とくに悩むところはなかった全体にペアの差を最小にしたいならソトして隣同士で組み合わせるしかないと思ったあとは妖怪先生(え?わたし?)をどこに潜り込ませるかだ

ータ構造も悩まなかった右の人と組む場合と左の人と組む場合の2種類の階差数列が必要だな定数時間である範囲の数列の和を求めるには累積和だな

 提出 #17820870 (AC)

惜しむらくは提出時刻がコンテト終了の6分後だということ

こうなってみると B 問題 Trapezoid Sum で等差数列の和の式を悠長に組み立てていたのが悔やまれる何回やっても全然答えが合わねーの! いま検索したら Wikipedian(a1+an)/2 みたいな自分が考えてたのよりずっと簡単な式が書いてあったりしてあほくさくなってくるちがうお前があほなんだこの式に16分かけた>#17793713展開して整理する時間も惜しかった最後なんて式はもう合ってるのにサンプル入力のコピペに失敗して答えが合わないせいで式の検討をやり直したからね

次の C 問題 Collinearity ではさっさと2点を通る直線の式(軸に平行な直線にも対応したもの)を検索している>#177966317分かかってるのはタイピングとサンプルを使ったテトの時間

 A 問題 Heavy Rotation

こういうコドをゴルフ的だと考えるとしたらそれは考え違いだと言いたい(誰に向かって言っているのか謎だが)

puts %w(White Black)[gets.to_i&1]
提出 #17781996 - AtCoder Beginner Contest 181

比較対象は例えばこんな感じ

if gets.to_i.even?
	puts 'White' 
else
	puts 'Black'
end

2番目のようなスクリトを書く前に自分が考えること……

  • 出力は1回1行だけしか行われないのに puts が2つ見えるのは読み手にやさしくない
  • もし~ならこうするさもなければこうするという構成はあまりに手続き的もうすこし進んだパラダイムを学んでも良い頃合いでは?

    そうする理由はかっこいいからとか新しいからとかではなく変更に強くなるのとコドの複雑化を抑えることができるから

    何度かこの日記に書いてるけどバリエーションを表現するのにコドではなくデータを使うということ>2015051420181029

  • ータ(BlackWhite の文字列配列)が用意できたらあとは入力(gets.to_i)と出力を最短で結ぶシンプルで無駄のないコドを書くだ2の剰余を添字にすればよいあえて迂遠な書き方をする普遍的な理由なんてない(バカと可読性は個人の属性)これまで if (a == b) return true; else return false; などと書いてきたなら今すぐ悔い改めよ

    それは極端だとしてもコアとなるコ「何かを出力するとなるべきでありその何かを作るのに if 文を書いたりif 文を含んだ関数を一度だけ呼び出したり事前に用意しておいたデータファイルを読み込んだりするのが良い

  • 「もし~ならこうするさもなければこうするという型のコドは2つ「こうするに無制限に無関係な処理が書けるし何もしないこともできるし目的に対して自由度が高すぎるっと制限の強い型にはめれば読み手にいらぬ想定を強いることがない

    だけどアクセス制限にしろ型にしろ制限を強める方向で書くには頭を使うのだなおつむが弱いとカオスをばらまくことが避けられないのだな

最終更: 2020-11-05T19:41+0900

[AtCoder] AtCoder Beginner Contest 181F 問題 Silver Woods

コンテトは終了しているので落ち着いて考えた

  1. それぞれの点について取り得る選択肢は上を通るか下を通るかの二択
  2. 上を通ることを選択した点と下を通ることを選択した点のペアについて考えれば必ずその2点の間を通過している
  3. 総当たりだと最悪の場合に 2100(=126)通りになって大変
  4. 見込みのある選択肢を優先すればなんとかならんか?

 提出 #17835277 (TLE×11 / AC×49)

ダメでしたまあね優先度を付けても裏をかくような難しいケースが良くなるわけじゃないからね

Python の提出一覧を見たら2桁 msAC 提出がいっぱいあったこれはコドを書く前にもうちっと考えなければいけないな


F問題は直感的「釘と直線をグラフの頂点としてークリド距離をコトにして辺を貼りパスのコ「通る辺のコトの最大値としたときに直線から直線への最短距離÷2が答えだと感じたのでそれをダイクトラで実装したら通った

2020/10/26-2020/11/01 - kotatsugameの日記

ええっとですねまずそれが直感的にわからないしそのわかったことを読ませてもらってもそれがどういうことなのかわからないのですね(そもそもユークリド距離の概念が曖昧名前だけ知ってる編集距離なんかと比べて一番普通の距離だと思うけどそう思うだけ)

前半はまあまあ想像できる全頂点を一筆書きして通路を左右に分ける線を引いたとき最も広い点と点のあいだに円を通すということだろうだけど第3の点が邪魔をして最も広い点間を通れないことがあると思うそこから後半最短距離÷2が答えにつなげられない

 @2020-11-04

邪魔をしている第3の点が最も広い点間を挟むどちらかの点と直接繋がる経路というのがより小さいコトを持つ経路なのであり(でないと邪魔できない)最短経路というのはそういう邪魔が入らない経路のことなのだろうたぶんね

答えが示されているからこそこうしてこじつけ気味にでも納得のいく解釈がひねり出せたけどこれ直感的にねえ……(遠い目)


@kyopro_friends「アライグF問題は…「半径rの円が通れるっていうのは「円の中心が障害物からr以内にならないってことだから逆に障害物の方を半径rの円にしちゃえばいいのだ!

Twitter

@kyopro_friends「アライグ「道がふさがったらダメだから障害物同士の距離を全部計算しておいて距離が短いところから順にくっつけていって上の壁と下の壁がくっつくときが答えなのだ!

Twitter

これはわかる気がする(図もあるし)でも逆にこのツイトを読んでもダイクトラ法で実装することがわからないね

 提出 #17842898 (AC / 819 ms)

上のツイトとは関係なくさっきの TLE 提出を微修正したら AC になった事前に XY 配列をソトするだ二択による手戻りを最小限にするために選択肢の優劣が明らかで覆りにくいものを最初に選ぶようにした

いつの間にか Ruby でも AC をとっている人がいてしかも実行時間が2桁 ms なんだけどUnionFind を使っているみたいだったどういうこと?

連結成分の管理トの低い辺からつないで最小全域木ができあがったときに最後につないだ辺のコトがそのまま答えになるクラスカル法と UnionFind が今初めてつながったUnionFind とグラフに関連があるらしいのを今まで見て見ぬふりをして考えてこなかったツケであるなこういう問題(Reachable TownsLine++)が全然グラフの問題に見えないんだよなあ

そうしてみると問題文中で(N 本の)釘とされているものを Silver Woods と表現した問題名は「木だよ森だよグラフだよというヒトだったのだなおしゃれ

ところで自分の提出も2つのケースが 819 ms170 ms なのを除けば2桁 ms で済んでいるーダーが劣ってもだいたい良好ってことでどうですか?

 提出 #17848105 (AC / 93 ms)

ト方法でガチャを引いたら2桁 ms になったーダーは変わっていないので入力の引きとソト方法の組み合わせが悪いとやっぱり遅くなるはず。ランダム入力を使って実行時間を体感でテトしてるんだけど逆順にするだけで十数秒が一瞬になったりする

メインの処理で if-else-end を省いて2+2行だったものを3行にまとめたけど実は再帰呼び出しの回数が多少増える無駄があるだけど事前のソトで無駄が生じにくいお膳立てはしてあるつもりだしトレトで整然とした文字の並びが他には代え難い

メインの処理2行目の d2 変数への代入だって変数の使い回しで省略できるし*3行目で再代入している d1 変数はそれから使っていないしかしトレトで整然とした文字の並びが……


たぶん通ると思う265ト。$$200 以上だったらいいなという運任せ(※多少小さくても入力次第で問題なし)単に minify しただけで見るべきところがないリテラルとか長いメソド名とか多くの変数とか似たような型の処理とか1個あればたくさんなものが多すぎるよね

_,*z=$<.map{_1.split.map &:to_f}
Y=z.sort!.map{|x,y|[y+100,*z.map{Math.hypot x-_1,y-_2},100-y]}
F=->i,d,a,b{
z=(t=Y[i])?(*c=i+=1
e=F[i,e,a+c,b]if z<e=[*t.values_at(*b),d].min
F[i,d,a,b+c]if z<d=[*t.values_at(*a),d].min
z<e&&F[i,e,a+c,b]
z):d}
p F[z=0,$$,[0],[-1]]/2

ーんどうだろう219答えの確かなテトケースがないと自信ない

e,*z=$<.map{_1.split.map &:to_f}
Y=z.sort!.map{|x,y|[*z.map{Math.hypot x-_1,y-_2},100-y,y+100]}
A=[-1],[-2]
F=->i,d{(t=Y[i])?[A,A.rotate].map{(_1<<i;F[i+1,e];_1.pop)if z<e=[*t.values_at(*_2),d].min}:z=d}
F[z=0,$$]
p z/2

 提出 #17867027 (AC / 220 Byte)

よく考えたら AC 提出とランダム入力で答え合わせができるのだった

$$ はダメだったので(#17866997)1バト増えて 220Windows ではプロセス ID は4桁だったんだけど

まあしかしこれだけ長いとこのスクリトひとつとってもいくらでも縮めどころが見つかりそうではある

 提出 #17868705 (AC / 217 Byte)

3文字減ちなみに変更に伴って入れ替わった2数をっちでもいいだろうとそのままにした結果は TLEった>#17868682実は再帰呼び出しの回数が多少増える無駄があるだけど事前のソトで無駄が生じにくいお膳立てはしてあるつもりが裏目に出た当然の結果なんだけどわからんもんかなあ

3文字減った理由がなかなか味わい深い(と思う)Ruby って C++ などと違ってあらかじめ配列のサイズを決めておいたりあらかじめ読み込む行数を想定しておいたりせずにいきなり入力を配列に読み込んで行数は配列のサイズで後から知ったりするだから後続の行数を知らせる一行目は読み捨てても困らない

この問題もそうだったんだけど一行目だけ列数が異なっていることも多くてそうすると共通のルーチンで読み込めないせいで取り扱いに手がかかる(文字数を費やす)からっぱり読み捨てたくなったりする

今回も一行目は読み捨てていてただそれにも gets やらプレースホルダとしての変数名が場所を取るわけなので脚注に書いた不都合を回避するための変数の先行定義を兼ねさせていた

そのプレースホルダであり先行定義である変数の本来用のない中身(定数 N を唯一の要素とする配列)が役に立ったよという話


ゴルフせずに普通に書くとこうなる(普通の定義が狂い気味)

_,*XY = $<.map{|ln| ln.split.map(&:to_i) }
D = XY.sort!.map.with_index{|(x,y),i|
	[*XY[0,i].map{|x1,y1| Math.hypot(x-x1,y-y1) },1e2+y,1e2-y]
}
F = lambda{|x,d,i,up,dn|
	next d unless di = D[i]
	d1,a1 = [*di.values_at(*dn),d].min,up
	d2,a2 = [*di.values_at(*up),d].min,dn
	d1,a1,d2,a2 = d2,a2,d1,a1 if d1 < d2
	_,x, = a1<<i,F[x,d1,i+1,up,dn],a1.pop if x < d1
	_,x, = a2<<i,F[x,d2,i+1,up,dn],a2.pop if x < d2
	next x
}
p F[0,200,0,[-2],[-1]]*0.5

メインの処理が3行から2行へとゴルフをする過程で気がついた無駄が省いてあるのとゴルフをしていると省略せざるを得ない d1,a1d2,a2 のスワップが再帰呼び出しを多少減らす見込ゴルフをしているとまとめざるを得ない2つの似た処理は並べた方が速いしかし誤差程度にしか違わないむしろ入力次第でひどく悪くなるのがクラスカル法とは違うところであり覆せないオーダーの差

深さ優先探索はひとつの経路に縛られるし幅優先探索はひとつの深さに縛られる辺に優劣がないならそういうひとつの決まりに従って網羅的に探索して咎められないとしてもそうでない場合はっと一般的なグラフアルゴリズムを使うのが効果的だということなんでしょうっきは UnionFind についてだけ触れたけど(UnionFind とグラフに関連があるらしいのを今まで見て見ぬふりをして考えてこなかったツケであるな)DFSBFS がグラフアルゴリズムだっていう認識も実は全然持っていない見えないんだよなあ

* while/until などの条件節で初登場する変数がなぜか後置修飾される本体処理で利用できないのが不思議で不満条件式はループに先立って必ず評価されているはずなのにbeginend while ; とは違うのに


20201031() 過去を振り返る「あの頃の俺は賢かったなあという感想がよく出てくる例えば AtCoder を始めたばかりで ABCE 問題の難しさ加減や ABCAGC の違いがわからなかった頃例えば高校生の頃所詮自分なので高が知れているということはあるけどそれでも今となってはついていけない感じがする集中の度合いが違うだけかなだといいな


20201030() 胸ポケトから落ちたシーペンが戻ってきたドアの外の地面に落ちてたことがあるし車内に落ちてたこともあるし机の下の段ボールにナイスキッチされていたこともあるのだけど今度こそもうだめだと思っていたらった人が封筒に入れて郵送してくれていた!!! どなたかわかりませんがありがとうありがとうありがとう■さすがに落としすぎだと思ったの「胸ポケト用ペンケースなる商品を買うことにしたポケトはボールペンのインクで黒くなってるしクリップで挟むフチはほつれてるし穴が空いたのを補修してあるくらいなので一挙四得ねらい


20201023() 「しんごうが青のときにわたりましょうという看板を道路脇に見かけたあまりに当たり前の内容だけど小学生のそれも低学年のうちはそういうことを学ぶ段階なのかもしれないね目の前が小学校だったしところで信号が青でさえあればいいのならわずかな時間を除いて交差点のどこかに必ず青信号を見つけることができると思う「しんごうが青のときにわたりましょうで大丈夫?(ひねくれ) 「正面の信号が青の……ならいいだろういいやそんなことが書いてあった日には自分はカニ歩きを始めてしまうような子供である(おちょうし者)「進行方向の信号が青の……を一応の結論とした進行方向にある2つ目3つ目の信号を見るような子供の面倒までは見きれません(そんなばか者はいない)