/ 最近 .rdf 追記 編集 設定 本棚

脳log[20230207] Ruby クイズ (複合代入編)



2023年02月07日 (火) [AtCoder] 精進。ABC008-D「金塊ゲーム」(黄 diff)。以前順番に埋めていっていたときに埋めきれなかった古い ABC の問題。今となっては何がわからなかったのかわからない。だって今日は以前に立てた方針をそのまま実装しただけなのだから。■提出 #38698822 (AC / 469 Byte / 155 ms)。最初四角の枠があって、機械を動かすごとに枠が4分割される。枠の中にあるどの機械を一番に動かすかのがいいかは総当たりで決める。枠を定める4つの値のバリエーションは N+1 個から2個と N+1 個から2個を選ぶ組み合わせの掛け合わせだから高々 N の4乗程度。N≦30 だから N^4≦81万。枠の中にある機械の数は N 以下だから全体で N^5≦約2400万を見込んでおけば足りる。定数倍が軽ければ Ruby でも通る。

最終更新: 2023-02-08T02:07+0900

[Ruby] Ruby クイズ (複合代入編)

a = b = 0 # 初期化
a += b += a += 1 # 本題
p a #=> 1? 2?

右から順番に a に 1 を足して(a=1)、b に a を足して(b=1)、a に b を足して(a=2)、と考えると間違える。「自己代入」を読むと「この形式の代入は 式1 = 式1 op 式2 と評価されます。ただし、op が &&, || の場合には(略)」と書かれている。一番右の a += 1 が評価される前に一番左の a +=a = a + と分解されていて古い a の値が評価中の式の値として一時的に記憶されているのだと考えられる。a の値は 1 になる。ちなみに C++ では 2 になった。

この前の ABC288-D が解けなかった理由のひとつにはこの罠に気がつかなくて合わせるべき数字がそもそも間違っていたということがある。それがなくても解けなかったのもたしかだけど。