メニエスの名のもとに

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

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

バグではなくて仕様です

convert のバグと思われた事、convert すると使用する解法アルゴリズムが変わるという事は、バグというよりも仕様でした。前回の結果では、Locked Candidate の数が変わっていたわけですが、その原因はブロックの位置が変わることによって、最初にみつかる Locked Candidate が変わることにありました。
hidden singel アルゴリムによってそれ以上候補が消せなくなると、Locked Candidate アルゴリズムで消せる候補を探索します。その時、ブロックと行、列との組み合わせを見ていくわけですが、二つ以上Locked Candidateの形になっていると、見ていく順番によって消されることになるマスと数が異なります。そして消した後、また最初から naked single, hidden single というようにアルゴリズムを使って数を消していくのですが、この時に以前あったもうひとつのLocked Candidate の形が消えることがあるわけです。
順番に依存しないようにするのは面倒なので、これは「バグではなくて仕様です」

仕様でした

しかし、この問題作成プログラムが完成したら利用しようと手ぐすね引いて待ち構えている大勢のアプリ制作者がいると思うと、そうそう手を抜いた仕様で公開するわけにはいきません。
というわけで、これから仕様変更します。convertによって変わらないような形で、どのアルゴリズムを何回使用するかを表示するようにします。さっき風呂の中で考えていたら、大したことないという気がしてきたので。
ちなみに、本当にこの問題作成プログラムの完成を待って、数独パズルゲームを作ろうと考えているとしたら、それはビジネスとして後手にまわっていますよ。完成など待たずに、「問題を売ってくれ」と言えばこっそり売りますから。そうすれば、完成を待っている呑気な競争相手を出し抜くことが出来るわけです。

analysis

以前に書いた solve や recursion_solve とは違うので、analysis という名前でプログラムを作ります。naked single は最初に使うのでそれは別にして、それ以後の解法である候補が消せたとしても、そこでリターンしないで再帰すればいいはずです。そして再帰の返却値が一番小さいものを採用すればよい。
となると、このナンプレ問題作成で最初に否定した難易度の定義が必要になります。しかし、それを今更やるのは癪なので、difficulty ではなくDと隠語で呼ぶことにします。昔から、口に出すことを憚るものをDと隠語で呼ぶ習わしがあるのです。
実際のプログラムはこの次。よくwebにいる天才プログラマじゃないんだから、そうそう簡単に書けるものか。

バンパイアハンターD(オリジナル日本語バージョン) [DVD]

バンパイアハンターD(オリジナル日本語バージョン) [DVD]