2020-05-30
ごきチャ、読み終わった。 なんだかんだで全5巻読み切ってしまったのだけど、面白いから読んだのか題材の奇抜さに読んでしまったのかよくわからない…。
RBSにFiber#raise
を足したり、Fiber#initialize
の型が微妙に間違っていたから直したりしていた。
RBSのドキュメントを直した。
Slackに0 ~ Fまでの絵文字があると便利かなと思ったので描いた。CC-0とするのでご自由にどうぞ。
ruby-jpで発言したままIssue化していなかったるりまの問題をIssueにした。
ruboty-numberplaceで、16x16の問題も生成できるようにした。
16x16以前の生成方法は次のような感じ。
- ランダムなマスをランダムな数字で埋めてみる
- それを解いてみる
- ここで解く時に唯一解でなければ解けないようなソルバを使うことで唯一解であることを保証できる。
- 解けたらそれを問題として採用、解けなかったら 1 に戻る
これだと9x9は生成できても、16x16は生成できなかった(というか遅すぎる)
そこで、実際に問題を解くときにも使う、空マスを1つ仮定してみる方法を使うことにした。 ↑の手順で解けなかった場合からが少し変わる。
- 解けなかったら、空マスのうち入りうる数字が一番少ないマスをランダムに1つ選ぶ。
- 選んだマスに入りうる数字の1つを試しに埋めて、解いてみる
- 問題が解けたら、マスを埋めたバージョンを問題として採用する
- 問題が解けず、かつ入りうる数字がなくなってしまったマスがある場合、一番最初まで戻る
- つまり、最初のランダムなマスをランダムな数字で埋めるところから始める
- 問題が解けず、かつ全てのマスに入りうる数字がなにかしらある状態であれば、このリストの 1 まで戻る
これで速くなって、16x16も現実的な時間で生成できるようになった。
ただ、どんどん空マスを埋めていってしまうので、空マスが少ない盤面になりがちという問題がある。 この逆の手順をやって、1マス削っては解けるか試す、というのをやれば空マスを調整できそう。
一回仮定を入れているから唯一解がある問題になるかちょっと不安だったけど、多分平気なんじゃないかなあと言う気がしている。
ナンプレ解くgem、なんとなく語感が似てるしなーと、gem作ってる時になめろうを食べてたから namero という名前にしたのだけど、どうしても numero と打ちたくなってしまう。