package piscine
import "strings"
func SudokuSolver(lines ...string) string {
if len(lines) != 9 {
return "Erreur"
}
var sudoku [9][9]rune
for i, line := range lines {
line = strings.ReplaceAll(line, " ", "")
for j, value := range line {
if value == '.' {
sudoku[i][j] = '0'
} else {
sudoku[i][j] = value
}
}
}
if resSudoku(&sudoku) {
return returnPresentation(sudoku)
}
return "Erreur"
}
func resSudoku(sudoku *[9][9]rune) bool {
var rang, col int
if !caseVide(sudoku, &rang, &col) {
return true
}
for num := '1'; num <= '9'; num++ {
if caseValide(sudoku, rang, col, num) {
sudoku[rang][col] = num
if resSudoku(sudoku) {
return true
}
sudoku[rang][col] = '0'
}
}
return false
}
func caseVide(sudoku *[9][9]rune, rang, col *int) bool {
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
if sudoku[i][j] == '0' {
*rang, *col = i, j
return true
}
}
}
return false
}
func caseValide(sudoku *[9][9]rune, rang, col int, num rune) bool {
return dansRang(sudoku, rang, num) == false &&
dansCol(sudoku, col, num) == false &&
dansBlock(sudoku, rang-rang%3, col-col%3, num) == false
}
func dansRang(sudoku *[9][9]rune, rang int, num rune) bool {
for col := 0; col < 9; col++ {
if sudoku[rang][col] == num {
return true
}
}
return false
}
func dansCol(sudoku *[9][9]rune, col int, num rune) bool {
for rang := 0; rang < 9; rang++ {
if sudoku[rang][col] == num {
return true
}
}
return false
}
func dansBlock(sudoku *[9][9]rune, boxStartrang, boxStartCol int, num rune) bool {
for rang := 0; rang < 3; rang++ {
for col := 0; col < 3; col++ {
if sudoku[rang+boxStartrang][col+boxStartCol] == num {
return true
}
}
}
return false
}
func returnPresentation(sudoku [9][9]rune) string {
result := ""
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
result += string(sudoku[i][j])
if j < 8 {
result += " "
}
}
if i < 8 {
result += "\n"
}
}
return result
}