メニエスの名のもとに

プログラミング関係を中心としたぐだぐだブログ

ナンプレ(数独)問題作成プログラム その18 convert

ケチケチ作戦

digging hole をやった結果からも分かるように、難しいナンプレの問題はなかなか生成できないのである。貴重な存在なのである。そこで、もし見つかったなら、それを大切にしたいと思うわけだ。貴重なものは大切にしよう。
そういうわけで、問題を変換することにする。同じ解法で解けるが、見た目が違うような問題にするのである。
「ナンプレ練習」製品版では、Locked Candidate は50問、Tuple, X-Wing, Sword Fishは60問、自由練習は100問が組み込まれているが、組み込まれている問題を全部解き終わると以前の問題を変換して再度出題するようになっている。なあに、人間は50問も前の問題は覚えていないはずだ。その上に数字や配置を変更していたら、分からないはずだ。いや、記憶のいい人っているから気づかれるかも。

convert

static void random_symbol(numpl_array * array) これは数字を入れ替える。
static void reverse_change(numpl_array * array, int mode) これは盤面を上下左右対称に変える。(元の盤面は点対称)
static void block_reverse(numpl_array * array, int mode);これはブロックを入れ替える。
static void line_change(numpl_array * array, int mode);これは行、列を入れ替える。
ということをやるわけだ。もうプログラムは面倒だから、GitHubを見てもらう。
で実行すると、

$ ./convert "5 71    3 2  4   9 91  8     6 19    1     5    65 4     8  29 8   6  4 4    16 8"
" 56  1    9  7   11 74    9  9 27    2     4    54 7  8    43 25   9  6    1  45 "

こんな風に変換されて全然違う問題に見えるわけである。
念のためにsolveをやってみる。同じ解法で解けるはずである。

$ ./solve -s  "5 71    3 2  4   9 91  8     6 19    1     5    65 4     8  29 8   6  4 4    16 8"
213,18,1,0,0,0,0,0,28,1,"5 71    3 2  4   9 91  8     6 19    1     5    65 4     8  29 8   6  4 4    16 8"

変換後は

$ ./solve -s " 56  1    9  7   11 74    9  9 27    2     4    54 7  8    43 25   9  6    1  45 "
216,16,2,0,0,0,0,0,28,1," 56  1    9  7   11 74    9  9 27    2     4    54 7  8    43 25   9  6    1  45 "

違うじゃないか。バグだ。solve のバグか、convertのバグか。なお、このブログはデバッグの過程を眺めて楽しめるようになっています。
たぶん solve のバグだと思う。convert のバグなら解けなくなる可能性が高い。解けている(引用符の前の1が解けたという印)ので solve のバグが疑われる。もし、convert のバグであって、かつ解ける問題が解ける問題に変換されるなんてことがあったら、これは嬉しいことなのである。