Version 0.8.0 (2023-12-04)
==========================
Added:
* `Sudoku::canonicalized`. Maps all sudokus of an equivalence class to the same sudoku
and counts automorphisms. Limited to uniquely solvable sudokus.
* `Sudoku::shuffled`: Perform random symmetry transformations to get a different but equivalent sudoku.
* Generation of symmetrical sudokus. The desired symmetry can be chosen via the `Symmetry` enum.
- `Sudoku::generate_with_symmetry`
- `Sudoku::generate_with_symmetry_from`
* Generate sudokus with a user-chosen RNG:
* `generate_solved_with_rng`
* `generate_with_symmetry_and_rng_from`
* New strategies:
- XyWing
- XyzWing
- Mutant Swordfish
- Mutant Jellyfish
Changed:
* Raise minimum supported Rust version to 1.56
* Rename many of `Sudoku`'s methods
- `solve_unique` -> `solution`
- `solve_one` -> `some_solution`
- `count_at_most` -> `solutions_count_up_to`
- `solve_at_most` -> `solutions_up_to`
- `solve_at_most_buffer` -> `solutions_up_to_buffer`
- `generate_filled` -> `generate_solved`
- `generate_unique` -> `generate`
- `generate_unique_from` -> `generate_from`
* Improved errors for `Sudoku` methods.
Errors now implement `std::error::Error` and none of them return `Result<T, ()>` anymore.
Moved `parse_errors` module to `errors`.
Version 0.7.0 (2018-08-19)
==========================
* Raise minimum Rust version to 1.28
* Add `StrategySolver` for solving sudokus using human strategies
as well as various helper types, including a set of position types.
For a start, 6 kinds of strategies are available which separate
into a total of 12 strategies.
* Switch default sudoku print format to the line format
* Add `SudokuBlock` wrapper to print a grid representation
created by `display_block()` on `Sudoku`
* Remove `Sudoku::solve`. Use `solve_one`, `solve_unique` or `solve_at_most`.
* Rename <br>
`(Pub)Entry` -> `InvalidEntry` <br>
`LineFormatParseError` -> `LineParseError` <br>
`BlockFormatParseError` -> `BlockParseError`
Version 0.6.2 (2018-06-24)
==========================
* Add `solve_at_most_buffer`, primarily for C FFI
Version 0.6.1 (2018-06-6)
=========================
* Improve upon jczsolve and raise performance by ~15-20%
* Allow semicolons and commas (';', ',') as comment delimiters in line sudokus
Version 0.6.0 (2018-05-30)
==========================
* Raise minimum Rust version to 1.26
* Add `generate_unique_from(sudoku)`
* Add `shuffle()` which transforms a sudoku into a random equivalent sudoku.
* Add `n_clues()` for the number of filled cells
Version 0.5.0 (2018-02-14)
==========================
* Optional `serde` support
* Implemented the JCZsolve algorithm which is to date and to the best knowledge of the author
the fastest sudoku solver in existence.
* Added `unchecked_indexing` feature
While testing hasn't shown any incorrect indexing, bounds checks are activated by default to guarantee memory safety in case of a bug. This lowers the speed by 2-12% and can be deactivated by the aforementioned feature
* Added two new functions `count_at_most(limit)` and `is_uniquely_solvable()` which run slightly faster
than their equivalents that return the solved grid.
Version 0.4.1 (2018-01-01)
==========================
* Add functions for generation of random sudokus: `generate_filled()` and `generate_unique()`
for random solved and unsolved but uniquely solvable sudokus respectively.
* Implement `Hash`, `PartialOrd`, `Ord` for `Sudoku` and `SudokuLine`.
Version 0.4.0 (2017-12-11)
==========================
* Changed parser functions for `Sudoku`
- Added `from_str_line()` for parsing sudokus in line format. Also added `to_str_line()` for a printable representation of the same.
- Split `from_str()` into `from_str_block()` and `from_str_block_permissive()`. As the names suggest, the latter is much more forgiving than the former but will also fail in strange ways on malformed data.
* Added `from_bytes()`, `from_bytes_slice()`, `into_bytes()` to `Sudoku` for construction and deconstruction for byte arrays and slices. Errors will be revisited.
* Added new module `parser_errors`
Version 0.3.2 (2017-04-18)
==========================
* Bugfix: `sudoku.is_solved()` incorrectly returned true when `sudoku` was not solved,
but solvable through naked single tactics alone
Version 0.3.1 (2017-04-18)
==========================
* Build on stable rust again
Version 0.3.0 (2017-04-17)
==========================
* Switch algorithm to that of the Jsolve sudoku solver (with some minor changes), increasing speed more than 10x.
Version 0.2.1 (2017-04-08)
==========================
* Fixed a logic bug that led to returning multiple invalid solutions for some sudokus.
Version 0.2.0 (2016-02-07)
==========================
* Implemented new and faster solver based on exact cover matrix capable of solving sudokus of all difficulties quickly (on the order of milliseconds or less on a modern desktop)