Skip to content
MSaito edited this page Mar 7, 2015 · 3 revisions

NumPl ナンバープレース問題作成プログラム

このプロジェクトはコマンドラインでナンバープレース(数独)の問題を作成するものです。

C言語で書かれていますから、オブジェクト指向や関数プログラミングなどという難しいことを理解していなくても、プログラムを読めばアルゴリムを理解することが出来るでしょう。

簡単な使い方

Windows でのコンパイルは試していません、Unix 風の環境を用意して下さい。 ZIP ファイルをダウンロードし、展開したら、そのディレクトリにcdしてください。

make all
./generate > numberplase.puzzle.001.txt

これで問題が1問生成されます。
生成された問題を見てみましょう。

cat numberplace.puzzle.001.txt
generate start seed = 4661 number = 1
"92,14,5,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,25,1":" 1 23     2   4    56 7      4 5   2 37   51 1   4 3        84    8   6     29 3 "

後半の" 1 23 2 4 56 7 4 5 2 37 51 1 4 3 84 8 6 29 3 "が生成された問題です。9文字ごとに区切るとナンプレの問題になります。

 1 23    
 2   4   
 56 7    
  4 5   2
 37   51 
1   4 3  
      84 
   8   6 
    29 3 

generateで生成された問題は、一定の形式になっています。これは数字だけが違うような同種の問題を区別できるようにするためです。実際にナンプレの問題として使用する場合には、convertを使って下さい。

$ ./convert " 1 23     2   4    56 7      4 5   2 37   51 1   4 3        84    8   6     29 3 "
"    3 75    2   6     86 9   8 2   9 95   38 6   5 2   8 46     7   1    21      "

この出力を9文字ごとに区切ったものが実際に使用できるナンプレの問題になります。

    3 75 
   2   6 
    86 9 
  8 2   9
 95   38 
6   5 2  
 8 46    
 7   1   
 21      

generateの出力の前半は解法についての情報を示しています。generate -vとすると、詳細な情報を表示します。 ここでは前半の情報が縦に表示されています。(なお、-s は以前に生成したのと同じ問題を生成する場合に使用します)

./generate -v -s 4661
generate start seed = 4661 number = 1
number = 0
kill_single:92
kill_hidden:14
kill_locked:5
kill_tuple :2
swordfish  :0
naked_tuple[2] = 0
naked_tuple[3] = 0
naked_tuple[4] = 0
naked_tuple[5] = 0
naked_tuple[6] = 0
hidden_tuple[2] = 2
hidden_tuple[3] = 0
hidden_tuple[4] = 0
hidden_tuple[5] = 0
hidden_tuple[6] = 0
fish[2] = 0
fish[3] = 0
fish[4] = 0
fish[5] = 0
fish[6] = 0
fish[7] = 0
fish[8] = 0
xywing     :0
fx_count   :25
solved     :1
...

出力された情報を詳しく見てみましょう。

  • kill_single は単純に数字が入っていたら、縦横ブロックからその数字を消すという方法が使われた回数を示しています。
  • kill_hidden は一行にその数字の入っているマスがひとつしかない時にその数字に確定するという方法が使われた回数を示しています。
  • kill_lockedはLocked Candidatesという方法が使われた回数を示しています。
  • kill_tupleはNaked PairやHidden Pairなどという系統の方法が使われた回数を示してます。これは、その後もう少し詳しい情報が表示されています。この場合はhidden_tuple[2]という部分がそれで、角括弧の中の数字がpairやtripleなどに対応しています。
  • sword_fishはX Wing や Sword Fishという系統の方法が使われた回数を示しています。これもその後もう少し詳しい情報が表示されています。fish[2] にはX Wing の使用された回数、fish[3]にはSword Fishの使用された回数が表示されます。

大量に問題を生成する、または難しい問題を生成する。

大量に問題を生成するには-c 生成したい問題数というオプションをつけてgenerateを起動して下さい。それなりに時間がかかりますので、まずは10個生成する時間を計って検討を付けて下さい。

time ./generate -c 10 > /dev/null
./generate -c 10 > /dev/null  15.18s user 0.00s system 99% cpu 15.185 total

この場合、10個生成するのに 約15秒かかっています。生成時間には多少の差があるので正確ではありませんが、1000個生成するには15000秒、約4時間かかるという予測が成り立ちます。難しい問題を生成したいときは、大量に生成してその中から難しい問題を選んで下さい。