Tuesday, November 29, 2022

VeryUtils SudokuJS JavaScript Sudoku solver

 VeryUtils SudokuJS JavaScript Sudoku solver. VeryUtils SudokuJS has a step by step solver that implements basic strategies, enough to solve (non evil) newspaper sudoku puzzles. The solver is built to mimic humans in that it attempts strategies in order from easiest to most difficult, in each step. So if you're stuck with a puzzle this solver will show you the minimal next step to continue.

https://veryutils.com/sudokujs-javascript-sudoku-solver


VeryUtils SudokuJS comes with a basic GUI for the sudoku board - the board is rendered on the screen, and the board cells listen for keyboard input from a user. VeryUtils SudokuJS can generate sudoku puzzles of the same difficulties that it can solve, ranging from Easy to Very hard. VeryUtils SudokuJS currently requires jQuery library.


### Run Demo Online


VeryUtils SudokuJS (4x4) - Introductory Sudoku : demo-board-size-4.html

VeryUtils SudokuJS (9x9) - Demo with controls: demo-edit-candidates.html

VeryUtils SudokuJS (9x9) - Demo with board generation: demo-generate-board.html

VeryUtils SudokuJS (9x9) - Simple demo: demo-simple.html

VeryUtils SudokuJS (9x9) - Demo with controls: demo-w-controls.html

VeryUtils SudokuJS (16x16) - Professional Sudoku : demo-board-size-16.html


### Usage


#### Initialization

   [script src='VeryUtils SudokuJS.js'][/script]

   [link rel='stylesheet' href='VeryUtils SudokuJS.css' /]


   [div id='sudoku'][/div]


   [script]

      var myVeryUtils SudokuJS = $("#sudoku").VeryUtils SudokuJS({

        difficulty: "medium" ("easy"|"medium"|"hard"|"very hard")

   });

   [/script]


You can also pass in your own board:


   //array representing a standard sudoku puzzle of size 9

   //use space for empty cells

   var board = [

      , , ,4, ,8, ,2,9

      , , , , , , , , ,4

      ,8,5, , ,2, , , ,7

      , , ,8,3,7,4,2, ,

      , ,2, , , , , , ,

      , , ,3,2,6,1,7, ,

      , , , , ,9,3,6,1,2

      ,2, , , , , ,4, ,3

      ,1,3, ,6,4,2, ,7,undefined

   ]

   //NOTE: if last cell of board is empty, 'undefined' has to be used as value!

   var myVeryUtils SudokuJS = $("#sudoku").VeryUtils SudokuJS({

      board: board

   });


#### Solving

Let `VeryUtils SudokuJS` solve your puzzle - either step by step, or all in one go:


   myVeryUtils SudokuJS.solveStep();

   myVeryUtils SudokuJS.solveAll();


#### Analyzing the board

The solver can tell you info about the board.


   var data = myVeryUtils SudokuJS.analyzeBoard();


   //data.error -- board is incorrect

   //data.finished === false -- board can't be solved because it requires more advanced strategies


   //if no error, and data.finished === true

   //data.level -- "easy"|"medium"|"hard"

   //data.score -- int [experimental]

   //data.usedStrategies -- [{title, freq}, ..],ranked by difficulty, easiest first


#### Board Generation

`VeryUtils SudokuJS` generate new sudoku puzzles on init when no board is passed in, and on `generateBoard` calls:


   myVeryUtils SudokuJS.generateBoard('easy');

   myVeryUtils SudokuJS.generateBoard('medium');

   myVeryUtils SudokuJS.generateBoard('hard');

   myVeryUtils SudokuJS.generateBoard('very hard');


The current implementation for board generation cannot guarantee hard or very hard puzzles generated on every try, so instead it continues over and over until is has succeeded. This means loading a very hard board can sometimes take up to a few seconds.


`generateBoard` accepts a `callback` function as a second parameter, that gets called when the new board is ready.


#### Candidates

Candidates are hidden when a board loads. To show/hide candidates:


   myVeryUtils SudokuJS.showCandidates();

   myVeryUtils SudokuJS.hideCandidates();


VeryUtils SudokuJS automatically removes impossible candidates on showCandidates();

candidates that can be eliminated via visualElimination (number already exists in same house).


Candidates can be edited on the board by setting VeryUtils SudokuJS to candidate editing mode:


   myVeryUtils SudokuJS.setEditingCandidates(true);


Input changes on board cells will now toggle the candidates rather than changes the value.


#### Clear board

Useful before entering new puzzle, if using keyboard input in the GUI.


   myVeryUtils SudokuJS.clearBoard();


#### Get/Set board

Get the board and save it away if you want. Set a new board and play with that one instead.

Setting automatically resets everything back to init state.


   myVeryUtils SudokuJS.getBoard();


   var newBoard = [

   ...

   ]


   myVeryUtils SudokuJS.setBoard(newBoard);


### Callbacks


#### boardUpdatedFn

Fires whenever the board is updated, whether by user or solver.


   $("#sudoku").VeryUtils SudokuJS({

      board: board

      ,boardUpdatedFn: function(data){

         //data.cause: "user input" | name of strategy used

         //data.cellsUpdated: [] of indexes for cells updated

            alert("board was updated!");

      }

   });


#### boardFinishedFn

Fires when the board has been completed.


   $("#sudoku").VeryUtils SudokuJS({

      board: board

      ,boardFinishedFn: function(data){

         //ONLY IF board was solved by solver:

         //data.difficultyInfo {

         // level: "easy", "medium", "hard"

         // ,score: int [experimental]

         //}

         alert("board was finished!");

      }

   });



#### boardErrorFn

Fires whenever the board is found to be incorrect, f.e. if solver detects there is no solution to board, or if passed in board is of invalid size.


   $("#sudoku").VeryUtils SudokuJS({

      board: board

      ,boardErrorFn: function(data){

         //data.msg -- f.e. "board incorrect"

         alert("board error!");

      }

   });


#### candidateShowToggleFn

The solver automatically switches to showing candidates when a solve step was invoked which only updated the candidates on the board. To catch this change (for updating UI, etc), there is a callback:


   $("#sudoku").VeryUtils SudokuJS({

      board: board

      ,candidateShowToggleFn: function(showingBoolean){

         alert("candidates showing: " + showingBoolean); //true|false

      }

   }


### Extra

The solver is board size agnostic, so you can pass in any valid sudoku sized board (f.e. 4x4, 9x9, 16x16) - however the CSS included only handles 9x9 boards. Currently you can't change boardSize after init.


### Changelog

* boardSize option, now working. Demos for board sizes

* Candidate editing mode

* Board generator, easy - very hard

* Simple UI and better interface

* Step by step sudoku solver


No comments:

Post a Comment

Free VeryUtils AI Photo Enhancer: Register Now & Get 1 Month Free Subscription!

Free VeryUtils AI Photo Enhancer: Register Now & Get 1 Month Free Subscription! Are you looking to take your photo editing skills to the...