Another take at Sudoku solving in Rust. This is a weekend-ish remake of my previous pet project at sunsided/rust-sudoku-solver. Unlike the previous experiment, this solver correctly solves Hypersudokus and requires fewer branches. Internally, value candidates and indexes are encoded via 16- and 128-bit bitsets (ValueBitSet, IndexBitSet), reducing the overhead for constructing and testing hashsets.
Currently implemented strategies are Naked Singles, Hidden Singles, Naked Twins, Hidden Twins and X-Wings. Each additional strategy comes with its own overhead and most of the time, simply running a trial-and-error branching strategy performs best in terms of wall clock time.
To show the available options for the example, execute:
cargo run --example solver -- --help
To run the default example with debug output, execute:
RUST_LOG=debug cargo run --release --example solver
Individual strategies can be disabled. To run the default example without the Hidden Twins strategy, execute:
cargo run --release --example solver --no-hidden-twins
Set the log level to trace
for more fine-grained information.
For reference, here's an example puzzle from the Wikipedia Sudoku page:
Initial State | Solution |
---|---|
![]() |
![]() |
The solver's output is shown below. To run, execute:
$ cargo run --release --example solver -- --sudoku
For the code, see src/example_games/sudoku.rs
.
Other board variations with known Hidden Twins or X-Wings are available with:
$ cargo run --release --example solver -- --sudoku-ht
$ cargo run --release --example solver -- --sudoku-xwing
$ cargo run --release --example solver -- --sudoku-hardest
βββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ
β A Β· A Β· A β B Β· B Β· B β C Β· C Β· C β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β A Β· A Β· A β B Β· B Β· B β C Β· C Β· C β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β A Β· A Β· A β B Β· B Β· B β C Β· C Β· C β
βββββΌββββΌββββΌββββΌββββΌββββΌββββΌββββΌββββ€
β D Β· D Β· D β E Β· E Β· E β F Β· F Β· F β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β D Β· D Β· D β E Β· E Β· E β F Β· F Β· F β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β D Β· D Β· D β E Β· E Β· E β F Β· F Β· F β
βββββΌββββΌββββΌββββΌββββΌββββΌββββΌββββΌββββ€
β G Β· G Β· G β H Β· H Β· H β I Β· I Β· I β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β G Β· G Β· G β H Β· H Β· H β I Β· I Β· I β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β G Β· G Β· G β H Β· H Β· H β I Β· I Β· I β
βββββ΄ββββ΄ββββ΄ββββ΄ββββ΄ββββ΄ββββ΄ββββ΄ββββ
βββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ
β Β· Β· Β· β Β· Β· 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β
β Β· 5 Β· β Β· Β· Β· β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β
β Β· Β· Β· β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β
β Β· Β· 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β Β· Β· Β· β Β· 5 Β· β 4 5 6 β 4 5 6 β 4 5 6 β
β Β· Β· Β· β 7 8 9 β 7 8 9 β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β Β· Β· Β· β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β
β 4 5 6 β Β· Β· Β· β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· 6 β 4 5 6 β
β 7 8 9 β Β· Β· 9 β Β· 8 Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· 3 β
β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β
β Β· 8 Β· β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β Β· Β· 3 β 1 2 3 β 1 2 3 β 1 Β· Β· β
β 4 Β· Β· β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β Β· Β· Β· β
β Β· Β· Β· β 7 8 9 β 7 8 9 β Β· 8 Β· β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β Β· 2 Β· β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β
β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· 6 β
β 7 Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· 2 Β· β Β· Β· Β· β 1 2 3 β
β 4 5 6 β Β· Β· 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β Β· Β· Β· β 4 5 6 β
β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β Β· 8 Β· β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β 1 2 3 β 1 2 3 β Β· Β· Β· β
β 4 5 6 β 4 5 6 β 4 5 6 β 4 Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 5 6 β 4 5 6 β Β· 5 Β· β
β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β Β· Β· Β· β Β· Β· Β· β
β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β Β· Β· Β· β Β· Β· Β· β
β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· 8 Β· β 7 8 9 β 7 8 9 β 7 Β· Β· β Β· Β· 9 β
βββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ
βββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ
β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· 2 Β· β
β Β· 5 Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· 8 Β· β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β Β· 2 Β· β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β
β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β
β Β· Β· Β· β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β Β· 5 Β· β Β· Β· 6 β Β· Β· Β· β
β Β· Β· Β· β Β· Β· 9 β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β Β· 2 Β· β Β· Β· 3 β
β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· 8 Β· β Β· Β· Β· β Β· Β· 9 β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β
β 4 Β· Β· β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· 9 β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β 1 Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β Β· 5 Β· β Β· Β· 6 β
β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β
β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· 5 Β· β
β Β· Β· Β· β Β· 8 Β· β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β 4 Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· 9 β
βββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ
For reference, here's an example Nonomino from the Wikipedia Sudoku page:
Initial State | Solution |
---|---|
![]() |
![]() |
The solver's output is shown below. To run, execute:
$ cargo run --release --example solver -- --nonomino
For the code, see src/example_games/nonomino.rs
.
βββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ
β A Β· A Β· A β B Β· C Β· C β C Β· C Β· C β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β A Β· A Β· A β B Β· B Β· B β C Β· C Β· C β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β A Β· D Β· D β D Β· D Β· B β B Β· B Β· C β
βββββΌββββΌββββΌββββΌββββΌββββΌββββΌββββΌββββ€
β A Β· A Β· D β E Β· E Β· E β E Β· B Β· B β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β D Β· D Β· D β D Β· E Β· F β F Β· F Β· F β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β G Β· G Β· E β E Β· E Β· E β F Β· I Β· I β
βββββΌββββΌββββΌββββΌββββΌββββΌββββΌββββΌββββ€
β H Β· G Β· G β G Β· F Β· F β F Β· F Β· I β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β H Β· H Β· H β G Β· G Β· G β I Β· I Β· I β
βΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·βΌΒ·Β·Β·β€
β H Β· H Β· H β H Β· H Β· G β I Β· I Β· I β
βββββ΄ββββ΄ββββ΄ββββ΄ββββ΄ββββ΄ββββ΄ββββ΄ββββ
βββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ
β Β· Β· 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β
β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 Β· Β· β
β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β Β· 2 Β· β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 Β· Β· β 1 2 3 β 1 2 3 β
β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β Β· Β· 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β
β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β Β· Β· Β· β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 Β· Β· β 1 2 3 β Β· Β· Β· β 1 2 3 β Β· Β· Β· β 1 2 3 β Β· 2 Β· β 1 2 3 β
β 4 5 6 β Β· Β· Β· β 4 5 6 β Β· Β· Β· β 4 5 6 β Β· Β· Β· β 4 5 6 β Β· Β· Β· β 4 5 6 β
β 7 8 9 β Β· Β· Β· β 7 8 9 β Β· Β· 9 β 7 8 9 β Β· 8 Β· β 7 8 9 β Β· Β· Β· β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β
β 4 5 6 β 4 5 6 β Β· 5 Β· β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· 6 β 4 5 6 β 4 5 6 β
β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β Β· 2 Β· β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 Β· Β· β 1 2 3 β
β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β
β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β
β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β
β 7 8 9 β 7 8 9 β Β· Β· 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· 8 Β· β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β Β· Β· Β· β 1 2 3 β Β· Β· 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β Β· Β· Β· β 1 2 3 β
β 4 5 6 β Β· Β· Β· β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 Β· Β· β 4 5 6 β Β· Β· 6 β 4 5 6 β
β 7 8 9 β Β· 8 Β· β 7 8 9 β Β· Β· Β· β 7 8 9 β Β· Β· Β· β 7 8 9 β Β· Β· Β· β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 Β· Β· β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β
β 4 5 6 β 4 5 6 β 4 Β· Β· β 4 5 6 β Β· Β· Β· β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β
β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β Β· Β· Β· β 7 8 9 β Β· Β· 9 β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β
β Β· 5 Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β
β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 Β· Β· β
βββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ
βββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ
β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· 3 β Β· Β· Β· β
β 4 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 5 Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β 1 Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β
β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β Β· 5 Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β 7 Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β
β Β· Β· Β· β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β 7 Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· 6 β 4 Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· Β· β Β· Β· 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 5 Β· β Β· Β· 6 β
β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β Β· 5 Β· β Β· Β· 6 β Β· Β· Β· β
β Β· Β· 9 β Β· 8 Β· β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 2 Β· β
β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β Β· 8 Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β
β Β· 5 Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β
βββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ
A Hypersudoku example. To run it, execute:
$ cargo run --release --example solver -- --hyper
For the code, see src/example_games/hypersudoku.rs
.
βββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ
β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 Β· Β· β 1 2 3 β
β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β
β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β Β· 2 Β· β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· 3 β Β· Β· Β· β
β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 Β· Β· β
β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β
β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· 5 Β· β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β
β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β Β· Β· Β· β 1 2 3 β 1 2 3 β
β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· 6 β Β· 5 Β· β 4 5 6 β 4 5 6 β
β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· Β· β Β· Β· Β· β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β Β· Β· Β· β 1 2 3 β Β· Β· 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β
β 4 5 6 β Β· Β· Β· β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β
β 7 8 9 β 7 Β· Β· β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β Β· 8 Β· β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β Β· Β· 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β
β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β
β 7 8 9 β 7 8 9 β Β· Β· Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β
β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β
β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· 8 Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β Β· Β· Β· β 1 2 3 β 1 2 3 β
β Β· 5 Β· β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β
β Β· Β· Β· β Β· 8 Β· β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β Β· Β· 9 β 7 8 9 β 7 8 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β 1 2 3 β
β Β· Β· 6 β Β· Β· Β· β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β 4 5 6 β
β Β· Β· Β· β Β· Β· 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β 7 8 9 β
βββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ
βββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββββββ
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· 2 Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β
β Β· Β· Β· β 4 Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 5 Β· β
β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β 1 Β· Β· β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β
β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β 7 Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 6 β
β 7 Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 6 β Β· 5 Β· β 4 Β· Β· β Β· Β· Β· β
β Β· 8 Β· β Β· Β· Β· β Β· Β· 9 β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 2 Β· β
β 4 Β· Β· β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· 2 Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· 5 Β· β 4 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· 9 β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· 3 β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 5 Β· β 4 Β· Β· β Β· Β· 6 β Β· Β· Β· β
β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· 9 β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· 2 Β· β Β· Β· Β· β
β Β· 5 Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β
β Β· Β· Β· β Β· 8 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β 7 Β· Β· β
βββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββΌββββββββ€
β Β· Β· Β· β Β· Β· Β· β 1 Β· Β· β Β· 2 Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· 3 β Β· Β· Β· β Β· Β· Β· β
β Β· Β· 6 β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β 4 Β· Β· β Β· Β· Β· β Β· 5 Β· β Β· Β· Β· β
β Β· Β· Β· β Β· Β· 9 β Β· Β· Β· β Β· Β· Β· β 7 Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· Β· Β· β Β· 8 Β· β
βββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββββββ