Division euclidienne

Grille de Sudoku .

Numérotation des cellules

Dans l'objectif de travailler sur un jeu de Sudoku, on numérote les cellules de la grille de gauche à droite et de haut en bas de 0 à 80.

L'affichage du petit programme suivant permet de visualiser cette numérotation :


L=[[9*i+j for j in range(9)]for i in range(9)]
for i in L :
    for k in i :
        print(k,"\t",end="")
    print()

ce qui donne :

0 	1 	2 	3 	4 	5 	6 	7 	8 	
9 	10 	11 	12 	13 	14 	15 	16 	17 	
18 	19 	20 	21 	22 	23 	24 	25 	26 	
27 	28 	29 	30 	31 	32 	33 	34 	35 	
36 	37 	38 	39 	40 	41 	42 	43 	44 	
45 	46 	47 	48 	49 	50 	51 	52 	53 	
54 	55 	56 	57 	58 	59 	60 	61 	62 	
63 	64 	65 	66 	67 	68 	69 	70 	71 	
72 	73 	74 	75 	76 	77 	78 	79 	80 	

Questions

  1. i et j étant des numéros de cellules, quelle sera, dans un programme python, l'utilité du test i%9 == j%9 ?
  2. i et j étant des numéros de cellules, quelle sera, dans un programme python, l'utilité du test i//9 == j//9 ?
  3. i et j étant des numéros de cellules, quelle sera, dans un programme python, l'utilité du test 3*(i//27)+(i%9)//3 == 3*(j//27)+(j%9)//3 ?

Résolution de l'exercice "Grille de Sudoku ".

i%9 == j%9

Ce test vaut True si et seulement si les deux cellules sont dans la même colonne.

i//9 == j//9

Ce test vaut True si et seulement si les deux cellules sont dans la même ligne.

3*(i//27)+(i%9)//3 == 3*(j//27)+(j%9)//3

Ce test vaut True si et seulement si les deux cellules sont dans le même "carré". Carré est ici pris au sens d'une zone carrée d'un sudoku. On met en évidence ci-dessous les 9 carrés et la numérotation utilisée dans le test :


L=[[9*i+j for j in range(9)]for i in range(9)]

def carre(i) :
    return 3*(i//27)+(i%9)//3
    
for i in L :
    for k in i :
        print(carre(k),"\t",end="")
    print()

ce qui donne :

0 	0 	0 	1 	1 	1 	2 	2 	2 	
0 	0 	0 	1 	1 	1 	2 	2 	2 	
0 	0 	0 	1 	1 	1 	2 	2 	2 	
3 	3 	3 	4 	4 	4 	5 	5 	5 	
3 	3 	3 	4 	4 	4 	5 	5 	5 	
3 	3 	3 	4 	4 	4 	5 	5 	5 	
6 	6 	6 	7 	7 	7 	8 	8 	8 	
6 	6 	6 	7 	7 	7 	8 	8 	8 	
6 	6 	6 	7 	7 	7 	8 	8 	8