Sudoku: Difference between revisions

Content deleted Content added
m →‎{{header|Rust}}: do rustfmt
→‎{{header|Rust}}: Made the example more idiomatic
Line 9,780:
=={{header|Rust}}==
{{trans|Ada}}
<lang rust>type SudokuArTypeSudoku = [u8; 81];
 
fn check_validityis_valid(val: u8, x: usize, y: usize, sudoku_ar: &mut SudokuArTypeSudoku) -> bool {
 
(0..9).all(|i| sudoku_ar[y * 9 + i] != val if&& sudoku_ar[i * 9 + jx] =!= val) && {
fn check_validity(val: u8, x: usize, y: usize, sudoku_ar: &mut SudokuArType) -> bool {
let (start_x:, usizestart_y) = ((x / 3) * 3, (y / 3) * 3);
for i in 0..=8 {
if (sudoku_ar[y * 9start_y..start_y + 3).all(|i]| ==(start_x..start_x + val3) .all(|j| (sudoku_ar[i * 9 + xj] =!= val) {)
return false;
}
}
 
let start_x: usize = (x / 3) * 3;
let start_y: usize = (y / 3) * 3;
for i in start_y..=(start_y + 2) {
for j in start_x..=(start_x + 2) {
if sudoku_ar[i * 9 + j] == val {
return false;
}
}
}
true
}
 
fn solveplace_number(pos: usize, sudoku_ar: &mut SudokuArTypeSudoku) -> bool {
 
fn place_number (pos: usize,..81).find(|&p| sudoku_ar:[p] &mut== SudokuArType0).map_or(true, -> bool|pos| {
let mut(x, y) = (pos % 9, pos ret:/ bool9);
if pos == 81 for n in 1..10 {
retif = place_numberis_valid(posn, +x, 1y, sudoku_ar); {
return true;
returnsudoku_ar[pos] false= n;
}
if place_number(pos + 1, sudoku_ar) {
 
return falsetrue;
 
if sudoku_ar[pos] > 0 { }
ret = place_number(pos + 1, sudoku_ar)[pos] = 0;
if ret == true {
return true;
} else {
return false;
}
}
for n in 1..=9 {
if check_validity(n, pos % 9, pos / 9, sudoku_ar) == true {
sudoku_ar[pos] = n;
ret = place_number(pos + 1, sudoku_ar);
if ret == true {
return true;
}
sudoku_ar[pos] = 0;
}
} false
false})
}
 
fn pretty_print(sudoku_ar: SudokuArTypeSudoku) {
 
let line_sep = "------+-------+------";
fn pretty_print(sudoku_ar: SudokuArType) {
let line_sep = "------+------+------";
println!("{}", line_sep);
for (i, e) in 0..sudoku_ar.leniter().enumerate() {
print!("{} ", sudoku_ar[i]e);
if (i + 1) % 3 == 0 && !((i + 1) % 9 =!= 0) {
print!("| ");
}
Line 9,849 ⟶ 9,822:
}
 
fn solve(sudoku_ar: &mut Sudoku) -> bool {
 
fn solve(sudoku_ar: &mut SudokuArType) -> bool {
place_number(0, sudoku_ar)
}
 
 
fn main() {
let mut sudoku_ar: SudokuArTypeSudoku = [
8, 5, 0, 0, 0, 2, 4, 0, 0,
7, 2, 0, 0, 0, 0, 0, 0, 9,
Line 9,867 ⟶ 9,838:
0, 0, 0, 0, 3, 6, 0, 4, 0
];
if solve(&mut sudoku_ar[pos] =) n;{
 
if solve pretty_print(&mut sudoku_ar) == false {;
} else }{
println!("Unsolvable");
} else {
pretty_print(sudoku_ar);
}
}</lang>
Line 9,877 ⟶ 9,847:
{{out}}
<pre>
------+-------+------
8 5 9 | 6 1 2 | 4 3 7
7 2 3 | 8 5 4 | 1 6 9
1 6 4 | 3 7 9 | 5 2 8
------+-------+------
9 8 6 | 1 4 7 | 3 5 2
3 7 5 | 2 6 8 | 9 1 4
2 4 1 | 5 9 3 | 7 8 6
------+-------+------
4 3 2 | 9 8 1 | 6 7 5
6 1 7 | 4 2 5 | 8 9 3
5 9 8 | 7 3 6 | 2 4 1
------+-------+------
</pre>