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

脳log[20210121]



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 メソッドは間違い。処理が重複して無駄になっていた。