Sudoku solver and puzzle generator.
This solver uses the above implementation to efficiently solve a Sudoku puzzle.
This function makes a random solution to a Sudoku puzzle.
It does this by filling in the first row randomly, and then calling the solver. Due to the way the solver works, this produces a bias which can be observed by looking at the first few numbers in the second row. The first three numbers will be the lowest numbers that don't appear in the first three cells of the first row, in order. An improvement would be to remove this bias.
This function makes a puzzle (a partially filled grid), given a solution (completely filled grid) and a number of cells to leave filled.
This works by removing pairs of numbers (symmetric around 180 degree rotation), checking the resulting puzzle to see that it still has only one solution, and repeating. If removing a pair of numbers results in a puzzle with more than one solution, the numbers are left in place and another pair is tried.
This function has considerable opportunity for improvements in efficiency. Also, it makes no attempt to estimate the "difficulty" of the resulting puzzle.