Avatar billede maagefinke Nybegynder
27. november 2005 - 10:30 Der er 49 kommentarer og
2 løsninger

Kode der kan generere sudokuer

Jeg har en kode, som kan løse sudokuer. Jeg kunne også tænke mig en, der kan lave dem.
Er der en der har en sådan kode?
Avatar billede simonvalter Praktikant
27. november 2005 - 10:52 #1
her er et projekt hvor de kan både lave og løse
http://sudoku.sourceforge.net/
Avatar billede maagefinke Nybegynder
27. november 2005 - 21:41 #2
>simonvalter Tak for henvisningen, men desværre kan jeg ikke komme til at downloade det siden tilbyder. DEr må være noget galt på stedet.
Avatar billede mikkelbm Nybegynder
27. november 2005 - 23:05 #3
Nu har de så også valgt at opbygge deres side meget underligt, i forhold til hvad andre gør på sourceforge, men nedenstående link burde virke:

http://sourceforge.net/project/showfiles.php?group_id=124624&package_id=136260
Avatar billede maagefinke Nybegynder
28. november 2005 - 11:31 #4
>mikkelbm Tak for linket, men jeg kan ikke få øje på nogen kode, der kan generere sudokuopgaver. Og det er jo, hvad jeg søger. Jeg troede, at der var koder til den form de viser andet steds på deres side.
Avatar billede mikkelbm Nybegynder
28. november 2005 - 11:43 #5
På deres side har de dokumentation for en "Composer" og i kildekoden du kan hente, har de en klasse der hedder Composer - mon ikke det har noget med hinanden at gøre :) ?
Avatar billede mikkelbm Nybegynder
28. november 2005 - 11:46 #6
http://sudoku.sourceforge.net/Composer.htm

Der kan du læse hvordan du bruger klassen.
Avatar billede thums Praktikant
28. november 2005 - 13:22 #7
Du kunne ogsaa bare lave en algoritme der laver sudokuer.... kunne vaere noget med at placere alle 1'ere.. saa alle 2'ere osv... saa laenge de ikke kommer i konflikt hvor du saetter dem burde det gaa op... derefter kan du stille og roligt lave en omvendt algoritme af den der loeser dine sudoku'er.. not so hard.. :)
Avatar billede mikkelbm Nybegynder
28. november 2005 - 13:43 #8
>> thums

Så kom du lige med en algoritme der kan det. Der er jo også forskellige sværhedsgrader af soduko'er.
Avatar billede maagefinke Nybegynder
28. november 2005 - 15:26 #9
>mikkelbm Tak igen. Men så vidt jeg kan se, er der tale om en beskrivelse af de komponenter, der skal indgå i en sådan kode. Derimod ser jeg ikke skyggen af en samlet kode? Måske er jeg bare blevet blind i stedet for svagtseende? :o))
Avatar billede maagefinke Nybegynder
28. november 2005 - 15:27 #10
>mikkelbm Men hvis du lige sender koden her til siden og opretter et svar, giver jeg dig straks de 200 points. ;o)
Avatar billede mikkelbm Nybegynder
28. november 2005 - 15:35 #11
Jeg kan godt sende dig klassen Composer, men den har flere afhængigheder.

http://prdownloads.sourceforge.net/sudoku/sudoku_source_R1_22_beta.zip?download

Inde i den zip fil ligger al koden til deres løsning.

Og ja, det der står på deres hjemmeside forklarer hvordan du bruger deres kode.
Avatar billede mikkelbm Nybegynder
28. november 2005 - 15:35 #12
Og koden fylder en del - men sig til hvis den skal postes her.

Og det var Simon der fandt linket, så vi kan vel dele?
Avatar billede maagefinke Nybegynder
28. november 2005 - 17:06 #13
>mikkelbm Du må gerne poste det her, så andre også kan have glæde af det.
Hvis det fungerer - hvis jeg kan få det til at fungere :o) - forhøjer jeg bare, så I begge får 200. Men så skal I jo også "svare" begge to!
Foreløbig tak!
Avatar billede mikkelbm Nybegynder
28. november 2005 - 17:32 #14
Her kommer Composer-klassen så:

Afhængighederne:
- MaskFactory
- Solver
- IStrategy
- Grid

Kan findes i sourcekoden i zip-filen.

/*
* Su Doku Solver
*
* Copyright (C) act365.com January 2004
*
* Web site: http://act365.com/sudoku
* E-mail: developers@act365.com
*
* The Su Doku Solver solves Su Doku problems - see http://www.sudoku.com.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.

* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

package com.act365.sudoku;

import com.act365.sudoku.masks.*;

import java.io.* ;
import java.text.* ;
import java.util.* ;

/**
* A Composer object attempts to compose valid Su Doku puzzles with the
* MostCandidates strategy. It runs as a thread because composition is
* a lengthy process that the caller might well choose to terminate.
*/

public class Composer extends Thread {

    Vector puzzles ;
   
    GridContainer gridContainer ;

    int maxSolns ,
        maxMasks ,
        maxUnwinds ,
        maxComplexity ,
        nSolvers ,
        composeSolverThreshold ,
        lockedSectorCandidatesFilter ,
        disjointSubsetsFilter ,
        twoSectorDisjointSubsetsFilter ,
        singleValuedChainsFilter ,
        manyValuedChainsFilter ,
        nishioFilter ,
        guessFilter ;
   
    boolean logicalFilter ,
            shuffleGrid ,
            shuffleMask ,
            xmlFormat ;
   
    MaskFactory maskFactory ;

    Solver[] solvers ;
       
    IStrategy[] composeSolvers ;

    boolean[][][] solverMasks ;
   
    Grid[] solverGrids ;
   
    PrintWriter output ;
     
    final static String[] featuredGrades = { "Easy" ,
                                            "Medium" ,
                                            "Hard" ,
                                            "Two-Sector Disjoint Subsets" ,
                                            "Single-Valued Strings" ,
                                            "Many-Valued Strings" ,
                                            "Nishio" ,
                                            "Guess" };
   
    final static int EASY                        = 0 ,
                    MEDIUM                      = 1 ,
                    HARD                        = 2 ,
                    TWO_SECTOR_DISJOINT_SUBSETS = 3 ,
                    SINGLE_VALUED_CHAINS        = 4 ,
                    MANY_VALUED_CHAINS          = 5 ,
                    NISHIO                      = 6 ,
                    GUESS                      = 7 ;
                           
    transient int cellsInRow ,
                  maskSize ,
                  nSolns ,
                  nMasks ,
                  nThreads ,
                  nUnstartable ,
                  maxPuzzleComplexity ,
                  mostComplex ,
                  tempSolutions ;
   
    transient boolean allSolutionsFound ;
   
    transient boolean[] isAlive ,
                        isStartable;
   
    transient LeastCandidatesHybrid lch ;
   
    transient long startTime ;
   
   
    /**
    * Generates a new thread that will attempt to construct a Su Doku
    * puzzle with 'maskSize' cells on initial display. The puzzle will
    * be copied into 'grid'. When 'randomize' is selected, the mask
    * will be selected randomly and the RadomMostCandidates strategy
    * will be used to complete it.
    * @param gridContainer object to be notified when a puzzle has been composed
    * @param boxesAcross
    * @param maxSolns maximum number of solutions to find (0 for no limit)
    * @param maxMasks maximum number of masks to use (0 for no limit)
    * @param maxUnwinds maximum permitted number of unwinds (0 for no limit)
    * @param maxComplexity maximum permitted complexity (0 for no limit)
    * @param maskFactory factory to generate the masks
    * @param nSolvers number of solver threads to run
    * @param composeSolverThreshold tree depth beyond which the compose solver will be invoked
    * @param output optional output stream (set to null for no output)
    */   
   
    public Composer( GridContainer gridContainer ,
                    int boxesAcross ,
                    int maxSolns ,
                    int maxMasks ,
                    int maxUnwinds ,
                    int maxComplexity ,
                    MaskFactory maskFactory ,
                    int nSolvers ,
                    int composeSolverThreshold ,
                    PrintStream output ,
                    boolean leastCandidatesHybridFilter ,
                    int lockedSectorCandidatesFilter ,
                    int disjointSubsetsFilter ,
                    int twoSectorDisjointSubsetsFilter ,
                    int singleValuedStringsFilter ,
                    int manyValuedStringsFilter ,
                    int nishioFilter ,
                    int guessFilter ,
                    boolean explain ,
                    boolean shuffleGrid ,
                    boolean shuffleMask ,
                    boolean xmlFormat ) throws Exception {
        this.gridContainer = gridContainer ;                     
        this.maxSolns = maxSolns ;
        this.maxMasks = maxMasks ;
        this.maxUnwinds = maxUnwinds ;
        this.maxComplexity = maxComplexity ;
        this.maskFactory = maskFactory ;
        this.nSolvers = nSolvers ;
        this.composeSolverThreshold = composeSolverThreshold ;
        this.output = output != null ? new PrintWriter( output ) : null ;
        this.lockedSectorCandidatesFilter = lockedSectorCandidatesFilter ;
        this.disjointSubsetsFilter = disjointSubsetsFilter ;
        this.twoSectorDisjointSubsetsFilter = twoSectorDisjointSubsetsFilter ;
        this.singleValuedChainsFilter = singleValuedStringsFilter ;
        this.manyValuedChainsFilter = manyValuedStringsFilter ;
        this.nishioFilter = nishioFilter ;
        this.guessFilter = guessFilter ;
        this.shuffleGrid = shuffleGrid ;
        this.shuffleMask = shuffleMask ;
        this.xmlFormat = xmlFormat ;
       
        maskSize = maskFactory.getFilledCells();
        cellsInRow = maskFactory.getCellsInRow();
        solvers = new Solver[nSolvers];
        composeSolvers = new LeastCandidatesHybrid[nSolvers];
        isAlive = new boolean[nSolvers];
        isStartable = new boolean[nSolvers];
        solverMasks = new boolean[nSolvers][cellsInRow][cellsInRow];
        solverGrids = new Grid[nSolvers];
        puzzles = new Vector();
        lch = new LeastCandidatesHybrid( false , true , false , true , explain );
        logicalFilter = guessFilter == -1 ||
                        guessFilter == 0 &&
                        ( lockedSectorCandidatesFilter != 0 ||
                          disjointSubsetsFilter != 0 ||
                          singleValuedStringsFilter != 0 ||
                          twoSectorDisjointSubsetsFilter != 0 ||
                          manyValuedStringsFilter != 0 ||
                          nishioFilter != 0 );
           
        int i = 0 ;
        while( i < nSolvers ){
            composeSolvers[i] = new LeastCandidatesHybrid( false , leastCandidatesHybridFilter , false , false , false );
            solverGrids[i] = new Grid( boxesAcross , cellsInRow / boxesAcross );
            ++ i ;
        }
       
        startTime = new Date().getTime();
       
        if( xmlFormat && this.output != null ){
            this.output.print( SuDokuUtils.libraryBookHeader( getClass().getName() , cellsInRow , boxesAcross , featuredGrades ) );
        }
    }
   
    /**
    * Called by a Solver object in order to indicate that a
    * solution has been found.
    * @see Solver
    * @param solverIndex index of the reporting solver
    */
   
    public synchronized void addSolution( int solverIndex ){

        boolean lockedSectorCandidates = false ,
                disjointSubsets = false ,
                twoSectorDisjointSubsets = false ,
                singleValuedChains = false ,
                manyValuedChains = false ,
                nishio = false ,
                logical ;

        int puzzleComplexity ,
            puzzleUnwinds ,
            category = GUESS ;

        // We might already have enough puzzles from the other threads.
        if( maxSolns > 0 && nSolns >= maxSolns ){
            return ;
        }
        // The grid might have been completed by the composeSolver,
        // in which case only certain cells should be read from the
        // solver grid.
        int r , c ;
        Grid solution = new Grid( solverGrids[solverIndex].boxesAcross , solverGrids[solverIndex].boxesDown );
        solverGrids[solverIndex].solve( lch , 1 );
        r = 0 ;
        while( r < cellsInRow ){
            c = 0 ;
            while( c < cellsInRow ){
                if( solverMasks[solverIndex][r][c] ){
                    solution.data[r][c] = solverGrids[solverIndex].data[r][c] ;
                } else {
                    solution.data[r][c] = 0 ;
                }
                ++ c ;
            }
            ++ r ;
        }           
        lch.reset();
        // Ensure that the puzzle appears in the correct form.
        Grid puzzle = (Grid) solution.clone();
        if( shuffleGrid ){
            puzzle.shuffle( true , false , false );
        } else {
            puzzle.rectify( solverMasks[solverIndex] );
        }
        // Store (and report) the puzzle if it hasn't been seen before.
        if( ! puzzles.contains( puzzle ) ){
            // Categorize the puzzle and filter it out if necessary.
            puzzle.solve( lch , 2 );
            puzzleComplexity = puzzle.complexity ;
            puzzleUnwinds = puzzle.nUnwinds ;
            lch.reset();
            if( puzzleComplexity > maxComplexity ){
                mostComplex = nSolns ;
                maxPuzzleComplexity = puzzleComplexity ;               
            }
            logical = puzzleUnwinds == 1 ;
            if( logicalFilter && ! logical || guessFilter == 1 && logical ){
                return ;
            }         
            puzzle.solve( lch , 1 ); 
            if( logical ){
                lockedSectorCandidates = lch.lockedSectorCandidatesEliminations > 0 ;
                if( lockedSectorCandidatesFilter == 1 && ! lockedSectorCandidates ||
                    lockedSectorCandidatesFilter == -1 && lockedSectorCandidates ){
                    return ;
                }
                disjointSubsets = lch.disjointSubsetsEliminations > 0 ;
                if( disjointSubsetsFilter == 1 && ! disjointSubsets ||
                    disjointSubsetsFilter == -1 && disjointSubsets ){
                    return ;
                }
                twoSectorDisjointSubsets = lch.twoSectorDisjointSubsetsEliminations > 0 ;
                if( twoSectorDisjointSubsetsFilter == 1 && ! twoSectorDisjointSubsets ||
                    twoSectorDisjointSubsetsFilter == -1 && twoSectorDisjointSubsets ){
                    return ;
                }
                singleValuedChains = lch.singleValuedChainsEliminations > 0 ;
                if( singleValuedChainsFilter == 1 && ! singleValuedChains ||
                    singleValuedChainsFilter == -1 && singleValuedChains ){
                    return ;
                }
                manyValuedChains = lch.manyValuedChainsEliminations > 0 ;
                if( manyValuedChainsFilter == 1 && ! manyValuedChains||
                    manyValuedChainsFilter == -1 && manyValuedChains ){
                    return ;
                }
                nishio = lch.nishioEliminations > 0 ;
                if( nishioFilter == 1 && ! nishio ||
                    nishioFilter == -1 && nishio ){
                    return ;
                }
            }
            if( output != null ){
                if( ! xmlFormat ){
                    double t = ( new Date().getTime() - startTime )/ 1000. ;
                    output.println( "Puzzle " + ( 1 + nSolns ) +":\n");
                    output.println( "Puzzle Complexity = " + puzzleComplexity );
                    output.println( "Puzzle Unwinds = " + puzzleUnwinds );
                    output.println( "Cumulative Composer Complexity = " + solvers[solverIndex].complexity );
                    output.println( "Cumulative Composer Unwinds = " + solvers[solverIndex].nUnwinds );
                    output.println( "Time = " + new DecimalFormat("#0.000").format( t ) + "s" );
                }
                boolean multipleCategories = false ;
                StringBuilder sb = ! xmlFormat ? new StringBuilder() : null ;
                if( logical ){
                    category = EASY ;
                    if( lockedSectorCandidates ){
                        category = MEDIUM ;
                        if( ! xmlFormat ){
                            if( multipleCategories ){
                                sb.append(":");
                            }
                            sb.append("Locked Sector Candidates");
                            multipleCategories = true ;
                        }
                    }
                    if( disjointSubsets ){
                        category = HARD ;
                        if( ! xmlFormat ){
                            if( multipleCategories ){
                                sb.append(":");
                            }
                            sb.append("Disjoint Subsets");
                            multipleCategories = true ;
                        }
                    }
                    if( twoSectorDisjointSubsets ){
                        category = TWO_SECTOR_DISJOINT_SUBSETS ;
                        if( ! xmlFormat ){
                            if( multipleCategories ){
                                sb.append(":");
                            }
                            sb.append("Two-Sector Disjoint Subsets");
                            multipleCategories = true ;
                        }
                    }
                    if( singleValuedChains ){
                        category = SINGLE_VALUED_CHAINS ;
                        if( ! xmlFormat ){
                            if( multipleCategories ){
                                sb.append(":");
                            }
                            sb.append("Single-Valued Chains");
                            multipleCategories = true ;
                        }
                    }
                    if( manyValuedChains ){
                        category = MANY_VALUED_CHAINS ;
                        if( ! xmlFormat ){
                            if( multipleCategories ){
                                sb.append(":");
                            }
                            sb.append("Many-Valued Chains");
                            multipleCategories = true ;
                        }
                    }
                    if( nishio ){
                        category = NISHIO ;
                        if( ! xmlFormat ){
                            if( multipleCategories ){
                                sb.append(":");
                            }
                            sb.append("Nishio");
                            multipleCategories = true ;
                        }
                    }
                    sb.append("\n");
                }
                if( lch.explainsReasoning() ){
                    int i = 0 ;
                    while( i < lch.getThreadLength() ){
                        sb.append( ( 1 + i ) + ". " + lch.getReason( i ) );
                        ++ i ;
                    }
                }
                if( sb != null && sb.length() > 0 ){
                    output.println( sb.toString() );
                }
            }
            lch.reset();
            puzzles.addElement( puzzle );
            if( output != null ){
                if( xmlFormat ){
                    output.println( puzzle.toXML( 1 + nSolns , featuredGrades[category] ) );
                } else {
                    output.println( puzzle.toString() );
                }
                output.flush();
            }
            if( ++ nSolns == maxSolns ){
                allSolutionsFound = true ;
                notifyAll();
            }
        }
    }
   
    /**
    * Called by a Solver object in order to indicate that all
    * possible solutions to the puzzle have been considered.
    * @see Solver
    * @param solverIndex index of finished solver
    */
   
    public synchronized void solverFinished( int solverIndex ){
        isAlive[solverIndex] = false ;
        -- nThreads ;
        notifyAll();   
    }

    /**
    * Starts a new Solver thread to find puzzles for
    * a fixed initial mask.
    * @see Solver
    * @param solverIndex index of solver to restart with a new mask
    */
   
    synchronized boolean startThread( int solverIndex ){
        boolean[][] mask = null ;
        if( shuffleMask ){
            maskFactory.shuffle();
        }
        try {
            mask = (boolean[][]) maskFactory.nextElement();
        } catch ( NoSuchElementException e ) {
            return false ;
        }
        ++ nMasks ;
        int r , c ;
        r = 0 ;
        while( r < cellsInRow ){
            c = 0 ;
            while( c < cellsInRow ){
                solverMasks[solverIndex][r][c] = mask[r][c];
                ++ c ;
            }
            ++ r ;
        }
        solverGrids[solverIndex].reset();
        solvers[solverIndex] = new Solver( "Solver-" + ( solverIndex + 1 ) ,
                                          this ,
                                          solverIndex ,
                                          solverGrids[solverIndex] ,
                                          new MostCandidates( solverMasks[solverIndex] , true ) ,
                                          composeSolvers[solverIndex] ,
                                          composeSolverThreshold ,
                                          maxSolns ,
                                          maxUnwinds ,
                                          maxComplexity ,
                                          null );
        solvers[solverIndex].start();
        while( ! solvers[solverIndex].isAlive() );
        isAlive[solverIndex] = true ;
        ++ nThreads ;
        return true ;
    }
   
    /**
    * Starts a Composer thread. The thread will start a number of Solvers
    * and collate the returned results.
    * @see Solver
    */
   
    @Override public void run(){
        nSolns = 0 ;
        nMasks = 0 ;
        allSolutionsFound = false ;
        nThreads = 0 ;
        nUnstartable = 0 ;
        // Set off the solver threads, one per mask.
        int i = 0 ;
        while( i < nSolvers && ( maxMasks == 0 || nMasks < maxMasks ) ){
            isAlive[i] = false ;
            if( !( isStartable[i] = startThread( i ) ) ){
                ++ nUnstartable ;
            }
            ++ i ;
        }
        // Wait for the reports back.
        synchronized( this ){
            while( ! allSolutionsFound && nThreads > 0 && ( maxMasks == 0 || nMasks <= maxMasks ) ){
                try {
                    while( ! allSolutionsFound &&
                          nThreads + nUnstartable == nSolvers &&
                          ( maxMasks == 0 || nMasks <= maxMasks ) ){
                        wait();
                    }               
                } catch ( InterruptedException e ) {
                    break ;
                }
                i = 0 ;
                while( i < nSolvers ){
                    if( ! isAlive[i] && isStartable[i] ){
                        if( !( isStartable[i] = startThread( i ) ) ){
                            ++ nUnstartable ;                       
                        }
                    }
                    ++ i ;
                }
            }
            // Interrupt the remaining threads.
            i = 0 ;
            while( i < nSolvers ){
                if( isAlive[i] ){
                    solvers[i].interrupt();
                    while( isAlive[i] ){
                        try {
                            wait();
                        } catch ( InterruptedException ie ) {
                            continue ;
                        }
                    }
                }
                ++ i ;
            }
            if( gridContainer != null ){
                if( puzzles.size() > 0 ){
                    gridContainer.setGrid( (Grid) puzzles.elementAt( 0 ) );
                }
            } else {
                if( xmlFormat && output != null ){
                    output.println( SuDokuUtils.libraryBookFooter() );
                    output.close();
                } else {
                    System.out.println( nSolns + " solutions found");
                    if( nSolns > 0 ){
                        System.out.println("Most complex: (" + maxPuzzleComplexity + ")");
                        System.out.println( ((Grid) puzzles.elementAt( mostComplex ) ).toString() );
                    }
                }
            }
        }
    }           
   
    /**
    * Command-line app to compose Su Doku puzzles.
    * <br><code>Composer [-a across] [-d down] [-ms max solns|-mm max masks] [-mu max unwinds] [-s solvers] [-c threshold] [-r] [-v] -i|#cells</code>
    * <br><code>[-a across] [-d down]</code> define the dimensions of the puzzles to be composed. The default values are
    * three in each dimension.
    * <br><code>[-ms max solns|-mm max masks]</code> defines optional termination conditions. The app will exit if <code>max solns</code>
    * puzzles have been generated or <code>max masks</code> masks have been considered, whichever occurs sooner.
    * <br><code>[-mu max unwinds]</code> stipulates a limit on the number of unwinds permitted on a single mask.
    * <br><code>[-mu max unwinds]</code> stipulates a limit on the complexity permitted on a single mask.
    * <br><code>[-s solvers]</code> stipulates the number of solver (or, equivalently, threads) to execute simultaneously. The default is 3.
    * <br><code>[-c threshold]</code> stipulates the tree depth beyond which the compose solver will be invoked. The default value is 0.
    * <br><code>[-v]</code> stipualtes whether the Composer should run in verbose mode. The default is no.
    * <br><code>[-f]</code> stipulates that the full set of Least Candidates Hybrid algorithms should be used to solve.
    * <br><code>[-shuffle]</code> stipulates that the puzzles should be randomly shuffled.
    * <br><code>[-xml]</code> stipulates that the output should be in XML format.
    * <br><code>-i</code> stipulates that the initial mask should be read from standard input.
    * <br><code>#cells</code> stipulates the number of initially-filled cells to appear in the puzzles. 
    */

    public static void main( String[] args ){
        final String usage = "Usage: Composer [-a across] [-d down] [-ms max solns|-mm max masks] [-mu max unwinds] [-mc max complexity] [-s solvers] [-c threshold] [-v] [-shuffle] [-iter] [-f] [-xml] -i|#cells" ,
                    strategyTypes = "Valid strategy types are:\nSSC [Single Sector Candidates]\nDS [Disjoint Subsets]\nSVS [Single-Valued Strings]\nMVS [Many-Valued Strings]\nNishio";
       
        int boxesAcross = 3 ,
            boxesDown = 3 ,
            maxSolns = 0 ,
            maxMasks = 0 ,
            maxUnwinds = 0 ,
            maxComplexity = Integer.MAX_VALUE ,
            nSolvers = defaultThreads ,
            filledCells = 0 ,
            maskType = MaskUtils.ROTATE_2 ,
            composeSolverThreshold = 0 ,
            lockedSectorCandidatesFilter = 0 ,
            disjointSubsetsFilter = 0 ,
            singleValuedChainsFilter = 0 ,
            twoSectorDisjointSubsetsFilter = 0 ,
            manyValuedChainsFilter = 0 ,
            nishioFilter = 0 ,
            guessFilter = 0 ,
            sign ;
           
        boolean explain = false ,
                standardInput = false ,
                leastCandidatesHybridFilter = false ,
                shuffleGrid = false ,
                shuffleMask = true ,
                xmlFormat = false ;
       
        // Process command-line args.
        if( args.length == 0 ){
            System.err.println( usage );
            System.exit( 1 );
        }         
        int i = 0 ;
        while( i < args.length - 1 ){
            sign = 0 ;
            if( args[i].equals("-a") ){
                try {
                    boxesAcross = Integer.parseInt( args[++i] );
                } catch ( NumberFormatException e ) {
                    System.err.println( usage );
                    System.exit( 1 );
                }
            } else if( args[i].equals("-d") ){
                try {
                    boxesDown = Integer.parseInt( args[++i] );
                } catch ( NumberFormatException e ) {
                    System.err.println( usage );
                    System.exit( 1 );
                }
            } else if( args[i].equals("-ms") ){
                try {
                    maxSolns = Integer.parseInt( args[++i] );
                } catch ( NumberFormatException e ) {
                    System.err.println( usage );
                    System.exit( 1 );
                }
            } else if( args[i].equals("-mm") ){
                try {
                    maxMasks = Integer.parseInt( args[++i] );
                } catch ( NumberFormatException e ) {
                    System.err.println( usage );
                    System.exit( 1 );
                }
            } else if( args[i].equals("-mu") ){
                try {
                    maxUnwinds = Integer.parseInt( args[++i] );
                } catch ( NumberFormatException e ) {
                    System.err.println( usage );
                    System.exit( 1 );
                }
            } else if( args[i].equals("-mc") ){
                try {
                    maxComplexity = Integer.parseInt( args[++i] );
                } catch ( NumberFormatException e ) {
                    System.err.println( usage );
                    System.exit( 1 );
                }
            } else if( args[i].equals("-s") ){
                try {
                    nSolvers = Integer.parseInt( args[++i] );
                } catch ( NumberFormatException e ) {
                    System.err.println( usage );
                    System.exit( 1 );
                }
            } else if( args[i].equals("-c") ){
                try {
                    composeSolverThreshold = Integer.parseInt( args[++i] );
                } catch ( NumberFormatException e ) {
                    System.err.println( usage );
                    System.exit( 1 );
                }
            } else if( args[i].equals("-mask") ) {
                try {
                    maskType = MaskUtils.getMaskType( args[++i] );
                } catch( Exception e ) {
                    System.err.println( e.getMessage() );
                    System.exit( 1 );
                }
            } else if( args[i].equals("-v") ){
                explain = true ;
            } else if( args[i].equals("-f") ){
                leastCandidatesHybridFilter = true ;
            } else if( args[i].equals("-shuffle") ){
                shuffleGrid = true ;
            } else if( args[i].equals("-iter") ){
                shuffleMask = false ;
            } else if( args[i].equals("-xml") ) {
                xmlFormat = true ;
            } else if( args[i].charAt( 0 ) == '+' ) {
                sign = 1 ;
            } else if( args[i].charAt( 0 ) == '-' ) {
                sign = -1 ;
            } else {
                System.err.println( usage );
                System.exit( 1 );               
            }
            if( sign != 0 ){
                String strategy = args[i].substring( 1 );
                if( strategy.equalsIgnoreCase("lsc") ){
                    lockedSectorCandidatesFilter = sign ;
                } else if( strategy.equalsIgnoreCase("ds") ) {
                    disjointSubsetsFilter = sign ;
                } else if( strategy.equalsIgnoreCase("2ds") ) {
                    twoSectorDisjointSubsetsFilter = sign ;
                } else if( strategy.equalsIgnoreCase("svc") ) {
                    singleValuedChainsFilter = sign ;
                } else if( strategy.equalsIgnoreCase("mvc") ){
                    manyValuedChainsFilter = sign ;
                } else if( strategy.equalsIgnoreCase("nishio") ){
                    nishioFilter = sign ;
                } else if( strategy.equalsIgnoreCase("guess") ){
                    guessFilter = sign ;
                } else {
                    System.err.println( strategyTypes );
                    System.exit( 1 );
                }
            }
            ++ i ;
        }
        if( i == args.length ){
            System.err.println( usage );
            System.exit( 1 );
        }
        if( maxMasks > 0 && maxSolns > 0 ){
            System.err.println("The -ms and -mm options are mutually exclusive");
            System.exit( 1 );
        }
        try {
            filledCells = Integer.parseInt( args[i] );
        } catch ( NumberFormatException e ) {
            if( args[i].equals("-i") ){
                standardInput = true ;
            } else {
                System.err.println( usage );
                System.exit( 1 );
            }
        }
        // Read a mask from standard input.
        MaskFactory maskFactory = null ;
       
        try {
            if( standardInput ){
                String text ;
                StringBuilder maskText = new StringBuilder();
                BufferedReader standardInputReader = new BufferedReader( new InputStreamReader( System.in ) );
                try {
                    while( ( text = standardInputReader.readLine() ) != null ){
                        if( text.length() == 0 ){
                            break ;
                        }
                        maskText.append( text );
                        maskText.append('\n');
                    }
                } catch ( IOException e ) {
                    System.err.println( e.getMessage() );
                    System.exit( 3 );             
                }
                boolean[][] mask = new boolean[boxesAcross*boxesDown][boxesAcross*boxesDown];
                MaskFactory.populate( mask , maskText.toString() );
                maskFactory = new UserDefined( mask );                               
            } else {
                maskFactory = MaskUtils.createMaskFactory( maskType , boxesAcross * boxesDown , boxesAcross , null );
            }
            filledCells = maskFactory.setFilledCells( filledCells );
            maskFactory.shuffle();
        } catch ( Exception e ) {
            System.err.println( e.getMessage() );
            System.exit( 2 );
        }
        // Create the puzzles.
        try {
            new Composer( null ,
                          boxesAcross ,
                          maxSolns ,
                          maxMasks ,
                          maxUnwinds ,
                          maxComplexity ,
                          maskFactory ,
                          nSolvers ,
                          composeSolverThreshold ,
                          System.out ,
                          leastCandidatesHybridFilter ,
                          lockedSectorCandidatesFilter ,
                          disjointSubsetsFilter ,
                          twoSectorDisjointSubsetsFilter ,
                          singleValuedChainsFilter ,
                          manyValuedChainsFilter ,
                          nishioFilter ,
                          guessFilter ,
                          explain ,
                          shuffleGrid ,
                          shuffleMask ,
                          xmlFormat ).start(); 
        } catch ( Exception e ) {
            System.out.println( e.getMessage() );
            System.exit( 3 );
        }
    }
   
    public final static int defaultThreads = 3 ;
}
Avatar billede simonvalter Praktikant
28. november 2005 - 19:51 #15
ok svar ;O)
Avatar billede maagefinke Nybegynder
28. november 2005 - 20:36 #16
>simonvalter Det var overvældende. Har du selv afprøvet koden?
Jeg vender tilbage, når jeg har set lidt nærmere på koden. Foreløbig tak.
Avatar billede maagefinke Nybegynder
28. november 2005 - 21:19 #17
Indledningsvis undskyld til jer begge! Som I måske har fattet, har jeg ikke en klap forstand på java. Jeg har kigget på koden, lige som jeg har downloaded zipen og åbnet den. Jeg har nu en masse java-filer, men hvordan får jeg et samlet program ud af disse, så jeg kan køre programmet? Skal javafilerne oversættes til html-koder eller hvad?
PS Jeg har forsøgt at forhøje pointtallet til 400, men kan altså højest afsætte 200, i alt. Så dem må I så dele, når vi når til vejs ende.
Avatar billede simonvalter Praktikant
28. november 2005 - 21:19 #18
nej og det var også mikkelbm der postede den ;)
Avatar billede mikkelbm Nybegynder
28. november 2005 - 21:43 #19
For at få det ned på din egen maskine skal du i stedet for zip-filen hente jar-filen. Jarfilen indeholder nemlig kompilerede java filer.

Jar filen ligger du i en mappe, hvor du også opretter et html dokument med følgende indhold:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <body>
        <applet archive="sudoku_binary_R1_22_beta.jar" code="com.act365.sudoku.SuDokuApplet" width="1000"
            height="1000" VIEWASTEXT ID="Applet1"></applet>
    </body>
</html>


Derefter burde du kunne åbne siden og bruge programmet.

Nu har jeg hentet: sudoku_binary_R1_22_beta.jar - hvis du henter en af de tidligere releases, skal du huske at rette navnet til.
Avatar billede maagefinke Nybegynder
28. november 2005 - 23:46 #20
Næsten!!
Jeg får denne meddelelse:
Applet com.act365.sudoku.SuDokuApplet notinited

Skal html mappen hedde noget bestemt?
Avatar billede maagefinke Nybegynder
29. november 2005 - 00:00 #21
Det er altså, når jeg klikker på html.mappen. Jeg går ud fra, at det er den, jeg skal starte programmet med?
Avatar billede mikkelbm Nybegynder
29. november 2005 - 08:04 #22
Har du husket at smide jarfilen i samme mappe? Og som jeg skrev, rette navnet til så det passer med den fil du har hentet.

Og bemærk! Det er .jar filen og ikke .zip filen...
Avatar billede maagefinke Nybegynder
29. november 2005 - 10:19 #23
Jeg har lavet en mappe med nedenstående kode og kaldt mappen test1.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <body>
        <applet archive="sudoku_binary_R1_22_beta.jar" code="com.act365.sudoku.SuDokuApplet" width="1000"
            height="1000" VIEWASTEXT ID="Applet1"></applet>
    </body>
</html>


Den ligger sammen med den downloadede fil sudoku_binary_R1_22_beta i et bibliotek der hedder program
Min fil hedder det jeg har skrevet, blot står der ikke .jar som du har anført.
Men der står at det er en executable Jar File på 127 kb.
Hvad har jeg gjort forkert?
Avatar billede maagefinke Nybegynder
29. november 2005 - 11:30 #24
Jeg startede helt forfra: lavede en mappe på skrivebordet Suprogram
Downloadede  sudoku_binary_R1_22_beta filen som hedder det der står. Så oprettede jeg den htmlfil du gav mig og kaldte den test1.
Når jeg trykker på html-filen, får jeg meddelelsen: Applet com.act365.sudoku.SuDokuApplet notinited
Trykker jeg på exefilen står der: Failed to load Main-class manifest attribute from .. og så stien til den mappe, hvor det hele ligger.
Avatar billede maagefinke Nybegynder
29. november 2005 - 11:32 #25
hvad skal html-filen hedde? Det er måske det der går galt?
Avatar billede mikkelbm Nybegynder
29. november 2005 - 11:36 #26
Lyder meget underligt. For det er nøjagtig det samme jeg har gjort - og det virker ved mig. Dog skal jeg lige acceptere via den gule linje der kommer øverst i IE.
Avatar billede maagefinke Nybegynder
29. november 2005 - 13:51 #27
Du har altså også kun sudoku_binary_R1_22_beta samt din html-kode i mappen?
Aktiverer jeg programmet ved at klikke på html-filen? Er det i orden at filen hedder test1.html?
Avatar billede maagefinke Nybegynder
29. november 2005 - 14:01 #28
Nu får jeg Loading Java Applet Failed..
Jeg får ikke nogen gul linje!
Jeg går ud fra, at jeg ikke behøver at være på nettet for at aktivere programmet?!
Avatar billede mikkelbm Nybegynder
29. november 2005 - 14:07 #29
Du kan kalde filen hvad du vil. Og nej, du behøver ikke være på nettet.

Og ja, html-filen og jar-filen skal være i samme mappe.

Jeg kan desværre ikke sige hvad der går galt for det virker fint ved mig.
Hvis du har tjekket at de du skriver i html-koden er 100% identisk med navnet på jarfilen. (inkl. endelsen .jar) - har jeg ikke flere forslag.
Avatar billede maagefinke Nybegynder
29. november 2005 - 14:20 #30
hov! jeg har ikke skrevet noget som helst. Jeg har alene kopieret den kode du viste mig, nemlig:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <body>
        <applet archive="sudoku_binary_R1_22_beta.jar" code="com.act365.sudoku.SuDokuApplet" width="1000"
            height="1000" VIEWASTEXT ID="Applet1"></applet>
    </body>
</html>

og lavet det til en fil.html. Skal jeg tilføje noget?
Skal jeg gøre andet end bare at klikke på denne html.fil for at starte programmet?
Avatar billede maagefinke Nybegynder
29. november 2005 - 14:26 #31
Jeg har i øvrigt downloaded fra Kent, UK?
Avatar billede mikkelbm Nybegynder
29. november 2005 - 14:37 #32
Og det er også den kode du skal bruge. Og du skal bare åbne html filen i din browser, som det også lyder til du gør.

Det jeg siger er, at du skal sørge for at din jar-fil hedder det samme som står i html-koden: sudoku_binary_R1_22_beta.jar


Og hvis den gør det, så aner jeg ikke hvad der er galt.
Avatar billede maagefinke Nybegynder
29. november 2005 - 14:45 #33
Jeg prøver igen, men hvis det fungerer hos dig, kunne du så ikke lave en zip af din mappe og sende den til min mail: lyrikeren@post.tele.dk
Gider du det?
Avatar billede mikkelbm Nybegynder
29. november 2005 - 15:58 #34
Det gør jeg lige når jeg kommer hjem.
Avatar billede simonvalter Praktikant
29. november 2005 - 18:13 #35
du kan iøvrigt godt afvise mit svar, mikkel har lavet alt arbejdet ;)
Avatar billede maagefinke Nybegynder
29. november 2005 - 19:38 #36
>mikkelbm TAk for filen. Du har haldt den suduko.rar og ikke jar. Men selv om jeg omdøder den, virker det ikke.
Kan du ikke sende mig såvel .jar filen som den html-kode du selv har anvendt, for at få det til at fungere? Please!
Avatar billede mikkelbm Nybegynder
29. november 2005 - 19:40 #37
Begge filer ligger i rar-filen.
Avatar billede mikkelbm Nybegynder
29. november 2005 - 19:41 #38
rar er en anden måde at komprimere filer på ligesom zip.

Kan du ikke åbne rar-filen kan du hente en trial af winrar her:

http://www.rarlab.com/
Avatar billede maagefinke Nybegynder
29. november 2005 - 19:59 #39
>mikkelbm Jeg får nu følgende meddelelse: Applet com.act365.sudoku.SudokuApplet notinited
Jeg har prøvet på 2 forskellige computere, windows 98 og windows xp.
Men ingen steder virker det. Suk!!!!
Kan det have noget med internetindstillinger at gøre?
Avatar billede maagefinke Nybegynder
29. november 2005 - 20:00 #40
>simonvalter Har du prøvet at få det til at virke?
Avatar billede mikkelbm Nybegynder
29. november 2005 - 20:07 #41
Hvis du bruger Internet Explorer, så prøv, når du får fejlen, at gå op i Funktioner >> Sun Java Console - og post fejlen her.
Avatar billede maagefinke Nybegynder
29. november 2005 - 20:42 #42
>mikkelbm jeg opfatter "notinited" som ikke initialiseret. Men kan det være rigtigt?
Avatar billede mikkelbm Nybegynder
29. november 2005 - 20:43 #43
Ja, men der må jo være en grund. Og den kan man som regel finde i java konsollen.
Avatar billede maagefinke Nybegynder
29. november 2005 - 20:51 #44
Den siger således: - hvad jeg ikke forstår noget som helst af:
Java(TM) Plug-in: Version 1.4.2_03
Using JRE version 1.4.2_03 Java HotSpot(TM) Client VM
User home directory = C:\Documents and Settings\HansJensen

Proxy Configuration: No proxy





----------------------------------------------------
c:  clear console window
f:  finalize objects on finalization queue
g:  garbage collect
h:  display this help message
l:  dump classloader list
m:  print memory usage
o:  trigger logging
p:  reload proxy configuration
q:  hide console
r:  reload policy configuration
s:  dump system properties
t:  dump thread list
v:  dump thread stack
x:  clear classloader cache
0-5: set trace level to <n>
----------------------------------------------------
java.lang.UnsupportedClassVersionError: com/act365/sudoku/SuDokuApplet (Unsupported major.minor version 49.0)

    at java.lang.ClassLoader.defineClass0(Native Method)

    at java.lang.ClassLoader.defineClass(Unknown Source)

    at java.security.SecureClassLoader.defineClass(Unknown Source)

    at java.net.URLClassLoader.defineClass(Unknown Source)

    at java.net.URLClassLoader.access$100(Unknown Source)

    at java.net.URLClassLoader$1.run(Unknown Source)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(Unknown Source)

    at sun.applet.AppletClassLoader.findClass(Unknown Source)

    at java.lang.ClassLoader.loadClass(Unknown Source)

    at sun.applet.AppletClassLoader.loadClass(Unknown Source)

    at java.lang.ClassLoader.loadClass(Unknown Source)

    at sun.applet.AppletClassLoader.loadCode(Unknown Source)

    at sun.applet.AppletPanel.createApplet(Unknown Source)

    at sun.plugin.AppletViewer.createApplet(Unknown Source)

    at sun.applet.AppletPanel.runLoader(Unknown Source)

    at sun.applet.AppletPanel.run(Unknown Source)

    at java.lang.Thread.run(Unknown Source)
Avatar billede maagefinke Nybegynder
29. november 2005 - 20:52 #45
mikkelbm Jeg håber, at du forstår, hvad det er der står.
Avatar billede mikkelbm Nybegynder
29. november 2005 - 20:53 #46
Det gør jeg :)

Du skal nok hente en nyere udgave af java og installere det:

http://java.sun.com/j2se/1.5.0/download.jsp
Avatar billede mikkelbm Nybegynder
29. november 2005 - 20:56 #47
Nu kan jeg ikke lige finde hvilken version de kræver, men siden er fra 2005, så de bruger nok java 1.5. Jeg kan se, at du har version: 1.4.2_03, så det kræver derfor en opdatering.
Avatar billede maagefinke Nybegynder
29. november 2005 - 21:31 #48
Det tager over 5 timer at downloade? Eller hva?
Avatar billede mikkelbm Nybegynder
29. november 2005 - 21:33 #49
Det kommer meget an på din hastighed ;)

Men nej, du skal vælge det link der hedder: "Download JDK 5.0 Update 5"

- Det fylder ca. 50 mb.
Avatar billede maagefinke Nybegynder
30. november 2005 - 09:55 #50
>mikkelbm Der går nok nogle dage inden jeg får opdateret, og du har jo givet mig en kode. At den så ikke virker hos mig pga forældet java, er ikke din skyld.
Jeg siger mange tak for din store hjælp.
>simonvalter også tak til dig.
Avatar billede simonvalter Praktikant
30. november 2005 - 09:58 #51
ok det var så lidt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester