Écrire une fonction a_doublon qui prend en paramètre une liste triée de nombres et
renvoie True si la liste contient au moins deux nombres identiques, False sinon.
On souhaite générer des grilles du jeu de démineur à partir de la position des bombes à placer.
On se limite à la génération de grilles carrées de taille \(n \times n\) où \(n\) est le nombre de bombes du jeu.
Dans le jeu du démineur, chaque case de la grille contient soit une bombe, soit une valeur qui correspond aux nombres de bombes situées dans le voisinage direct de la case (au-
dessus, en dessous, à droite, à gauche ou en diagonale : chaque case a donc 8 voisins si elle n'est pas située au bord de la grille).
Voici un exemple de grille \(5 \times 5\) de démineur dans laquelle la bombe est représentée par une étoile :
On utilise une liste de listes pour représenter la grille et on choisit de coder une bombe par la valeur -1.
defvoisinage(n,ligne,colonne):""" Renvoie la liste des coordonnées des voisins de la case (ligne, colonne) en gérant les cases sur les bords. """voisins=[]forlinrange(max(0,ligne-1),min(n,ligne+2)):forcinrange(max(0,colonne-1),min(n,colonne+2)):if(l,c)!=(ligne,colonne):voisins.append((l,c))returnvoisinsdefincremente_voisins(grille,ligne,colonne):""" Incrémente de 1 toutes les cases voisines d'une bombe."""voisins=...forl,cinvoisins:ifgrille[l][c]!=...:# si ce n'est pas une bombe ...# on ajoute 1 à sa valeur defgenere_grille(bombes):""" Renvoie une grille de démineur de taille nxn où n est le nombre de bombes, en plaçant les bombes à l'aide de la liste bombes de coordonnées (tuples) passée en paramètre. """n=len(bombes)# Initialisation d'une grille nxn remplie de 0grille=[[0forcolonneinrange(n)]forligneinrange(n)]# Place les bombes et calcule les valeurs des autres casesforligne,colonneinbombes:grille[ligne][colonne]=...# place la bombe ...# incrémente ses voisins returngrille
Compléter le code suivant afin de générer des grilles de démineur, on pourra vérifier que l’instruction genere_grille([(1, 1), (2, 4), (3, 1), (3, 3), (4, 4)]) produit bien la liste donnée en exemple.
Réponse
Complétez le code ci-dessous
###
def voisinage(n, ligne, colonne):bksl-nl """ Renvoie la liste des coordonnées des voisins de la casebksl-nl (ligne, colonne) en gérant les cases sur les bords. """bksl-nl voisins = []bksl-nl for l in range(max(0,ligne-1), min(n, ligne+2)):bksl-nl for c in range(max(0, colonne-1), min(n, colonne+2)):bksl-nl if (l, c) != (ligne, colonne):bksl-nl voisins.append((l,c))bksl-nl return voisinsbksl-nlbksl-nlbksl-nldef incrementepy-undvoisins(grille, ligne, colonne):bksl-nl """ Incrémente de 1 toutes les cases voisines d'une bombe."""bksl-nl voisins = ...bksl-nl for l, c in voisins:bksl-nl if grille[l][c] != ...: # si ce n'est pas une bombebksl-nl ... # on ajoute 1 à sa valeurbksl-nlbksl-nlbksl-nlbksl-nldef generepy-undgrille(bombes):bksl-nl """ Renvoie une grille de démineur de taille nxn où n estbksl-nl le nombre de bombes, en plaçant les bombes à l'aide debksl-nl la liste bombes de coordonnées (tuples) passée enbksl-nl paramètre. """bksl-nl n = len(bombes)bksl-nl # Initialisation d'une grille nxn remplie de 0bksl-nl grille = [[0 for colonne in range(n)] for ligne in range(n)]bksl-nl # Place les bombes et calcule les valeurs des autres casesbksl-nl for ligne, colonne in bombes:bksl-nl grille[ligne][colonne] = ... # place la bombebksl-nl ... # incrémente ses voisinsbksl-nlbksl-nl return grillebksl-nlbksl-nlSolution
###
def voisinage(n, ligne, colonne):bksl-nl """ Renvoie la liste des coordonnées des voisins de la casebksl-nl (ligne, colonne) en gérant les cases sur les bords. """bksl-nl voisins = []bksl-nl for l in range(max(0,ligne-1), min(n, ligne+2)):bksl-nl for c in range(max(0, colonne-1), min(n, colonne+2)):bksl-nl if (l, c) != (ligne, colonne):bksl-nl voisins.append((l,c))bksl-nl return voisinsbksl-nlbksl-nldef incrementepy-undvoisins(grille, ligne, colonne):bksl-nl """ Incrémente de 1 toutes les cases voisines d'une bombe."""bksl-nl voisins = voisinage(len(grille), ligne, colonne)bksl-nl for l, c in voisins:bksl-nl if grille[l][c] != -1: # si ce n'est pas une bombebksl-nl grille[l][c] += 1 # on ajoute 1 à sa valeurbksl-nlbksl-nlbksl-nldef generepy-undgrille(bombes):bksl-nl """ Renvoie une grille de démineur de taille nxn où n estbksl-nl le nombre de bombes, en plaçant les bombes à l'aide debksl-nl la liste bombes de coordonnées (tuples) passée enbksl-nl paramètre. """bksl-nl n = len(bombes)bksl-nl # Initialisation d'une grille nxn remplie de 0bksl-nl grille = [[0 for colonne in range(n)] for ligne in range(n)]bksl-nl # Place les bombes et calcule les valeurs des autres casesbksl-nl for ligne, colonne in bombes:bksl-nl grille[ligne][colonne] = -1 # place la bombebksl-nl incrementepy-undvoisins(grille, ligne, colonne) # incrémente ses voisinsbksl-nlbksl-nl return grillebksl-nlbksl-nltry:bksl-nl assert generepy-undgrille([(1, 1), (2, 4), (3, 1), (3, 3), (4, 4)]) == [[1, 1, 1, 0, 0],bksl-nl [1, -1, 1, 1, 1],bksl-nl [2, 2, 3, 2, -1],bksl-nl [1, -1, 2, -1, 3],bksl-nl [1, 1, 2, 2, -1]]bksl-nl print('Tout semble correct 👍')bksl-nlbksl-nlexcept AssertionError as asser:bksl-nl print('Le résultat de votre fonction n\'est pas conforme 🤔')bksl-nl