/ 最近 .rdf 追記 設定 本棚

脳log[2021-01-21~]



2021年01月21日 (木) [Ruby] 箱入り娘というパズルがあるそうな。最短81手の初期配置を解く>箱入り娘.rb。何をもって一手と判断されるかはここを参考にした>「箱入り娘/解答」。パッとは書けなくて、じっくり時間をかけた。Ruby 1.8 対応はできなかったけど 1.9 と 2.5 と 2.7 は OK。ここでは最少 138 手の配置が紹介されている>「箱入り娘パズルの攻略法」 それもスクリプトに足しておいた。たしかに 138 手だった。■■■同じく Ruby で解いていた人がいる。「箱入り娘パズルをRubyで解く - yarbの日記」 22分かかるって書いてあるんだけど、s.visited という行を s2.visited に書き換えて8行か9行下に持って行くと、30秒もかからずに終了しましたよ(そして9305手の履歴を表示した)。そもそも Ruby 2.7 では元のままでも5分かからずに(書いてある通りに) SystemStackError が出たのであるが。■■■@2023-10-02 バグみっけ。箱入り娘.rb の 30 行目。Array#uniq にブロックを渡して処理を行っているが、このブロックは uniq メソッドの一部として働くのであって、uniq した結果が渡されてくるわけではないんだよね。Array#split にブロックを渡す用法があるのを知って以来、隙あらば each を省こうと狙っているのだけど、Array#zip と Array#product は良くても uniq メソッドは間違い。処理が重複して無駄になっていた。


2021年01月17日 (日) いつの間にかセンター試験が終わっていた。なくなったという意味で終わっていた。時代は共通一次……ではなく共通テストらしい。

最終更新: 2021-03-02T17:55+0900

[AtCoder] 緑diff精進4問

AtCoder Regular Contest 100C 問題 Linear Approximation
提出 #19496296 (AC / 124 Byte / 173 ms / 36900 KB)
ソートすることに気付けたらあとは基準線をどう上下させるかだけ。
最初は平均をとって考えていたが中央値だった。ひとつだけへっこんだ極端な要素に下駄をはかせようとして、他のすべてがそろってでっぱったら意味がない。+1 するか -1 するか、改善する要素が多い方を選び続ける、その均衡点。
AtCoder Beginner Contest 115D 問題 Christmas
提出 #19497044 (AC / 480 Byte / 63 ms / 14280 KB)
2020年12月にあった PAST の J 問題 長い長い文字列を思い出した。提出 #19035422
ということはこの問題も、クラスも入れ子にしたインスタンスも(つまりは再帰関数が?)不要で解けるということなんだけど、それは解らないので答えはプログラムに聞いた。
天下一プログラマーコンテスト2012 予選CB 問題 ロイヤルストレートフラッシュ
提出 #19497447 (AC / 169 Byte / 65 ms / 14320 KB)
これは簡単。最大でも50枚ちょっとしかないカードなんていかようにも処理できる。
Tenka1 Programmer Beginner ContestC 問題 Align
提出 #19498159 (AC / 215 Byte / 182 ms / 16952 KB)
よくわからない。雰囲気で答えらしきものを求めた。
これを提出するときに1年以上前に D 問題 Crossing に挑戦していたことを知った。提出 #8100494。え? さっぱりわからないんだけど。当時と同じように1時間ちょっと考えてどうにかなる気もしない。

2021年01月15日 (金)

最終更新: 2021-01-16T18:37+0900

[AtCoder] 緑diff精進3問

Coprime はまた解けなかった。WA ではなくなったけど TLE が解消しない。

AtCoder Grand Contest 023A 問題 Zero-Sum Ranges
提出 #19447872 (AC / 107 Byte / 176 ms / 43452 KB)
以前に一度挑戦して TLE になっている。今となってはどうやって TLE を出すのかわからない。
半年前(20200615)まで累積和という概念・単語を知らなかったから、それが理由だろうな。
AtCoder Beginner Contest 160E 問題 Red and Green Apples
提出 #19448291 (AC / 114 Byte / 192 ms / 42816 KB)
リアルタイムで参加した ABC だけど D 問題で詰まったからこの問題は初見。こんなに簡単でいいのだろうか。X≦A、Y≦B という制約がまた親切で、面倒な場合分けを取り除いている。
提出 #19457324 (AC / 94 Byte / 242 ms / 41108 KB)
引数付きの max メソッドを使うチャンスだと気がついて再提出してみたら 25 % くらい遅くなった。用意された罠なの?
diverta 2019 Programming Contest 2B 問題 Picking Up
提出 #19449145 (AC / 184 Byte / 65 ms / 14404 KB)
2019年と2020年に一度ずつ提出して同じように1つの RE と3つ4つの WA をもらっていた。RE は N=1 のケース。WA はたぶん軸に平行な傾きをうまく扱えなかったんだろう。今回は読めていた。

2021年01月13日 (水)

最終更新: 2021-05-04T21:04+0900

[AtCoder] 緑diff精進5問(+α)

AtCoder Problems がお勧めする Moderate な問題(緑difficulty)を上から順に解いた。半年前に解けなかった問題も1年前に解けなかった問題も解けた。だから0完だったこの前の ARC 111 は忘れよう。

AtCoder Beginner Contest 178E 問題 Dist Max
提出 #19414840 (AC / 137 Byte / 319 ms / 28476 KB)
わかるようなわからないような感じが今でもするんだけど、y=x に沿って対極にある2点と、y=-x に沿って対極にある2点を抽出して比較すればいいらしい。コンテスト後に解いた人の感想が目に入っていたのでチートといえばチート。
AtCoder Beginner Contest 152D 問題 Handstand 2
提出 #19421375 (AC / 312 Byte / 63 ms/ 14260 KB)
面倒くさく計算で解いたんだけど、N 個の数を列挙して先頭の桁の数字と末尾の桁の数字でクラス分けして数えて掛け合わせるので解けたらしい。たぶんそちらの方が間違えない。
AtCoder Beginner Contest 114C 問題 755
提出 #19420198 (AC / 210 Byte / 81 ms / 17972 KB)
さっきのと似た問題。これは計算と列挙のハイブリッドで解いたんだけど、そうすると速くもなくシンプルでもなくどっちつかずになった。
そうすると? これを見よ>提出 #15048046 (jajapop さん)。シンプルに列挙して速い。
AtCoder Regular Contest 006C 問題 積み重ね
提出 #19420356 (AC / 95 Byte / 69 ms / 14280 KB)
謎の段ボール。重さと丈夫さが1つの数字で同時に表されている。1の上に2は乗せられないけれど、1と1と1を3つ乗せることはできる。謎の段ボール。
あ、大きさだと考えればいいのかも。小が大を支える不安定な重ね方が NG だと。でも重さって問題文に書いてあるなあ。←どうでもいいから解け。
最適な置き場所は1つなので貪欲法で。
AtCoder Beginner Contest 039D 問題 画像処理高橋君
提出 #19421120 (AC / 242 Byte / 86 ms / 29364 KB)
最近の ABC-D はこういう素直に実装するだけの問題ってなくない? 数学でいじめられたり制約でいじめられたりばっかりじゃない? この問題が今の ABC で出たら difficulty が緑ってことはまずなくて、灰茶がいいところだと思う。世知辛いなあ。

 アナクロニズム

過去問はテストケースが利用できる。DropBox からダウンロードするとコンテストの各問題ごとに in フォルダと out フォルダが解凍される。

ARC111_A フォルダの中がこうなっているとする。

  • in/
  • out/
  • my_answer.rb

そこで次のように実行する。(ARC111_A> はプロンプト)

ARC111_A> attc my_answer.rb

attc.bat の中身がこう。

@echo off
for %%F in ("in\*") do (
	call :run "%~1" "%%~F"
)
exit /b 0

:run
	echo %~1 ^< in\%~nx2
	call ruby27 "%~1" < "in\%~nx2" > "out\%~n1.out.txt"
	fc /A "out\%~n1.out.txt" "out\%~nx2"
	del "out\%~n1.out.txt"
	echo.
exit /b 0

カレントディレクトリの in フォルダの中身を入力として引数のスクリプトを ruby27 コマンドで実行する。出力を out フォルダの同名のファイルと fc コマンドで比較する。

call ruby27 という風に call が付いてるのは ruby27 が exe の名前ではなくて、C:\Program Files\Ruby27\bin に PATH を通してから ruby.exe を呼び出すバッチファイルの名前だという固有の事情から。

別に call でなくて当たり障りのないコマンドならたぶん何でもいいんだけど、call|ruby27 という風にパイプを通すと新しいコマンドインタープリタが起動するので、呼び出したバッチが setlocal してなかったとしても現在の環境(PATH 変数とかカレントディレクトリとか)が汚染されなくなるというハックがある。cmd /C "ruby27 ..." と同じことなんだろうけど、そっちは引数が引数になって二重の引用符が面倒の種だよね。

tc は Test Case の略だけど、 AtCoder の略が at か ac かで定まらないから、attc と actc の両方の名前でバッチを用意してる。ハードリンクにしたら中身の同期に手間もかからないし。

アナクロだけどそれなりに便利。


2021年01月12日 (火) ブックオフオンラインの[カートに入れる]ボタンはタイミングや履歴に依存した処理をしている。どういうことか。本のページを開いて[カートに入れる]ボタンを押した。ブックオフオンラインは恒常的にサーバーレスポンスが激遅だから、待たずに他の本のページを開いて[カートに入れる]ボタンを押した。何が起こったか。最後に[カートに入れる]ボタンを押した本がカートに複数入って、代わりに一部の本がカートに入らなかった。レスポンスがコンマ数秒の Web サイトならタイミング依存も発覚しないかもしれませんけどね、あなたのサイト10秒でも20秒でも待たせるじゃない……。


2021年01月10日 (日) 感情を説明することが難しいという話に対する詳しい説明」■Togetter のまとめより増田の方がわかりやすかった。思うに何が欠けているかと言えば、相手への働きかけではないか。自分の感情を見つめても答えは出ないのではないか。ブコメから抽出したというこれが典型的。「ご飯を作ってあげたときに「美味しいよ」とか「ありがとう」の前に「鶏肉をもも肉からむね肉にしたんだね、さっぱりとした味になっているね」とか言われたらそりゃモヤモヤするよ」 相手に感謝を伝える、それは喜ばせようという働きかけであり、愛情があればその意思を持つのが当たり前である、ということを学習すればいいように思う。意図をもって働きかける意思が持てればいいと思う(操作か支配かと忌避感があるけどね)。変化を恐れず、相互作用を起こし、相手の反応を楽しむべく努力しよう。相手の喜びこそ自分の喜びとしよう。■私はそれができない。■「ふたりで、ひとつに、なれちゃうことを、きもちいいとおもううちに、すこしの、ずれも、ゆるせない、せこいにんげんになってたよ」 善し悪しだけど良さをまだ知らぬ。


2021年01月08日 (金) 東北大等の研究グループ、父親が高齢だと子が発達障害になりやすいとするマウス実験結果を発表 | スラド サイエンス」■このときの>20191224。結局、DNA 配列の変異を伴わない、メチル化、エピジェネティクスを中心に置いて読み解けば良かったのだということが理解できる発表内容。いやあ、それは難しいでしょう。全然著者が中心に据えている考えに導かれていかなかったよ。最初から前提となる考えを共有しているのでなければ理解できなかったよ。


2021年01月03日 (日)

最終更新: 2021-01-03T19:49+0900

[AtCoder] AtCoder Beginner Contest 187E 問題 Through Path

PAST 第4回の M 問題 筆塗りを思い出したよね>20201111p01.01

制約が 10^5 の組み合わせだというところが同じ。だから何について繰り返すかというところが核心。繰り返しの繰り返しは許されない。N-1 本の辺を順序よく1往復か2往復すれば答えが出そうな気がするんだけど、全然ループの軸が見えなかった。まだ見えていない。テキトーにキューに突っ込んで処理できる順に処理しても間に合うかと考えてみたけど、メモするデータが定まらなくて完成しない。こういうところだよ。こういうところが緑色で燻っている理由だよ。


2020年12月31日 (木) KyashからRevolutへ移行中 - ただのにっき(2020-12-24)」■全然内容と関係ないことを書くんだけど、全然ってこともないかもしれないけど、自分は Kyash をずっと(黙読で)カイアッシュと読んでいるし、Revolut はレヴォルットと読んだ。レヴォルートも、e が欲しいところだがギリギリ、ありか。公式がどう読ませたいかは関係なく、読めるように、読みたいようにしか読まない。読めない名前、声に出せない名前ってそれだけで不利。識別子として役に立っていない。ましてそれがキャッシュではね。■ Costco が全然コストコじゃないってつい最近知ったんだけど、そのスペルと日本語話者の発音能力を考えるとコストコしかないって思う。どうせそのように読まれるし、そのようにしか発音できないし、それを、間違いですよと公式に言われてしまっては、もう指示語でしか語れない。あの……、あれ、コスなんとかっていう……。ヴォルデモート(He-Who-Must-Not-Be-Named)なの? だからコストコはコストコでいい。


2020年12月25日 (金)

最終更新: 2020-12-26T00:15+0900

[WR250R] ヘルメットホルダーが壊れたけどなんとかなったっぽい。

6年目に入った WR250R。ヘルメットホルダーがカチッと閉じなくなってただのフックと同じになった。

世の中には鍵付きのメットホルダーすら信用しない人がいるらしいが、自分はそこまでではない。だけど本屋なんかに行ったときにヘルメットを無造作にミラーに引っ掛けて、ということもできないので、その他の機会と合わせて月に数回から10回くらいの頻度で使用していると思う。酷使しているつもりはないが壊れた。壊れたメットホルダーを検索すると割と上位にこういうものが見つかった>「WR-Rのヘルメットホルダーが壊れた・・・ – Levico's BLOG」 お仲間。

メインキーと共用だというところに価値の半分があるので、新品交換で価値が半減しないかが心配。

T30 のトルクス1本で車体から外れる。バックプレートはプラスネジ2本。2本は同じだと思ったが組み直すときに一方が途中までしか入らなかったので入れ替えてみたらすんなり締まった。罠なのか?

バックプレートを外した状態。フックがあるのと反対側、車体側から見ている。表から見た形はこれとほぼ同じ>「【楽天市場】【在庫あり】DAYTONA デイトナ ヘルメットホルダー CT125:ウェビック 楽天市場店

鍵をひねった状態。中央の銀色のパーツが逆時計回りに30度くらい回転した。色の関係で見にくいが回転軸に巻き付いて伸びた茶色の板バネがケースの上面をこすりながら力を蓄えている。

板バネにこすられて傷ついたケース上面。バネが傷に引っ掛かって位置が固定されるために蓄えた力が解放されない。結果としてフックを差し込んでもラッチが掛からない。残念なことに鍵をひねって強制的に閉じることはできない。スロットルワイヤーが開く・閉じるの2本1組であることの大事さがわかりますね。

一時しのぎだけどバネを取り付ける向きを180度回転させてケース下面をこするようにした。これでもう5年は大丈夫……かな?


2020年12月24日 (木) カラスって人が近づくとピョンと一歩だけ距離をとってこちらの様子を窺っている。小鳥のように一目散に逃げていったりはしない。おいおいその様子見が命取りだぞと心の中で警告してみるも、実際のところ人間にそこまでの脅威を感じないのだろうし、カラスに関心を持つ人間がほとんどいないことも承知の上なのだろう。一歩分の警戒しか見せないカラスの横着さが愛おしい。ついつい立ち止まって無遠慮に視線を合わそうとしてしまう(決してガンを飛ばしているわけではない)。


2020年12月22日 (火)

最終更新: 2020-12-23T00:48+0900

[AtCoder] パナソニックプログラミングコンテスト(AtCoder Beginner Contest 186)E 問題 Throne

まだ AC をもらっていないし、それどころかひとつの提出もできていないけど、外堀が埋まってきた気がするので経過を書く。

 シミュレーションした。(未提出)

gets
puts$<.map{|ln|
	n,s,k = ln.split.map(&:to_i)
	ss = {0=>m=0}
	until ss[s]
		ss[s] = s
		m -= (s-n)/k
		s += (s-n)/k*-k
		s %= n
	end
	next s == 0 ? m : -1
}

これはサンプルの4つのケースのうち、3番目を除いて正しい答えを出す。3番目の 998244353 897581057 595591169 にもたぶん正しい答えを返すだろうけど、答えがおよそ 250 メガなので数分単位の時間がかかるはず。

N と S と K の3つの数字があるけど、N と K が近接していてしかもべらぼうに値が大きい。ループ1回のイテレーションで全周 N のうち1点だけをテストするのでは最悪 N 回繰り返す。N の上限は1ギガだ。

 たとえば K = N-1 の場合

1回のイテレーションで S-1 の地点に移動する。S 回のイテレーションで玉座に移動することが即座に理解できるが、スクリプトにそれは反映されていない。

 たとえば N と K が偶数で S が奇数の場合

K が2より大きければ(N との関係にもよるが)すべての偶数地点を網羅できるとは限らないが、K が最小の偶数2であっても、スタート地点 S から奇数席離れた玉座に移動できないことはすぐにわかる。これもスクリプトに反映されていない。

 それで?

N と K と S の関係をどういう式で表すのかなあ。LCM だか GCD だかのキーワードは目に入ってるんだけど。


K = N%K という風に再帰的に K を更新していくと最後は 0 に落ち着く。K が 0 になるまでに S をどうにかしたものが K で割り切れれば答えは N/K の倍数±α になりそうなんだけど、S をどうするのか、N-S をどうにかするのか、よくわからない。


2020年12月20日 (日) 俺の脳みそのクロック周波数は常人の3分の1だ!(長生きしそう)