「あらゆる数独パズルを解く」で紹介されているPythonの数独ソルバをRubyに移植してみた。移植したのは骨格の部分だけだが、解のある問題であれば解けるはずだ。
もともとは、頭の体操がてら自力で実装を始めた。だが、結局探索することになるなら誰が書いてもほとんど変わらない内容になるだろうと思い、他の人のコードを見てみることにした。
もっと簡潔に書けるし、そもそもグローバル変数を使いすぎだとも思うが、元のコードの意図をなるべく尊重してわざとそのままにしてある。
移植するだけでも様々な気づきがあった。
- リスト内包表記の簡潔さ
- Hash生成のイディオム: Hash[keys.zip(vals)]
- 浅いコピーの罠: values[s] = values[s].delete(d) を values[s].delete!(d) と書いてしばらく悩んだ
解のない問題や複数解のある問題を考慮すると、SQLで数独を解くのが適当なのかもしれない。刈り込みによる高速化も面白そうだ。