Exercice 3 Nouvelle Calédonie – Bac NSI 2025 – Jour 1
mots clés: représentation binaire des entiers positifs, programmation
🔎 Voir les exercices similaires ↓
Nouvelle Calédonie – Bac NSI 2025 – Jour 1 Énoncé de l'exercice 3
Cet exercice porte sur l’algorithmique, la représentation binaire des entiers positifs et la programmation en langage Python.
Partie A : Modélisation du problème
On s’intéresse à un jeu de calcul mental appelé Objectif somme. Le jeu se joue sur un plateau de 5x5 cases. Chaque case contient un chiffre non nul de 1 à 9. On dispose également de nombres cibles en ligne et en colonne. Le but est de trouver les cases du tableau à vider afin d’atteindre les cibles en ligne et en colonne :
sur chaque ligne, la somme des cases restantes doit valoir la cible de cette ligne ;
sur chaque colonne, la somme des cases restantes doit valoir la cible de cette colonne.
De plus, il faut conserver au moins un chiffre par ligne.
Par exemple, la figure suivante représente un plateau de jeu et une solution :

Les lignes du plateau seront nommées de L0 à L4 et les colonnes de C0 à C4.
Ainsi, dans l’exemple de la figure 1, la ligne L1 fait référence aux valeurs 8,6,3,5,1 du plateau et la colonne C3 fait référence aux valeurs 3,5,2,8,8 du plateau.
Dans la suite, on suppose que les cibles sont nécessairement des entiers entre 1 et 45.
Expliquer pourquoi on fait cette hypothèse.
Donner la plus petite valeur de cible que la ligne [6,4,5,8,2] peut atteindre. Donner aussi la plus grande valeur de cible que la ligne peut atteindre.
Dans la suite on appelle plateau une liste de 5 listes de 5 entiers. Chacune des listes de 5 entiers représente une ligne. Les entiers de ces listes sont compris entre 0 et 9, 0 représente une case vide. Pour représenter un jeu, un plateau doit être accompagné de deux listes de 5 entiers : la liste des cibles de lignes, la liste des cibles des colonnes.
Voici une représentation en langage Python de la figure 1 :
plateau_ex = [[7, 9, 2, 3, 2],
[8, 6, 3, 5, 1],
[7, 7, 3, 2, 7],
[6, 4, 5, 8, 2],
[8, 6, 8, 8, 4]]
ciblesLignes_ex = [13, 9, 12, 6, 4]
ciblesColonnes_ex = [15, 13, 5, 2, 9]
Écrire une fonction extraireLigne qui prend en paramètre un plateau et un indice i (i compris entre 0 et 4 inclus) et renvoie la ligne Li du plateau. Par exemple, la valeur de retour de l’appel extraireLigne(plateau, 0) est [7, 9, 2, 3, 2].
Écrire une fonction extraireColonne qui prend en paramètre un plateau et un indice i (compris entre 0 et 4 inclus) et renvoie la colonne Ci du plateau. Par exemple, la valeur de retour de l’appel extraireColonne(plateau, 1) est [9, 6, 7, 4, 6].
Partie B : Simplification du problème
Dans la figure 1, la solution comporte des cases vides. Ces cases correspondent aux chiffres que l’on a éliminés. En langage Python, on représentera ces cases vides par des zéros. Ainsi, pour éliminer du plateau un chiffre, il suffira de le remplacer par 0.
Donner la représentation en langage Python du plateau de la solution proposée.
On se propose d’utiliser deux règles pour éliminer simplement certains chiffres du plateau.
Règle 1 : on remarque que les chiffres d’une ligne ou d’une colonne donnée du plateau doivent être inférieurs ou égaux à la cible. Par exemple, pour la ligne L4 de la figure 1, la cible est 4, on peut alors éliminer tous les chiffres 8 et 6. En appliquant la règle 1, L4 devient alors [0, 0, 0, 0, 4].
Pour le jeu représenté à gauche sur la figure 1, donner en Python le plateau obtenu en appliquant la règle 1 à chaque ligne.
La fonction à compléter regle1 ci-dessous est une implémentation de la règle 1. Elle prend en paramètre plateau, ciblesLignes et ciblesColonnes décrivant un jeu comme expliqué plus haut, et elle modifie plateau en appliquant la règle 1 à chaque ligne et à chaque colonne.
def regle1(plateau, ciblesLignes, ciblesColonnes):
for i in range(5):
tab = extraireLigne(plateau, i)
cible = ...
for j in range(5):
if tab[j] > cible:
plateau[i][j] = 0
for j in range(5):
tab = extraireColonne(plateau, j)
cible = ...
for i in range(5):
if tab[i] > cible:
plateau[i][j] = 0
Recopier et compléter les lignes 4 et 10 pour compléter le code de la fonction regle1.
Règle 2 : S’il n’y a qu’un seul nombre impair dans une ligne ou une colonne dont la cible est paire, on peut éliminer ce nombre impair. Par exemple, pour la ligne L3 de la figure 1, la cible est 6 et il n’y a qu’un nombre impair : 5. On peut donc éliminer ce 5.
Écrire une fonction unImpair qui prend comme paramètre une liste d’entiers, et qui renvoie True si la liste ne contient qu’un seul entier impair et False sinon.
La fonction à compléter regle2 ci-dessous est une implémentation de la règle 2. Elle prend en paramètre plateau, ciblesLignes et ciblesColonnes décrivant un jeu comme expliqué plus haut, et elle modifie plateau en appliquant la règle 2 à chaque ligne et à chaque colonne.
Recopier et compléter les lignes 4, 5, 11 et 12 pour compléter le code de la fonction regle2 ci-dessous qui prend comme paramètre un plateau, une ciblesLignes et une ciblesColonnes et qui applique la règle 2.
def regle2(plateau, ciblesLignes, ciblesColonnes):
for i in range(5):
ligne = extraireLigne(plateau, i)
...
if ...:
for j in range(5):
if plateau[i][j] % 2 == 1:
plateau[i][j] = 0
for j in range(5):
colonne = extraireColonne(plateau, j)
...
if ...:
for i in range(5):
if plateau[i][j] % 2 == 1:
plateau[i][j] = 0
Ces règles permettent de simplifier le jeu mais pas de le résoudre dans tous les cas. Il est nécessaire d’utiliser d’autres méthodes.
Partie C : Problème sur une ligne et représentation binaire
Pour aider à la résolution du jeu Objectif somme, on cherche dans cette partie à résoudre le problème sur une ligne seulement. Il s’agit de trouver les nombres d’une liste de 5 entiers dont la somme est égale à un nombre cible.
Par exemple, une solution pour la liste [6, 4, 5, 8, 2] avec la cible 6 est de conserver le chiffre 6 uniquement. Une autre solution est de conserver le 4 et le 2. On représente la première solution (conserver le 6) par la liste [1, 0, 0, 0, 0]. Cela signifie que la solution choisie est uniquement le premier élément de la liste. La liste [1, 0, 0, 0, 0] est appelée un masque solution du problème. Le masque solution correspondant à la solution avec le 4 et le 2, est alors [0, 1, 0, 0, 1].
Expliquer pourquoi [1, 1, 0, 0, 1] est un masque solution pour la liste [1, 2, 3, 5, 2] et la cible 5. Donner tous les autres masques solutions.
Écrire une fonction somme qui prend comme paramètres une liste de 5 entiers et un masque (une liste de taille 5 de 0 et de 1) et qui renvoie la somme des chiffres du tableau correspondant au masque. Par exemple, somme([1, 5, 3, 4, 8], [0, 1, 1, 0, 1]) doit renvoyer 5 + 3 + 8 = 16.
On peut remarquer que les masques solutions correspondent à des nombres en écriture binaire. Par exemple, le masque [0, 1, 0, 0, 1] correspond à l’entier 9 car 0×16+1×8+0×4+0×2+1×1=9. Ainsi, on représente les masques possibles par des nombres en écriture binaire sur 5 bits.
Donner la représentation binaire sur 5 bits de l’entier 26 sous la forme d’une liste de taille 5.
Expliquer pourquoi on ne représente que les entiers compris entre 0 et 31 sur 5 bits.
Écrire une fonction dec2bin qui prend comme paramètre un entier compris entre 0 et 31 et qui renvoie sa représentation binaire sous la forme d’une liste de 5 bits. Par exemple la valeur de retour de l’appel dec2bin(9) est [0, 1, 0, 0, 1].
Pour résoudre le problème, on se propose de générer tous les masques possibles avec la fonction dec2bin et de tester si ce sont des masques solutions. On stockera alors tous ces masques solutions dans une liste. On pourra utiliser la méthode append appliquée à une liste. Cette méthode permet d’ajouter un élément en fin de liste. Par exemple, à l’issue du code suivant, la liste solutions est [1, 2] :
solutions = [] # liste vide
solutions.append(1)
solutions.append(2)
Écrire une fonction masques_solutions qui prend comme paramètres une liste de 5 entiers et une cible, et qui renvoie la liste de tous les masques solutions correspondant.
Partie D : Retour au jeu “Objectif Somme”
Finalement, on vérifie qu’un plateau proposé comme solution respecte bien les contraintes sur les lignes et les colonnes.
Écrire une fonction teste_solution qui prend comme paramètres un plateau, la liste des cibles des lignes, la liste des cibles des colonnes, et qui retourne True si les valeurs des cases restantes du plateau vérifient bien les cibles (sur chaque ligne et sur chaque colonne), et False sinon.
Nouvelle Calédonie – Bac NSI 2025 – Jour 1 Correction de l'exercice 3
Partie A – Modélisation du problème
1. Cibles entre 1 et 45
Il faut garder au moins un chiffre par ligne, et chaque chiffre vaut au moins 1 : une cible vaut donc au moins 1.
Une ligne contient au plus 5 chiffres, chacun au plus égal à 9 : une cible vaut donc au plus 5 × 9 = 45.
2. Cibles possibles pour la ligne [6, 4, 5, 8, 2]
La plus petite cible est obtenue en ne gardant que le plus petit chiffre : 2.
La plus grande est obtenue en gardant tous les chiffres : 6 + 4 + 5 + 8 + 2 = 25.
3. Fonction extraireLigne
def extraireLigne(plateau, i):
return plateau[i]
4. Fonction extraireColonne
def extraireColonne(plateau, i):
colonne = []
for ligne in plateau:
colonne.append(ligne[i])
return colonne
Partie B – Simplification du problème
5. Plateau de la solution
plateau_solution = [[0, 9, 2, 0, 2],
[8, 0, 0, 0, 1],
[7, 0, 3, 2, 0],
[0, 4, 0, 0, 2],
[0, 0, 0, 0, 4]]
6. Règle 1 appliquée à chaque ligne
Seules les lignes L3 (cible 6 : on élimine le 8) et L4 (cible 4 : on élimine les 8 et les 6) sont modifiées :
[[7, 9, 2, 3, 2],
[8, 6, 3, 5, 1],
[7, 7, 3, 2, 7],
[6, 4, 5, 0, 2],
[0, 0, 0, 0, 4]]
7. Fonction regle1 (lignes 4 et 10)
def regle1(plateau, ciblesLignes, ciblesColonnes):
for i in range(5):
tab = extraireLigne(plateau, i)
cible = ciblesLignes[i] # ligne 4
for j in range(5):
if tab[j] > cible:
plateau[i][j] = 0
for j in range(5):
tab = extraireColonne(plateau, j)
cible = ciblesColonnes[j] # ligne 10
for i in range(5):
if tab[i] > cible:
plateau[i][j] = 0
8. Fonction unImpair
def unImpair(liste):
compteur = 0
for x in liste:
if x % 2 == 1:
compteur = compteur + 1
return compteur == 1
9. Fonction regle2 (lignes 4, 5, 11 et 12)
def regle2(plateau, ciblesLignes, ciblesColonnes):
for i in range(5):
ligne = extraireLigne(plateau, i)
cible = ciblesLignes[i] # ligne 4
if cible % 2 == 0 and unImpair(ligne): # ligne 5
for j in range(5):
if plateau[i][j] % 2 == 1:
plateau[i][j] = 0
for j in range(5):
colonne = extraireColonne(plateau, j)
cible = ciblesColonnes[j] # ligne 11
if cible % 2 == 0 and unImpair(colonne): # ligne 12
for i in range(5):
if plateau[i][j] % 2 == 1:
plateau[i][j] = 0
Partie C – Problème sur une ligne et représentation binaire
10. Masques solutions pour [1, 2, 3, 5, 2] et la cible 5
Le masque [1, 1, 0, 0, 1] garde le 1er, le 2e et le 5e élément : 1 + 2 + 2 = 5, c’est bien la cible.
Les autres masques solutions sont :
| masque | nombres gardés | somme |
|---|---|---|
| [0, 1, 1, 0, 0] | 2 + 3 | 5 |
| [0, 0, 1, 0, 1] | 3 + 2 | 5 |
| [0, 0, 0, 1, 0] | 5 | 5 |
11. Fonction somme
def somme(liste, masque):
total = 0
for i in range(5):
if masque[i] == 1:
total = total + liste[i]
return total
12. Écriture binaire de 26
26 = 16 + 8 + 2 = 1×16 + 1×8 + 0×4 + 1×2 + 0×1 : la représentation est [1, 1, 0, 1, 0].
13. Entiers de 0 à 31
Avec 5 bits, on a 2⁵ = 32 combinaisons : le plus petit entier est 00000 = 0 et le plus grand 11111 = 16 + 8 + 4 + 2 + 1 = 31.
14. Fonction dec2bin
def dec2bin(n):
bits = []
for i in range(5):
bits.insert(0, n % 2)
n = n // 2
return bits
15. Fonction masques_solutions
def masques_solutions(liste, cible):
solutions = []
for n in range(32):
masque = dec2bin(n)
if somme(liste, masque) == cible:
solutions.append(masque)
return solutions
Partie D – Retour au jeu « Objectif somme »
16. Fonction teste_solution
def teste_solution(plateau, ciblesLignes, ciblesColonnes):
for i in range(5):
if somme(extraireLigne(plateau, i), [1, 1, 1, 1, 1]) != ciblesLignes[i]:
return False
for j in range(5):
if somme(extraireColonne(plateau, j), [1, 1, 1, 1, 1]) != ciblesColonnes[j]:
return False
return True
Une erreur, un oubli ? Écrivez-moi : frederic.peuriere@lfcl.pt
🔎 Exercices sur des thèmes similaires
-
Nouvelle Caldédonie 2023 – jour 2 – exercice 2
programmation Python, récursivité — Difficulté : 🔥🔥🔥🔥🔥 -
Polynésie 2025 – jour 2 – exercice 2
programmation, POO, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Asie 2024 – jour 2 – exercice 2
programmation, POO, structures de données linéaires — Difficulté : 🔥🔥🔥🔥🔥 -
Asie 2024 – jour 2 – exercice 1
programmation, méthode diviser pour régner — Difficulté : 🔥🔥🔥🔥🔥 -
Asie 2024 – jour 1 – exercice 3
programmation, POO, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Métropole 2025 – jour 1 – exercice 3
réseau, routage, arbres binaires de recherche, programmation — Difficulté : 🔥🔥🔥🔥🔥