NSI Sujets 01-10

Identification

Infoforall

Sujets 01-10 de l'épreuve pratique


La NSI comporte deux épreuves en Terminale :

  1. Une épreuve théorique de 3h30 sur table notée sur 12 et comportant un choix de 5 exercices. Après lecture rapide des exercices (30 minutes au maximum), il vous restera 3h pour en réaliser 3, soit environ 1h par exercice. Chaque exercice est noté sur 4.
  2. Une épreuve pratique de 1h et notée sur 8 pendant laquelle vous aurez à programmer et à interagir avec l'examinateur. Il s'agit donc autant d'une épreuve de programmation qu'un oral. Les sujets sont connus à l'avance mais vous tirez le votre au sort juste avant l'épreuve. Chaque sujet comporte deux exercices :
    1. Un exercice de création pure où on vous demande de réaliser une fonction à partir des spécifications fournies (4 points)
    2. Un exercice guidé (4 points)

A l'heure actuelle, la banque de sujets comporte 30 sujets.

1 - Sujet 01

A - Thèmes

  • Tableaux statiques (implémentés via le type list de Python)
  • Tuples
  • Assertions

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 01 version locale

C - Remarques sur le sujet

Pensez bien à lire l'exercice 2 jusqu'au bout : il faut aussi vérifier les préconditions de la fonction distance() avec des assertions.

  • Version 2021 : la dernière assertion est à modifier en remplaçant l'envoi d'un point-tableau par un point-tuple.
  • assert plus_courte_distance([(7, 9), (2, 5), (5, 2)], (0, 0)) == (2, 5), "erreur"

  • Version 2021 : Lire plutôt : Recopier sous Python (sans la documentation).

D - De l'aide ?

Pas de difficulté particulière. Il faut juste bien voir le mot en gras... On doit donc lire le tableau jusqu'au bout.


Il faut juste faire attention au type des paramètres pour bien comprendre ce que contiennent les paramètres point1 et point2.

A partir de là, il faut vous demander comment récupérer la coordonnée x à partir de la variable point1.


On retrouve en réalité la recherche d'un minimum dans un tableau non vide.

  • On commence par dire que le minimum correspond à la première case
  • On lit le contenu de toutes les autres cases et on remplace le minimum calculé et la réponse à renvoyer à chaque fois qu'on trouve une valeur plus petite que le minimum actuel.

E - Correction

Eviter de la regarder avant d'avoir fini... : exo1 et exo2

2 - Sujet 02

A - Thèmes

  • Tableaux statiques (implémentés via le type list de Python)

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 02 version locale

C - Remarques sur le sujet

Version 2021 : attention, l'exercice 1 vous demande de faire une fonction un peu bizarre puisqu'elle renvoie soit un flottant (la moyenne), soit un string si le tableau est vide.

Version 2021 : attention, l'exercice 2 demande bien de renvoyer la référence de la liste qu'on a modifié par effet de bord. C'est un peu bizarre, mais c'est comme ça.

D - De l'aide ?

Pas de difficulté particulière. Il suffit de se souvenir comment tester qu'un tableau est vide et qu'il faut créer une variable de stockage de la somme des valeurs avant de la remplir dans la boucle.


Le tableau non trié est délimité par son indice gauche noté i dans l'énoncé et son indice droite noté j dans l'énoncé.

Il faut comprendre comment fonctionne la fonction :

  • On commence par la gauche
  • Si l'élément en cours est un 0 : on le laisse en place et on passe à l'élément suivant, en incrémentant la variable i pour réduire le tableau non trié par la gauche.
  • Si l'élément en cours est un 1 : on intervertit la case i et j et on décrémente la variable j pour réduire le tableau non trié par la droite
  • On boucle sur la case référencée par i.

E - Correction

Eviter de la regarder avant d'avoir fini... : exo1 et exo2

3 - Sujet 03

A - Thèmes

  • Récursivité si on veut (pour l'exercice 1)
  • Tableaux statiques (implémentés via le type list de Python)
  • Dichotomie

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 03 version locale

C - Remarques sur le sujet

Rien de particulier. On parle de dichotomie, donc il faut se souvenir ce que c'est...

D - De l'aide ?

Pas si facile que cela.

Commencer peut-être par faire uniquement la fonction si les deux nombres sont positifs. 8*5 doit être calculé comme 8+8+8+8+8 ou 5+5+5+5+5+5+5+5. Si vous vous souvenez du cours sur la récursivité, on peut le faire aussi en ... récursif.

Et ensuite on complique.


Pour le coup, à part vous dire d'aller revoir cette leçon de 1er...

En gros, on cherche le point central de l'intervalle.

Si ce point central contient plus que ce qu'on cherche, on peut supprimer la partie droite. On décale donc l'extrémité droite sur la case à gauche de la case centrale.

Si ce point central contient moins que ce qu'on cherche, on peut supprimer la partie gauche. On décale donc l'extrémité gauche sur la case à droite de la case centrale.

E - Correction

Eviter de la regarder avant d'avoir fini... : exo1 et exo2

4 - Sujet 04

A - Thèmes

  • Tableaux statiques (implémentés via le type list de Python)
  • Dichotomie
  • Tuples

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 04 version locale

C - Remarques sur le sujet

Attention, il faut bien comprendre que la fonction dichotomie() ne renvoie pas nécessairement un booléen mais parfois un tuple contenant un booléen et un entier. Pour être plus explicite, on aurait pu mettre des parenthèses cette fois justement. Le return n'est pas une fonction mais puisqu'il renvoit un tuple, nous aurions pu marquer return (False,1).

Il aurait peut-être fallu donner le prototype de la fonction dichotomie() soit cette forme théorique :

1
def dichotomie(tab:list, x:int) -> bool|tuple:

Il n'en reste pas moins que c'est étrange de créer une fonction qui peut renvoyer des réponses de types différents. On peut éventuellement s'accorder sur une réponse ou None si on ne trouve rien par exemple. Mais la création de fonctions ayant des réponses de types différents en fonction des cas doit rester exeptionnelle. Si vous voulez aller plus loin que le sujet, on pourrait rajouter une question : comment modifier la réponse même en cas de recherche positive pour renvoyer un tuple (autrement dit que pourrait-on renvoyer en plus du simple booléen ?)

D - De l'aide ?

Pas de difficulté particulière. Il faut juste penser à créer au préalable une variable pour stocker la somme des valeurs qu'on va lire.


Faites attention à la particularité de cette fonction qui renvoit soit True soit False associé à un code d'erreur.

Sinon, on retrouve le principe de la dichotomie : on divise à chaque fois le tableau restant en deux en ne continuant à chercher qu'à droite ou à gauche. Cela veut dire qu'il faudra modifier les variables debut et fin qui délimitent le sous-tableau dans lequel on peut encore faire des recherches.

E - Correction

Eviter de la regarder avant d'avoir fini... : exo1 et exo2

5 - Sujet 05

A - Thèmes

  • Tableaux statiques (implémentés via le type list de Python)
  • Entiers non signés en binaire
  • Tri par insertion

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 05 version locale

C - Remarques sur le sujet

Attention : le sujet utilise des noms de variables en une lettre en utilisant alors une majuscule. C'est une convention utilisée parfois, surtout dans le domaine des mathématiques. Donc, attention, T et L sont bien juste des tableaux et pas des classes.

Attention 2 : la fonction de tri renvoie le tableau qu'on lui a envoyé alors qu'il a été modifié en place... C'est contraire à ce qu'on a appris mais il s'agit certainement de juste visualiser le tableau sans avoir à l'évaluer dans la console. Mais normalement, la fonction devrait soit

  • modifier en place et ne rien renvoyer ou
  • faire une copie du tableau, modifier la copie et renvoyer la copie

D - De l'aide ?

Pas de difficulté particulière. Puisqu'on va devoir lire toutes les cases jusqu'au bout, une boucle bornée sera plus "logique" qu'une boucle non bornée. Le tout est de penser à créer une variable de stockage de la réponse avant de commencer les tours de boucle. La seule difficulté consiste à parvenir à placer les indices dans le bon sens : la case d'indice 0 est celle du bit de poids fort.


Le plus simple est encore de vous créer une liste sur votre brouillon et voir comment on doit la trier. C'est du cours en réalité. L'algorithme du sujet est le même que celui que nous avons vu en première, à part qu'il n'utilise pas les mêmes conditions d'arrêt ect... A vous de réflechir.

E - Correction

Eviter de la regarder avant d'avoir fini... : exo1 et exo2

6 - Sujet 06

Contient de parties de cours non encore traitées.

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 06 version locale

7 - Sujet 07

Contient de parties de cours non encore traitées.

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 07 version locale

8 - Sujet 08

A - Thèmes

  • String
  • Tableaux dynamiques (implémentés via le type list de Python), notamment l'utilisation de append().
  • Récursivité
  • Algorithme glouton (ou méthode gloutonne)
  • Rendu de monnaie (un "classique")

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 08 version locale

C - Remarques sur le sujet

Attention EXO 2: le texte du sujet utilise la variable pieces mais sur la première ligne du programme fourni, on trouve Pieces : la majuscule a certainement été provoquée par un éditeur de texte jugeant qu'un début de texte doit commencer par une majuscule. Pensez à remettre une minuscule.

Attention BIS EXO 2: le sujet comporte par contre une coquille. La méthode append modifie un tableau dynamique sur place mais ne renvoie rien. Il faut donc apporter cette modification :

1 2
# INSTRUCTION DANS LE PROGRAMME version 2021 return rendu_glouton(arendre - p, solution.append(...),i)

Les lignes pour remplacer la précédente :

1 2 3
# MODIFICATION PROPOSEE solution.append(...) # on modifie solution en place return rendu_glouton(arendre - p, solution, i) # on renvoie juste l'adresse de solution

D - De l'aide ?

Vraiment aucune difficulté particulière : il suffit de se souvenir qu'un string est itérable, comme un tableau.

On peut donc utiliser la fonction native len et la notation crochets+indice pour obtenir un caractère particulier dans le string.


On rappelle que la méthode gloutonne consiste à faire un choix optimal localement de façon à réduire la taille du problème total.

Ici le choix est de toujours rendre la pièce de plus grande valeur d'abord.

Si on doit rendre 60 cents avec des pièces de 50 cents, 20 cents et 10 cents, on choisit donc localemnet de rendre 50 cents.

On a donc réduit la taille du problème puisqu'il ne reste que 10 cents à rendre. Comment faire ? En faisant un choix encore local : on rend la plus grande pièce possible disponible. Ici 10.

E - Correction

Eviter de la regarder avant d'avoir fini... : exo1 et exo2

9 - Sujet 09

A - Thèmes

  • Tableaux dynamiques (dont la méthode append())
  • Tableaux de tableaux
  • Triangle de Pascal (un "classique")

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 09 version locale

C - Remarques sur le sujet

Attention EXO 1: le calcul de l'exemple est faux. Le résultat est de 12.5 sur cette moenne.

D - De l'aide ?

La seule difficulté vient du fait que chaque élément du tableau est un tuple : l'indice 0 contient la note et l'indice 1 contient le coefficient.

Il faudra donc faire la somme de chaque note associée à son coefficient pour obtenir la somme totale et la somme des coefficients.

Une fois calculées ces deux sommes, il suffit de renvoyer le total divisé par la somme des coefficients.


L'exercice 2 est plus compliqué que la moyenne des autres sujets : il faut bien comprendre que append() modifie le tableau en place en lui rajoutant une nouvelle case.

On découpe la création d'un nouveau tableau Ck encodant la ligne en trois parties :

  1. Création d'un nouveau tableau ne contenant que [1].
  2. Calcul et rajout avec append() des cases intermédiaires en utilisant le tableau encodant la ligne du dessous et ses cases i-1 et i.
  3. Rajout de la dernière case pour cette ligne : un [1].

E - Correction

Eviter de la regarder avant d'avoir fini... : exo1 et exo2

10 - Sujet 10

Contient de parties de cours non encore traitées.

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 10 version locale

Article publié le 10 10 2021
Dernière modification : 10 10 2021
Auteur : ows. h.