最終更新: 2021-01-05T18:27+0900
や
2007年に買
以前書いたとおり、まずは Complete PC バ
ともあれバ
さ
アイコンや文字のサイズなどデスクト
SSD を知らない OS (Windows Vista) を SSD にインスト
最終更新: 2020-12-08T00:48+0900
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 の結果を確認してから予想してカンマを付けたら予想通りの結果にな
ゴルフ
最終更新: 2021-05-07T14:51+0900
超竜馬の移動ル
これ以上ない可読性を誉めてほしい。可読性とはこういうことだ。(他人が言う、ただの手癖レベルの)可読性なんぞいらない(どうして自分が書いたコ
先の AC 提出と全く同じ内容だが after_contest_01.txt という入力だけ WA にな
after_contest_01.txt を通して本当の AC。可読性は維持している。
もちろん誇大表現は話半分に受け取らなければいけない。数学の言葉が通じない人向けに日本語で移動ル
異なる可読性もあると思う。読者を惑わせる無駄や回り道、曖昧さがなく目的に直結する、論理的で考え抜かれたシンプルなコ
期待値? 定義しかわかりません。試行回数が不定? 一瞬で放り投げかけたが踏みとどま
A, B, C 3つも変数があると頭がパニA*10000+B*100+C
と1変数にエンコ
ただし += とすべき確率を = で上書きしていたためになぜかサンプル4だけ答えが合わなか
同じ Ruby で 300 ms 台の提出があるのと比べると 867 ms はかなり遅い。しかしもう考えたくない。
10分しか残
TLE はいいけど WA はいただけない。今日は寝る。
はい、やるだけでした(だがそれができなか
WA の原因は再訪防止のマ
30% あまり速くな
再訪防止フラグ(配列 T)のインデ
問題として与えられるグリ
訪れるべき所を訪れ損な
テレポ/[Sa-z]/
から /[a-z]+/
にした。
S の有無は関係なくて、連続するテレポ
String#each_char で1文字ずつ文字種をテストするのにくらべて正規表現という仰々しい道具を持ち出した String#index が有利になる条件は、テレポ
逆に言えば、テレポ
index メソ
使用済みのテレポ
インクル
もう 20 % ほど速くな
それから、1つだけの WA の原因はよくわからなくな
最終更新: 2020-11-22T08:26+0900
コンテスト中に問題文は理解していたと思う。文は。問題まで理解していたかは知らない。
これを DFS で探索しようとした。だめな選択に早々に見切りをつけて手戻りを減らすために、選択肢の少ない頂点に優先して選ばせようとした。
あとで提出して確かめる。TLE になるならさらに考えないといけない。WA になるなら問題文を読み直さないといけない。
あ、選ばなくていい頂点もあるのか。木の根に相当する頂点。選ばれる辺の数は N-1 以上になるから必ずなにがしかの木+余分な辺になるわけだけど、それがどういう意味を持つのか。最後の頂点だけ選べなくてもいい
最終更新: 2021-02-20T23:02+0900
今回は K 問題までたどり着けなくて、J 問題で詰ま
その後 K 問題は解けたし、なんなら L 問題も解けたけど、時間はかけた。そして M 問題。
まだ3つの TLE に阻まれている。
何について繰り返すか、その通りがかりに素早く答えを出すためにどんな最適化されたデ
実行時間の制限が長めの4秒ではあるけど、制約上の上限がどれもこれも 10^5 だから、何かについて繰り返しているあいだに探索やら配列埋めやら時間がかかる処理をするわけにはいかない。
たとえばクエリごとに色記録配列を埋めるとか、辺(=頂点集合を左右に分ける)ごとに関与するクエリを逆順に検索するとかは間に合わない。Ruby では間違いなく。
Array にはない ^ メソ
3つの演算子(+, -, &)を使
bsearch_index と concat で Array#^ メソ
N 個のノ
「打開するヒントが見えない。どういう形の木なのか」と書いたけど、直線の反対ということで子供が 100, 1000 あるような木を用意したらてきめんに遅くな
変更点はソ
4400 ms が 4200 ms にな
あるノ
※ z-order が大きければ他の色より前に出られる。LCA が小さければ前にある色が LCA に到達して退場するのを待てる。どちらでもなければ前に出る前に退場させられる。
や
LCA が正解だ
うれしい。と
ところで PyPy3 のこのシンプルかつ Python 系で一番速い提出 #18047488 (819 ms) はなんの魔法だろう。半分以上が入力の処理で、残りでヒ
JIT で速いから余計な手をかけないで済むということなら Ruby には関係のないことだけど、考察が足りていなくて自分のアルゴリズムがヘボだというなら、学ばなければいけない。
それはそれとして、LCAの確定を待つ色のリストはソ
初めて Crystal を書いた。色々言いたい。
delete_if と inject メソ
inject は配列の各要素のあいだに演算子を挿入するイメ
lambda メソ-> () {}
と書いた。アロ
パラメ)
を所望する」と怒られ、素直に )
を書いたら型注釈を付けろと怒られる無限ル
後付けするなら記号は選ばなければいけない。Ruby の仕様(メソ
_
が使えない。なぜ?定数と変数が同じスコ
n,q = gets.split.map(&.to_i) N = n; Q = q
これは変数 n が定義されていないというエラ
(追記:下の方で答えを書いてたかも。「map が遅延評価? .to_a を付けないと期待したタイミングで副作用が起こらない。
」 map が遅延評価であることと代入が行われないことは別だと思うのだが違うのか。違う(別ではない)なら大変に興味深い Crystal の特徴だと思う)
&:to_i
と書いていたものを &.to_i
と書かせる。
.to_i
が Crystal という言語を構成する部分として定義されており、プログラマが操作可能な対象であるなら評価は変わるけど、単に &
という目印のバリエ&.
を追加したなら、ただの好き嫌いでただの罠。
{|i,|}
とか {|i,j|}
とかできない雰囲気。それとも StaticArray だmap.with_index
と書くと map にブロnil が非常に煩わしい。Ruby はすべての変数が Nullable だし、偽と評価される値が nil と false だけなのもあgets.to_i
とは書けなくて gets.to_s.to_i
と書かされるところ。たぶん (gets||"").to_i
でもいいとは思う。
実行時エラ
&.
によるメソ
[]
とか {}
とか書けない。とりあえず領域を確保するために [nil]*N
と書くのもタイプミスマすべてドキ
俺は人類の手には多少余るとしても、プログラマを信頼し、力を与えてくれる言語が好きだ。安全のためと称して枷をはめようとする言語は選ばない。安全な
では Ruby の切れ味は? Ruby はプログラマがやりたいことの邪魔をしないのがいい。Ruby がコ
Crystal の型はどうか。プログラマに力を与えるためではなく、処理系が力を得るためにプログラマが受け入れる枷だというのが、少し触
const 教の信者というのは最も“const と書きたくない”人種のことだと自認している。const という当たり前のことを、どうしてあちこちそちこちに書いて回らなければいけないのか。所有権も魅力的だけど、const と書かなくてもいいという1点でまず、Rust の評価が高い。
C++ も Ruby も好きだけど弱点がある。Rust には期待ができる。でもコンパイラが起動できないんだよなあ。「rustc.exe - エントリ ポイントが見つかりません。プロシ
」 本でも読むか。
#18069462 と比べて、-1016 Byte / -313 ms / -33108 KB
。短くて速くて省メモリ。
先に書いたように、「クエリごとに色記録配列を埋めるとか、辺(=頂点集合を左右に分ける)ごとに関与するクエリを逆順に検索するとかは間に合わない」のはたぶん間違いないけども、2つを混ぜてクエリの逆順に効率良く色記録配列を埋めるところまでは考えが及んでいなか
時間軸を反転することで、一度塗
PAST4M - 西尾泰和のScrapboxったところを再度塗らないでスキ ップしたい
その方針でや
最終更新: 2021-05-07T15:06+0900
DP の基本形とい
実行時間の変遷が見どころ。
N×K×W のル
N のル
提出一覧が 1000 ms を超えるグル
B の値域が(W にくらべて)かなり狭い範囲に限定されているのがポイントで、速い方はル
2番手以降の集団をダブルスコアで突き放す zazaboon さんの提出 #11417636 (150 ms) を調べた結果。
以上の点を真似したのに加えて、考えられるこちらのアドバンテ
a = [a,b].min
と書くより a = b if b < a
と書いて代入を省略できる方が速い。(だけど本当は宣言的な変数定義がしたい。操作ではなく結果について書きたい)前後のリストを比べると後ろは問題と関係のない比較的どうでもいい内容が並んでいるね。
いまのところの Python 最速。AB 配列を幅対重要度比でソ
使う使わないの二択だと比率がち
最近別の問題を自分が DFS で解いたときのことだけど、「さ
最終更新: 2020-11-06T01:42+0900
ほんの一瞬、1,10,100,1000,10000,... を8で割
こういうの
物量に頼
お留守だ
とくに悩むところはなか
デ
惜しむらくは提出時刻がコンテスト終了の6分後だということ。
こうな
次の C 問題 Collinearity ではさ
こういうコ
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番目のようなスクリプトを書く前に自分が考えること……
もし~ならこうする、さもなければこうする、という構成はあまりに手続き的。もうすこし進んだパラダイムを学んでも良い頃合いでは?
そうする理由はか
何度かこの日記に書いてるけど、バリエ
デif (a == b) return true; else return false;
などと書いてきたなら今すぐ悔い改めよ。
ま、それは極端だとしても、コアとなるコ
「もし~ならこうする、さもなければこうする」という型のコ
だけどアクセス制限にしろ型にしろ、制限を強める方向で書くには頭を使うのだな。おつむが弱いとカオスをばらまくことが避けられないのだな。
最終更新: 2020-11-05T19:41+0900
コンテストは終了しているので落ち着いて考えた。
ダメでした。まあね、優先度を付けても裏をかくような難しいケ
Python の提出一覧を見たら2桁 ms の AC 提出がい
F問題は、直感的に「釘と直線をグラフの頂点として、ユ
週記(2020/10/26-2020/11/01) - kotatsugameの日記ークリ ッド距離をコストにして辺を貼り、パスのコストを「通る辺のコストの最大値」としたときに直線から直線への最短距離÷2」が答えだと感じたので、それをダイクストラで実装したら通 った。
ええ
前半はまあまあ想像できる。全頂点を一筆書きして通路を左右に分ける線を引いたとき、最も広い点と点のあいだに円を通すということだろう。だけど第3の点が邪魔をして最も広い点間を通れないことがあると思う。そこから後半の「最短距離÷2が答え
」につなげられない。
邪魔をしている第3の点が最も広い点間を挟むどちらかの点と直接繋がる経路というのが、より小さいコストを持つ経路なのであり、(でないと邪魔できない)、最短経路というのはそういう邪魔が入らない経路のことなのだろう。たぶんね。
答えが示されているからこそ、こうしてこじつけ気味にでも納得のいく解釈がひねり出せたけど、これが「直感的に
」ねえ……(遠い目)。
@kyopro_friends「アライグマ「F問題は……「半径rの円が通れる」
Twitterっていうのは、「円の中心が障害物からr以内にならない」 ってことだから、逆に障害物の方を半径rの円にしち ゃえばいいのだ!」
@kyopro_friends「アライグマ「道がふさが
Twitterったらダメだから、障害物同士の距離を全部計算しておいて、距離が短いところから順にく っつけてい って、上の壁と下の壁がく っつくときが答えなのだ!」
これはわかる気がする(図もあるし)。でも逆にこのツイ
上のツイ
いつの間にか Ruby でも AC をと
あ、連結成分の管理か。コストの低い辺からつないで最小全域木ができあが
そうしてみると問題文中で(N 本の)釘とされているものを Silver Woods と表現した問題名は、「木だよ、森だよ、グラフだよ」というヒントだ
ところで、自分の提出も2つのケ
ソ
メインの処理で if-else-end を省いて2+2行だ
メインの処理2行目の d2 変数への代入だ
たぶん通ると思う。265 バイト。$$
が 200 以上だ
_,*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
う
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
よく考えたら AC 提出とランダム入力で答え合わせができるのだ
$$
はダメだ
まあしかし、これだけ長いとこのスクリプトひとつと
3文字減。ちなみに、変更に伴
3文字減
この問題もそうだ
今回も一行目は読み捨てていて、ただそれにも gets やらプレ
そのプレ
ゴルフせずに普通に書くとこうなる(普通の定義が狂い気味)。
_,*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,a1 と d2,a2 のスワ
深さ優先探索はひとつの経路に縛られるし、幅優先探索はひとつの深さに縛られる。辺に優劣がないならそういうひとつの決まりに従
* while/until などの条件節で初登場する変数が、なぜか後置修飾される本体処理で利用できないのが不思議で不満。条件式はル