Main Page - Back |

From SudokuWiki.org, the puzzle solver's site |

As of 9th May 2024 I've created a new Killer Sudoku string definition to transport candidates and solved cells information to the Killer Solver. This will enable exact positions to be sent via a string, not just the starting board as before. The old 'puzzle' definition will continue to work.

This is currently employed on the [Email this Board] feature - best place to copy/paste the new link. I will probably change some of the**documentation pages** to use this soon.

The normal killer definition remains the same as before in all places and uses. This consists of

This is currently employed on the [Email this Board] feature - best place to copy/paste the new link. I will probably change some of the

The normal killer definition remains the same as before in all places and uses. This consists of

- The address
*https://www.sudokuwiki.org/killersudoku.aspx?bd=* - 81 characters for the colours defining the shapes
- a comma
- 162 characters stating the clues, padded with zeros if necessary. Clues are the sums of the cages and appear once per cage in the top-left most position

The new link looks like this example:

Users of the solver may want to know more about this string so that they can duplicate it for their own uses and understand how it works. So I'm presenting the information here.

There are two packed strings of 162 length separated by a comma. The first string contains the cage colours and clues. The second the candidate spread giving us the progress of the puzzle.

The second 162 character string takes each cell on the board and converts the solution or candidates into a sum of bits (1=1, 2=2, 3=4, 4=8, 5=16, 6=32, 7=64, 8=128 and 9=256). A solved cell has one 'candidate' number. Unlike Sudoku the solved cells don't need to be flagged as solved or an original clue. Killer can have single cages and are published with the big number but for the sake of the definition it is a cage clue. But I'm going to continue to shift the cell value by one bit so the code is the same for Sudoku.

A bit of javascript code shows how this is done

Users of the solver may want to know more about this string so that they can duplicate it for their own uses and understand how it works. So I'm presenting the information here.

There are two packed strings of 162 length separated by a comma. The first string contains the cage colours and clues. The second the candidate spread giving us the progress of the puzzle.

The second 162 character string takes each cell on the board and converts the solution or candidates into a sum of bits (1=1, 2=2, 3=4, 4=8, 5=16, 6=32, 7=64, 8=128 and 9=256). A solved cell has one 'candidate' number. Unlike Sudoku the solved cells don't need to be flagged as solved or an original clue. Killer can have single cages and are published with the big number but for the sake of the definition it is a cage clue. But I'm going to continue to shift the cell value by one bit so the code is the same for Sudoku.

A bit of javascript code shows how this is done

for (y = 0; y < 9; y++)

for (x = 0; x < 9; x++) {

n = get the cell value or set of candidates as bits

n = (n << 1); // shift to make it similar to the Sudoku definition

h = n.toString(32); // convert to base 32

if (h.length < 2) h = '0' + h; // pad the number if not two digits

s2 += h; // append to string being made

}

For the first string we organise it thus: the maximum number for a cage clue is 45 - since cages cannot exceed a unit size. I'm aware there are Killer variants which have outsized cages or regions but that would be a different solver. The values for the cage colours are 1, 2, 3 and 4. Occasionally a fifth colour is needed so lets reserve 3 bits. Instead of two strings of 81 characters + 162 characters we can pack these into one string. We use three bits to store the colour number and shifting 45 by three bits = 360. So the largest number is 364. We can use the same base 32 as we use for the candidates.
So in the same for loop as above we can add:

for (y = 0; y < 9; y++) for (x = 0; x < 9; x++) {same code as above. . // combine clue (max=45) and the shape colour // colours are 1 to 5 but store as 0 to 4 n = (clue[y][x] << 3) + (shapecol[y][x]-1); h = n.toString(32); // convert to base 32 if (h.length < 2) h = '0' + h; // pad the number if not two digits s1 += h; // append to string being made }

To unpack the strings we do the following

// This splits a string into an array of elements each 2 characters long var colclues_arr = s1.match(/.{1,2}/g); var cands_arr = s2.match(/.{1,2}/g); for (y = 0; y < 9; y++) for (x = 0; x < 9; x++) { // get the candidates out n = parseInt(cands_arr[y * 9 + x], 32); // convert base 32 to decimal Shift by one bit to remove the dummy flag cands[y][x] = n >> 1; // get the clues and shape colours out // first convert base 32 to decimal n = parseInt(colclues_arr[y * 9 + x], 32); // want the first three bits - gives 0 to 4, add 1 shapecol[y][x] = (n & 7) + 1; // shift the bits by 3 to remove the shapes and get the clue clue[y][x] = n >> 3; }