XMLRead

ナンプレ自動生成プログラム Version 2.0

XMLファイル入力例

ナンプレV2のアプリケーションで作ったXMLファイルを読み込んで、 同じヒント、作成条件で解きなおしてみよう。

ファイル名は、引数で与えることにし、 ナンプレV2で作ったファイルも簡単にテストデータファイルとして使えるようにしました。

プログラムを以下に示します。

読み込む部分が長くなったので、readFile()というメソッドの中にまとめました。

処理の概要は以下の通りです。

  1. 問題を読み込んで、一度そのまま解いて難易度ポイントを計算し、問題を表示します。
  2. 同じデータをそのまま利用して、自動生成を行って、難易度ポイントと問題を表示します。

プログラムが長めになっているのは、バージョン2は様々な機能を取り込んだためです。 使う機能を限定すれば、ずっと短く書くことができます。

XMLRead.java

2007-12-03 プログラムを修正:NumberPlaceFileからBlockConstraintを直接作るメソッドを Utilityに追加。

package jp.gr.puzzle.npv2.sample;

import java.io.File;
import jp.gr.puzzle.npv2.core.*;

public class XMLRead {
        static int numSize;
        static int[] hint;
        static int[] hidden;
        static int[] answer;
        static int[] question;
        static int   point;
        
        static SolverMethod method = new SolverMethod();
        static BlockConstraint block;
        
        static void readFile(String filename) {
                File file = new File(filename);
                NumberPlaceFile npFile = new NumberPlaceFile();
                try {
                        npFile.Load(file);
                } catch (Exception e) {
                        e.printStackTrace();
                        return;
                }
                numSize = npFile.getNumSize();
                hint = Utility.boolean2int(npFile.getHint());
                hidden = npFile.getHidden();
                question = npFile.getProblem();
                block = Utility.makeBlockConstraint(npFile);

                int point = (int) Evaluator.evaluate(numSize, block, question);
                System.out.println("old point " + point);
                Utility.printGrid(question, numSize);
        }
        
        public static void main(String[] args) {
                System.out.println("XMLRead  remake a question.");
                if (args.length == 0)
                        return;
                readFile(args[0]);
        
                Generator generator = new Generator( numSize, hint, hidden, block );
                generator.setMethod(method);
                
                while( (question = generator.generate()) == null )
                        ;
                Status state = new Status( numSize, block );
                Solver.addNumbers(state, question);
                point = (int)Evaluator.evaluate( numSize, block, question);
                
                System.out.println( "new point "+point );
                Utility.printGrid( question, numSize );
        }
}

検証1

では、以下の問題をNPV2のアプリケーションでファイルにセーブし、それを読み込んで実行してみました。

XMLRead  remake a question.
old point 2458
 0 0 0 0 0 0 0 0 0
 0 0 3 4 0 1 2 0 0
 0 7 0 0 9 0 0 1 0
 0 1 0 0 3 0 0 6 0
 0 0 4 7 0 2 3 0 0
 0 6 0 0 5 0 0 7 0
 0 5 0 0 7 0 0 3 0
 0 0 9 5 0 3 8 0 0
 0 0 0 0 0 0 0 0 0
new point 5125
 0 0 0 0 0 0 0 0 0
 0 0 2 9 0 4 6 0 0
 0 8 0 0 1 0 0 5 0
 0 7 0 0 8 0 0 3 0
 0 0 8 4 0 3 9 0 0
 0 6 0 0 5 0 0 8 0
 0 1 0 0 3 0 0 9 0
 0 0 9 7 0 8 3 0 0
 0 0 0 0 0 0 0 0 0

難易度の異なる違う問題ができたことが分かるでしょう。


検証2

次は、違うサイズのジグソーナンプレを試してみました。

プログラムの変更は一切必要ありません。 この問題のファイル名を引数に指定するだけで、別の問題ファイルで試すことができます。

XMLRead  remake a question.
old point 1535
 0 0 3 0 1 0 0
 0 4 0 0 0 7 0
 1 0 0 0 0 0 2
 0 0 0 0 0 0 0
 7 0 0 0 0 0 3
 0 3 0 0 0 1 0
 0 0 1 0 6 0 0
new point 2104
 0 0 5 0 7 0 0
 0 1 0 0 0 6 0
 5 0 0 0 0 0 3
 0 0 0 0 0 0 0
 3 0 0 0 0 0 7
 0 2 0 0 0 5 0
 0 0 7 0 4 0 0

今度も、同様に新しい問題を作ることができました。


もっと大きな問題とか、対角線も指定されたナンプレとかももちろん動きますが、 検証をいちいち載せるのは省略します。

Copyright(C) 2007 Time Intermedia Corporation. All Rights Reserved.

株式会社タイムインターメディア | 自動生成エンジンとは | お問い合わせ | About Us