Maths & NSI

Baccalauréat — Épreuve pratique — 2026 — NSI

Épreuve pratique NSI 2026 — Sujet 06 : carte de smoothies

Sujet

Épreuve pratique de NSI, session 2026 — sujet n°06 de la banque nationale. Durée : 1 heure, sur ordinateur. Le candidat dispose de l'énoncé et de fichiers de code et de données ; il agit en autonomie et, aux « appels professeur » indiqués, présente son travail à l'examinateur ou le sollicite en cas de difficulté.

Carte de smoothies

Dans le but de proposer une alternative aux sodas et d'encourager la consommation de fruits, la maison des lycéens (MDL) d'un lycée souhaite proposer des recettes de smoothies. Les fruits ne sont pas toujours tous disponibles et, par conséquent, les recettes ne sont pas toujours toutes possibles. Pour proposer une carte dynamique, l'équipe de la MDL fait appel aux élèves de NSI pour proposer une solution sous la forme d'un programme Python.

Chaque recette est composée de trois fruits comme précisé dans le tableau suivant :

RecetteFruits
TropicalMangue, Ananas, Banane
RougeFraise, Framboise, Cerise
VertKiwi, Pomme verte, Menthe
AgrumeOrange, Citron, Pamplemousse
ExotiquePapaye, Fruit de la passion, Noix de coco
Tropical citronMangue, Ananas, Citron
Rouge kiwiFraise, Framboise, Kiwi
Exotique rougePapaye, Fraise, Fruit de la passion
Vert citronKiwi, Pomme verte, Citron
Soleil couchantMangue, Fraise, Pamplemousse

La classe Boutique_smoothie permet de créer des boutiques avec la liste des fruits du jour disponibles. Elle permet d'afficher les recettes possibles et les alternatives aux recettes qui ne peuvent pas être réalisées.

Une alternative est un smoothie réalisable qui partage un maximum de fruits communs avec le smoothie d'origine. Par exemple, la recette Tropical citron est une alternative à la recette Tropical s'il n'y a pas de banane parmi les fruits disponibles.

Première partie

On souhaite connaître les smoothies réalisables avec les fruits disponibles. La liste des fruits disponibles est initialisée lors de la création de l'objet Boutique_smoothie. Une recette est possible si tous ses ingrédients sont disponibles.

Exemple :

>>> b = Boutique_smoothie(["Mangue", "Pamplemousse", "Ananas", "Banane"])
>>> b.smoothie_possible("Tropical")
True
>>> b.smoothie_possible("Soleil couchant")
False

Question 1. Écrire en Python une fonction nommée smoothie_possible qui prend en paramètre une chaîne de caractères représentant le nom d'un smoothie et qui renvoie un booléen qui indique s'il est possible de réaliser ce smoothie.

Question 2. Écrire en Python une fonction nommée liste_smoothies_possibles qui ne prend pas de paramètre et qui renvoie la liste des recettes possibles.

Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

Seconde partie

Les alternatives permettent de proposer à un utilisateur qui souhaiterait un smoothie non disponible des smoothies de compositions proches. Une fonction score_proximité permet de renvoyer le score de proximité entre deux smoothies. Ce score est calculé en comptant le nombre de fruits communs.

Question 3. Pour tester la fonction score_proximité, compléter la fonction test_score_proximité avec des tests pertinents.

La fonction plus_proche_possible renvoie le nom correspondant au smoothie possible le plus proche du smoothie passé en paramètre.

Question 4. Observer avec la fonction test_plus_proche_possible que le smoothie renvoyé n'est pas le bon. Identifier le problème dans la fonction plus_proche_possible. Proposer une démarche de résolution et la mettre en œuvre.

Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

Question 5. Créer une boutique avec les ingrédients suivants : Mangue, Ananas, Banane, Fraise, Citron, Kiwi et Pomme verte et afficher les smoothies réalisables.

Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.

Fichier fourni : smoothie.py

class Boutique_smoothie:
    def __init__(self, liste_fruits_disponibles):
        self.liste_fruits_disponibles = liste_fruits_disponibles
        self.db_smoothies = {
            "Tropical": ["Mangue", "Ananas", "Banane"],
            "Rouge": ["Fraise", "Framboise", "Cerise"],
            "Vert": ["Kiwi", "Pomme verte", "Menthe"],
            "Agrume": ["Orange", "Citron", "Pamplemousse"],
            "Exotique": ["Papaye", "Fruit de la passion", "Noix de coco"],
            "Tropical citron": ["Mangue", "Ananas", "Citron"],
            "Rouge kiwi": ["Fraise", "Framboise", "Kiwi"],
            "Exotique rouge": ["Papaye", "Fraise", "Fruit de la passion"],
            "Vert citron": ["Kiwi", "Pomme verte", "Citron"],
            "Soleil couchant": ["Mangue", "Fraise", "Pamplemousse"]
        }
 
    ##### QUESTION 1 #####
    def smoothie_possible(self, nom_smoothie):
        """Retourne True si le smoothie peut être préparé avec les fruits disponibles, False sinon."""
        pass  # à remplacer par le code la méthode
 
    ##### QUESTION 2 #####
    def liste_smoothies_possibles(self):
        """Retourne la liste des smoothies pouvant être préparés avec les fruits disponibles."""
        pass  # à remplacer par le code la méthode
 
    def score_proximité(self, nom1, nom2):
        """Retourne le nombre de fruits communs entre deux smoothies."""
        nb = 0
        fruits1 = self.db_smoothies[nom1]
        fruits2 = self.db_smoothies[nom2]
        for fruit in fruits1:
            if fruit in fruits2:
                nb += 1
        return nb
 
    # Question 4
    def plus_proche_possible(self, nom_smoothie_ref):
        """Retourne le nom du smoothie le plus proche de nom_smoothie_ref en termes de fruits communs parmi les smoothies possibles.
        En cas d'égalité, retourne le premier trouvé.
        """
        max_communs = 0
        smoothie_proche = None
        for nom_smoothie in self.db_smoothies:
            nb_communs = self.score_proximité(nom_smoothie_ref, nom_smoothie)
            if nb_communs > max_communs:
                max_communs = nb_communs
                smoothie_proche = nom_smoothie
        return smoothie_proche
 
    def affichage_possibles(self):
        """Affiche les smoothies possibles."""
        smoothies = self.liste_smoothies_possibles()
        print("Smoothies possibles avec les fruits disponibles :")
        for smoothie in smoothies:
            print(smoothie)
        print("Alternative aux autres smoothies :")
        for smoothie in self.db_smoothies:
            if smoothie not in smoothies:
                proche = self.plus_proche_possible(smoothie)
                if proche != None:
                    print(f"Pour le smoothie {smoothie}, essayez {proche}.")
                else:
                    print(
                        f"Pour le smoothie {smoothie}, aucun smoothie proche disponible.")
 
# ========= Fonctions de test ==================
 
 
def test_smoothie_possible():
    boutique = Boutique_smoothie(
        ["Mangue", "Ananas", "Banane", "Fraise", "Citron"])
    assert boutique.smoothie_possible("Tropical") == True
    assert boutique.smoothie_possible("Rouge") == False
 
 
def test_liste_smoothies_possibles():
    boutique1 = Boutique_smoothie(
        ["Mangue", "Ananas", "Banane", "Fraise", "Citron"])
    boutique2 = Boutique_smoothie(
        ["Fraise", "Framboise", "Cerise", "Kiwi", "Orange", "Citron", "Pamplemousse"])
    boutique3 = Boutique_smoothie(["Orange", "Mangue", "Papaye"])
    assert boutique1.liste_smoothies_possibles() == [
        "Tropical", "Tropical citron"]
    assert boutique2.liste_smoothies_possibles() == [
        "Rouge", "Agrume", "Rouge kiwi"]
    assert boutique3.liste_smoothies_possibles() == []
 
 
##### QUESTION 3 #####
 
def test_score_proximité():
    # À compléter
    pass
 
 
def test_plus_proche_possible():
    boutique = Boutique_smoothie(
        ["Mangue", "Ananas", "Banane", "Fraise", "Citron", "Kiwi", "Pomme verte"])
    smoothie_proche = boutique.plus_proche_possible("Tropical")
    assert smoothie_proche == "Tropical citron"
 
    smoothie_proche2 = boutique.plus_proche_possible("Exotique")
    assert smoothie_proche2 == None
 
 
# ======== Lancement des tests ========
 
test_smoothie_possible()
test_liste_smoothies_possibles()
test_plus_proche_possible()
 
# Question 5

Corrigé

Corrigé réservé aux abonnés Premium.

Créez un compte gratuit : votre première correction est offerte.

Sujet officiel de la banque nationale de sujets 2026 de l'épreuve pratique de NSI (ministère de l'Éducation nationale, sujets.examens-concours.gouv.fr). Corrigé rédigé pour ce site.