Aller au contenu

Épreuve Pratique BNS 2026⚓︎

Vous pouvez retrouver ici les 3 sujets 0 publiés le 08/10/2025.

Sujet 1

Correction Q1
<span style="color:black">🐍 Script Python</span>
def est_bissextile(n):
    if n % 400 == 0:
        return True
    elif n % 4 == 0 and n % 100 != 0:
        return True
    else:
        return False
Correction Q2
<span style="color:black">🐍 Script Python</span>
def determiner_phase(n):
    assert n <= 28 and n >= 1
    if n <= 5:
        return 1
    elif n <= 13:
        return 2
    elif n == 14:
        return 3
    else:
        return 4
Correction Q3
<span style="color:black">🐍 Script Python</span>
def test_ajouter_jours():
    assert ajouter_jours((7, 9, 2025), 3) == (10, 9, 2025)

    assert ajouter_jours((29, 8, 2025), 3) == (1, 9, 2025)
    #pour tester le changement de mois sur un mois à 31 jours

    assert ajouter_jours((29, 9, 2025), 3) == (2, 10, 2025)
    #pour tester le changement de mois sur un mois à 30 jours

    assert ajouter_jours((31, 12, 2025), 1) == (1, 1, 2026)
    #pour tester un changement d'année

    assert ajouter_jours((28, 2, 2024), 3) == (2, 3, 2024)
    #pour tester le changement de mois sur une année bissextile

    assert ajouter_jours((28, 2, 2025), 3) == (3, 3, 2025)
    #pour tester le changement de mois sur une année non-bissextile
Correction Q4

L'erreur qui apparait

<span style="color:black">🐍 Script Python</span>
 datetime(
ValueError: month must be in 1..12
semble nous indiquer que la date n'est pas au bon format.

En effet la documentation de iCalendar nous dit que la date doit être écrite au format AAAAMMJJ.

Or, la ligne de code

<span style="color:black">🐍 Script Python</span>
date = str(annee)+str(mois) +str(jour)
va produire 202535 pour le 05 mars 2025, au lieu de 20250305.

Pour résoudre ce problème, il faut remplacer cette ligne par :

<span style="color:black">🐍 Script Python</span>
date = str(annee)+'{:02d}'.format(mois) + '{:02d}'.format(jour)

Remarque : le formatage des chaînes de caractères n'est pas au programme...

Sujet 2

Correction Q1
<span style="color:black">🐍 Script Python</span>
def salaire_moyen_condition(employes, champ, valeur):
    '''Renvoie le salaire moyen des employes ayant val comme valeur associée
    au champ donné en argument.
    Si le nombre d'employés considéré est nul, cette fonction renvoie None'''
    s = 0
    n = 0
    for employe in employes:
        if employe[champ] == valeur:
            s += employe['salaire']
            n += 1
    if n == 0:
        return None
    return s/n
Correction Q2
<span style="color:black">🐍 Script Python</span>
def effectif_par_sexe(employes):
    nf, nh = 0, 0
    for employe in employes:
        if employe['sexe'] == 'F':
            nf += 1
        else:
            nh += 1
    return {'F':nf, 'M':nh}
Correction Q3
  • Le calcul de moy_f va renvoyer une erreur car employes est mis entre guillements.
  • De plus, le calcul final est faux puisqu'il fait simplement la différence entre moy_h et moy_f.
<span style="color:black">🐍 Script Python</span>
def calcul_ecart_sexe(employes):
    '''Renvoie l'écart de salaire en pourcentage pour les femmes 
    par rapport aux hommes'''
    if effectif_par_sexe(employes)['F'] == 0 or effectif_par_sexe(employes)['M'] == 0:
        return None
    moy_h = salaire_moyen_condition(employes, 'sexe', 'M')
    moy_f = salaire_moyen_condition(employes, 'sexe', 'F')
    return (moy_h - moy_f) / moy_h * 100

def test_calcul_ecart_sexe():
    assert calcul_ecart_sexe([{'experience': 5, 'etudes': 3, 'sexe': 'F', 'salaire': 2400}]) == None
    assert calcul_ecart_sexe(donnees.employes) >= 0 and calcul_ecart_sexe(donnees.employes) <= 100

Sujet 3

Correction Q1

Si la liste originale est [3, 5, 0, 6], la liste obtenue par codage RLE est [1, 3, 1, 5, 1, 0, 1, 6], qui est 2 fois plus longue. Donc non, la liste obtenue par codage RLE n'est pas forcément de longueur inférieure ou égale.

Correction Q2
<span style="color:black">🐍 Script Python</span>
def decodage_rle(liste_rle):
    '''Renvoie la liste d'octets obtenue à partir de la liste liste_rle obtenue
    par compression RLE'''
    lst = []
    for i in range(0, len(liste_rle), 2):
        for k in range(liste_rle[i]):
            lst.append(liste_rle[i+1])
    return lst
Correction Q3

On constate que, si tout se passe bien pour l'image bac_nsi_32.png, l'image bac_nsi_256.png.dec.png obtenue après encodage/décodage de l'image bac_nsi_256.png présente un décalage de l'écriture.

Correction Q4

Il faut modifier la fonction codage_rle pour faire en sorte qu'elle prenne en compte les valeurs dont le nombre dépasse 255. Il suffit de faire plusieurs «paquets» de 255 de cette valeur.

<span style="color:black">🐍 Script Python</span>
def codage_rle(liste_octets):
    '''Renvoie une liste d'octets obtenue par compression RLE'''
    liste_rle = []
    i = 0
    while i < len(liste_octets):
        c = liste_octets[i]
        k = 1
        while i+k < len(liste_octets) and liste_octets[i+k] == c:
            k += 1
        q = k // 255
        r = k % 255
        for _ in range(q):
            liste_rle.append(255)
            liste_rle.append(c)
        if r != 0:
            liste_rle.append(r)
            liste_rle.append(c)
        i += k
    return liste_rle

Vous pouvez retrouver ici les 20 autres sujets publiés le 26/03/2026.

sujet 6

sujet 21