מידע

יוצרים Tanguy De Bels
מועד הגשה אין מועד הגשה
מגבלת הגשות אין הגבלה

כניסה

[Q5intro] Sudoku - contexte

Ceci est le contexte et le code utilisés dans la question 5a et la question 5b, il est conseillé de commencer par le lire.
Pour rappel: il est possible d'ouvrir une fenêtre supplémentaire d'INGInious.

Un puzzle Sudoku de dimension N, dont un exemple de dimension 2 est donné dans l’image ci-dessous, peut être représenté par une ensemble de N * N carrés, chacun de taille N * N.

q_code/sudoku.png

Chaque carré a une position (X,Y) dans le puzzle Sudoku, et dans chaque carré, chaque cellule a également une position (X,Y), ou 0 ≤ X < N et 0 ≤ Y < N. Par exemple, dans l’image ci-dessus, le carré à la position (X=1,Y=0) est le suivant, et contient lui-même une valeur de 4 à sa position (X=0,Y=1).

q_code/square.png

Une implémentation possible de cette représentation d’un puzzle Sudoku est fournie par les classes SudokuPuzzle et SudokuCarre suivantes :

class SudokuPuzzle:
    def __init__(self,dimension) :
        """
        Crée un SudokuPuzzle de dimension `dimension` avec tous les éléments initialisés à 0.
        """
        self.dimension = dimension
        self.carres = [ [ SudokuCarre(x,y,dimension) \
                          for x in range (dimension) ] \
                          for y in range (dimension)]

    def get_carre(self,x,y) :
        """
        Retourne le SudokuCarre qui se trouve à la position (x, y) dans ce Sudoku.
        """
        return self.carres[y][x]

    def __str__(self):
        """
        Retourne un texte permettant de représenter le Sudoku.
        """
        s = ""
        for y in range(len(self.carres)) :
            for x in range (len(self.carres[y])) :
                s += str(self.get_carre(x,y))
            s += "\n"
        return s

class SudokuCarre:

    def __init__(self,x,y,dimension) :
        """
        Crée un SudokuCarre de taille `dimension` x `dimension`, avec toutes ses valeurs initialisées à 0.
        """
        self.xcoord_carre = x
        self.ycoord_carre = y
        self.cells = [ [ 0 for x in range(dimension) ]
                        for y in range(dimension) ]

    def set_val(self,x,y,val) :
        """
        Assigne une valeur `val` à la cellule se trouvant à la position (x, y) de ce carré.
        """
        self.cells[y][x] = val

    def get_val(self,x,y) :
        """
        Retourne la valeur qui se trouve à la position (x, y) de ce carré.
        """
        return self.cells[y][x]

    def __str__(self):
        """
        Retourne un texte permettant de représenter le contenu de ce carré.
        """
        s = "carré (" + str(self.xcoord_carre) + "," + str(self.ycoord_carre) + ") : "
        s += str(self.cells)
        s += " "
        return s

En utilisant ces classes, le code suivant construit le puzzle Sudoku montré ci-dessus:

# créer un puzzle Sudoku vide de dimension 2
p = SudokuPuzzle(2)
# remplir les carrés et leurs valeurs
# initiliaser le carré à la position (0,0)
p.get_carre(0,0).set_val(0,0,1)
p.get_carre(0,0).set_val(1,0,4)
p.get_carre(0,0).set_val(0,1,3)
p.get_carre(0,0).set_val(1,1,2)
# initiliaser le carré à la position (1,0)
p.get_carre(1,0).set_val(0,0,3)
p.get_carre(1,0).set_val(1,0,2)
p.get_carre(1,0).set_val(0,1,4)
p.get_carre(1,0).set_val(1,1,1)
# initiliaser le carré à la position (0,1)
p.get_carre(0,1).set_val(0,0,4)
p.get_carre(0,1).set_val(1,0,1)
p.get_carre(0,1).set_val(0,1,2)
p.get_carre(0,1).set_val(1,1,3)
# initiliaser le carré à la position (1,1)
p.get_carre(1,1).set_val(0,0,2)
p.get_carre(1,1).set_val(1,0,3)
p.get_carre(1,1).set_val(0,1,1)
p.get_carre(1,1).set_val(1,1,4)
# imprimer le sudoku
print(p)
# carré (0,0) : [[1, 4], [3, 2]] carré (1,0) : [[3, 2], [4, 1]]
# carré (0,1) : [[4, 1], [2, 3]] carré (1,1) : [[2, 3], [1, 4]]
# ce qui correspond au sudoku suivant :
# 1 4 | 3 2
# 3 2 | 4 1
# ---------
# 4 1 | 2 3
# 2 3 | 1 4

Runner python

Il s'agit d'un runner Python libre que vous pouvez utilisez pour exécuter du code Python. Les résultats de vos print apparaîtront dans le feedback de retour. Il n'est pas nécessaire de répondre à cette question.