Gestion d`une cave `a vins Un particulier poss`ede une cave avec
Transcription
Gestion d`une cave `a vins Un particulier poss`ede une cave avec
Gestion d’une cave à vins Un particulier possède une cave avec des vins définis par leur millésime (année) et par leur provenance (numéro de la région d’origine). Les années vont de 1957 à 2007, il est possibles d’avoir plusieurs bouteilles de même millésime et de même région. 1o) Créer une structure de donnée permettant de modéliser la cave. 2o) Créer une fonction premettant de savoir si un millésime d’une année et d’une region données est présent. 3o) Créer un programme permettant de retrouver le millésime le plus représenté. 4o) Créer un programme permettant de retrouver la région la plus représentée. 5o) Le particulier acquiert de nouvelles bouteilles. Créer un programme permettant de les placer dans la cave. Ensembles et multi-ensembles Un multi-ensemble M d’éléments d’un ensemble E est une fonction de E vers l’ensemble des entiers naturels IN, qui fait correspondre à chaque élément x de E, le nombre d’occurrence de x dans M . M est non ordonné comme les ensembles, mais peut contenir plusieurs fois le même élément. 1o) Créer une structure qui permet de stocker un multi-ensemble. 2o) Créer une fonction qui calcule le nombre d’occurrences d’un élément donné dans le multi-ensemble. 3o) a) Créer une fonction qui permet de supprimer une occurrence d’un élément donné. b) Créer une fonction qui permet de supprimer toutes les occurrences d’un élément. 4o) Créer une fonction qui transforme un multi-ensemble en le sous-ensemble de E constitué de ses éléments. Bibliographies On veut gérer la création d’une bibliographie, chaque ligne étant constituée d’un auteur, de l’année de la parution, puis le titre de l’ouvrage et enfin le lieu de parution et l’éditeur. Le modèle de donnée choisi est une matrice à n lignes et 4 colonnes de chaı̂nes de caractères. Une ligne étant constitué de l’auteur, de date entrée comme une chaı̂ne (ex : ’2007’), le titre, le lieu de parution et enfin l’éditeur. On admet qu’est déjà définie la fonction ordChr qui rend 0 sur ’0’, ..., 9 sur ’9’, 10 sur ’a’, ... et 35 sur ’z’, que voici : function n=ordChr(s,i) n=str2code(part(s,i)); endfunction 1o) Écrire une fonction rendant vrai si une chaı̂ne de caractère est avant une autre dans l’ordre lexicographique, exemples : ’aa’ est avant ’ab’, elle-même avant ’ab’, elle-même avant ’abc’ et ’12’ est avant ’123’, elle-même avant ’8’ ( !), ce n’est pas génant tous les ouvrages cités sont imprimés, donc la date a toujours quatre chiffres. 2o) On suppose qu’une bibliographie bibliographie est déjà construite : Donner une fonction donnant les titres d’ouvrages correspondant à un auteur. 3o) Donner une fonction permettant de placer un nouvel ouvrage dans une bibliographie, les ouvrages étant classés par ordre alphabétique d’auteur, puis pour un auteur donné, par date. Recherche de SOS dans un message Morse SOS se dit en Morse : – – – · · · – – – : trois signaux longs, trois courts, trois longs. On modélise le Morse en remplaçant les – par des 1 et les · par des 0. 1o) Écrire une fonction qui permet de savoir si le mot SOS figure dans une séquence Morse quelconque. 2o) Écrire une fonction qui permet de compter le nombre exact de SOS dans une séquence Morse quelconque. Recherche de valeurs dans un vecteur On dispose d’un vecteur de longueur l contenant des entiers classés par ordre croissant. 1o) Écrire une fonction qui calcule la moyenne des valeurs du vecteur. 2o) On se propose de hh situer ii la moyenne dans ce vecteur. a) Par une méthode pas à pas : écrire une fonction qui recherche la place de la moyenne dans le vecteur par incrémentation. page 1 b) Par la méthode de dichotomie. 3o) Laquelle de ces deux méthodes est la plus efficace si l = 3 ? Et si l = 300 ? Au jeu de dames 1o) Modéliser le jeu de dames et donner une fonction construisant le damier initial. 2o) Donner une fonction qui décèle si un pion d’un certain joueur situé à la iième ligne et j ième colonne du damier peut prendre un pion ou une dame de l’autre joueur. 3o) Donner une fonction qui décèle si une dame d’un certain joueur située à la iième ligne et j ième colonne du damier peut prendre un pion ou une dame de l’autre joueur. 4o) Donner une fonction donnant l’ensemble des coups permettant de prendre une pièce à l’adversaire (qui permet donc de ne pas se faire souffler une pièce). La suite 1,11,21,1211,11121,... On définit une suite ainsi : — Le premier terme est 1. — Le second est 11 car sur la ligne précédente, il y a un (1) chiffre un (1). — Le troisième est 21 car sur la ligne précédente, il y a deux (2) chiffres un (1). — Le quatrième est 1211 car sur la ligne précédente, il y a un (1) chiffre deux (2), puis il y a deux (2) chiffres un (1). — Et ainsi de suite : Le cinquième est donc 111221... 1 1 2 1 1 3 1 1 2 1 1 1 1 2 1 2 2 2 1 1 1 .. . On peut montrer que jamais un 4 n’apparaı̂t, et que les proportions de 1, de 2 et de 3 dans le nième terme convergent... 1o) Quelle structure de donnée choisir pour représenter un terme de la suite ? 2o) Donner une fonction qui, à un terme de cette suite, fait correspondre un triplet constitué des proportions de 1, de 2 et de 3 dans ce terme. 3o) Donner une fonction prenant en argument un terme de la suite et rendant le suivant. 4o) Donner une fonction donnant le nième terme de cette suite. Génération de nombres pseudo-aléatoires Le but de cet exercice est de construire un générateur de nombres aléatoires. 1o) Écrire la fonction, dont on se servira dans la suite, mod qui rend le reste r de la division entière des deux entiers n et d : n = d×q+r où q ∈ IN et r ∈ [[0, d − 1]]. On pourra utiliser la fonction floor partie entière par défaut et on s’interdira l’utilisation des fonctions prédéfinies modulo, pmodulo. 2o) a) On définit les constantes semence = 1; d = 9999989; m = 4571081. Écrire la fonction f : x 7→ mod (x ∗ m, d), La suite (semencen )n∈IN , définie par semence0 = semence et semencen+1 = f (semencen ), est une suite de nombres pseudo-aléatoires compris entre 0 et 9999988. b) On va modifier la fonction précédente de manière à ce qu’elle rende un nombre aléatoire entre 1 et n, avec n petit devant 9999989. Modifier donc la question précédente en lui rajoutant une entrée et une sortie : l’entrée supplémentaire étant l’entier n, la sortie supplémentaire étant un nombre aléatoire compris entre 1 et n. La suite (an )n∈IN∗ définie par [an+1 , semencen+1 ] = f (n, semencen ) page 2 est une suite de nombres pseudo-aléatoires compris entre 1 et n. 3o) Afin de vérifier que la fonction précd́ente donne bien un résultat équiréparti sur [[1, n]], écrire une fonction qui rend l’histogramme h de correspondant aux 100 × n termes de la suite : pour i ∈ [[1, n]], h(i) est égal au nombre de termes de la suite (ak )k∈[[1,100×n]] égaux à i. Preuve par 9 de la multiplication On veut écrire un programme qui effectue la preuve par 9 d’une multiplication. Peut-être ferions nous mieux d’effectuer cette multiplication directement sur l’ordinateur. 1o) Tout d’abord, écrire une fonction de conversion : cette dernière prend un entier et rend un vecteur dont les éléments sont ses chiffres. 2o) Écrire une fonction qui à un vecteur de chiffres nous renvoie la somme de ces chiffres modulo 9, 3o) Enfin, il faut faire la vérification par la preuve par 9, en voici le principe suivi d’un exemple. On fait, à la main la multiplication de N par m et on trouve le résultat p. Soient M̃ , m̃, p̃ les sommes modulo 9 de M, m, p. On fait le produit M̃ × m̃ et on cherche la somme de ses chiffres modulo 9, si l’opération est exacte, c’est p̃. En fait, la réciproque est fausse : si l’opération est fausse, il y a huit chances sur neuf que la preuve par neuf le montre. Exemple : 1 1 5 × 1 7 = 5+6 [9]---> 2 1 8 0 1 5 5 . 1 9 5 5 7 × 2 8 <--- 1 + 1 + 5 [9] <--- 1 + 9 + 5 + 5 [9] <--- 1 + 7 [9] La preuve par 9 est concluante car on retrouve face à face deux chiffres identiques (2) Quelques opérations sur les entiers L’ensemble des chiffres en base 10 est C = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Les entiers sont représentés par des matrices de N chiffres, par exemple, pour N = 5, l’entier 1664 est représenté par la matrice [4, 6, 6, 1, 0]. N X xi .10i−1 où les xi ∈ C, est représenté par [[x1 , x2 , . . . , xN ]]. Plus généralement, si x = i=1 On cherche à programmer des fonctions élémentaires sur les entiers. 1o) Programmer la fonction somme de deux entiers. 2o) Programmer la fonction différence de deux entiers. 3o) Programmer une fonction comparaison de deux entiers. Fonctions logiques binaires On manipule des fonctions logiques : les variables et les valeurs de ces fonctions sont donc des booléens. En scilab nous n’utiliserons pas les vrais booléens %f et %t, mais les entiers 0 et 1 : l’entier 0 codant %f (faux) et 1 codant %t (vrai). 1o) On définit la fonction logique f de {0, 1}2 dans {0, 1} par f (0, 0) = 0; f (0, 1) = 0; f (1, 0) = 0; f (1, 1) = 1. Programmer cette fonction. 2o) Donner une fonction qui à une fonction logique de deux variables fait correspondre sa table de vérité, c’est-à-dire une matrice de 4 lignes et 3 colonnes dont les deux premiers termes de la iième ligne sont les arguments de f et le troisième l’image de ces deux arguments. Par exemple, pour la fonction de la première question, la matrice que cette fonction doit rendre est, éventuellement à l’ordre près des lignes : page 3 0 0 1 1 0 1 0 1 0 0 . 0 1 3o) Écrire une fonction qui traduit une table de vérité de booléens (matrice 4x3) en fonction (c’est donc l’opération inverse de la précédente). Cette fonction aura comme variables d’entrée une matrice associée à une fonction booléenne F , les deux variables b1 et b2 et sortira la valeur F (b1 , b2 ) (0 ou 1). 4o) Il s’agit maintenant de comparer deux fonctions logiques de deux variables. a) Donner une fonction prenant en arguments deux fonctions logiques de deux variables et deux valeurs de ces variables, dit si la valeur prise par la première de ces deux fonctions sur ces deux variables est inférieure (au sens large) à la valeur prise par la seconde sur ces mêmes variables. b) Donner une fonction qui détermine, étant données deux fonctions de deux variables logiques, si, sur tout leur ensemble de définition, la première de ces deux fonctions est inférieure à la seconde. Statistiques sur une image en noir et blanc Un fichier image en noir et blanc avec 256 niveaux de gris de n × p pixels (picture elements : les points de l’image) est représenté une matrice à n ligne et p colonnes. À la croisée de la iième ligne et de la j ième colonne se trouve le niveau de gris (compris entre 0 et 255) du pixel situé sur la iième ligne et la j ième colonne de l’image. 1o) On désire dresser un histogramme des niveaux de gris de cette image : donner une structure de donnée adaptée à la représentation de cet histogramme. 2o) Donner la fonction qui rend cet histogramme. 3o) Donner une fonction rendant la moyenne des niveaux de gris de cette image. 4o) Modifier la fonction précédente de manière à ce qu’elle rende aussi l’écart-type. 5o) L’écriture d’un nombre en système binaire donnant des nombres trop longs, on utilise souvent le codage hexadécimal (base 16). Les chiffres en base 16 sont 0, 1,. . ., 9, A,..., F. Par exemple, le nombre s’écrit 1111011 en base 2. Comme 123 = 1 × 26 + 1 × 25 + 1 × 24 + 1 × 23 + 0 × 22 + 1 × 21 + 1 × 20 123 = 7 × 16 + 11 × 160 , il s’écrit aussi 7B en hexadécimal. Mais on trouve très facilement la décomposition en base 16 à partir de celle en base 2, en regroupant les bits par groupe de quatre à pqrtie de la fin : 123 = (0 × 23 + 1 × 22 + 1 × 21 + 1 × 20 )24 + (1 × 23 + 0 × 22 + 1 × 21 + 1 × 20 )(24 )0 : On retrouve bien (0 × 23 + 1 × 22 + 1 × 21 + 1 × 20 ) = 7 et (1 × 23 + 0 × 22 + 1 × 21 + 1 × 20 ) = 11. En déduire une fonction permettant de passer du codage binaire (que l’on représentera par un vecteur de 16 chiffres 7 X 2i ) à son codage binaires 0 ou 1, puisque les nombres qui interviennent dans une image sont inférieurs à 255 = i=0 hexadécimal (que l’on représentera par un vecteur de deux chiffres hexadécimaux 255 = et une fonction qui fait la conversion dans le sens inverse. 7 X 2i = 15×161 +15×160 i=0 X ), Gestion d’un ascenseur On veut gérer un ascenseur desservant un immeuble de 6 niveaux, à chaque étage il y a un bouton pour monter et un pour descendre sauf, bien sûr, au rez-de-chaussée et au dernier étage où il n’y a qu’un bouton d’appel. À un étage donné, seuls les utilisateurs allant dans le même sens que l’ascenseur montent. 1o) Donner une structure de données pour décrire à un instant donné toutes les requètes des utilisateurs. 2o) Écrire une fonction qui ajoute une requète (montée ou descente) au niveau i. 3o) Écrire une fonction qui, l’ascenseur étant à un étage donné et allant dans un certain sens, détermine le prochain arrêt et dans quel sens il va être desservi. Recherche d’un carre blanc maximal dans grille de mots croisés page 4 Étant donnée une grille de mots croisés carré de N × N cases (vide, c’est-à-dire une grille dont certaines cases sont noires et les autres blanches), on se propose de déterminer l’aire du plus grand carré inclus dans cette grille formé de cases blanches. 1o) Comment représenter une grille ? On désire former une grille où chaque case aura la probabilité p d’être blanche. Donner une fonction qui fournit une telle grille de N × N cases. On pourra utiliser la fonction rand : rand() étant un réel suivant la loi uniforme sur [0, 1] (c’est-à-dire un réel aléatoire de [0, 1[). 2o) On se propose d’abord de déterminer l’aire du plus grand rectangle inclus dans cette grille formé de cases blanches. Écrire une fonction dont l’algorithme consiste à passer en revue tous les rectangles de la grille, à tester s’ils sont composés de cases blanches uniquement et à conserver l’aire celui d’aire maximale. N’oubliez pas que c’est la fonction isequal qui permet de tester l’égalité de deux matrices (si vous utilisez ce test). 3o) Écrire une fonction rendant l’aire du carré d’aire maximale inclus dans la grille, en adaptant l’algorithme précédent. 4o) On propose ici une autre solution, un peu plus efficace : Plutôt que de tester tous les carrés inclus dans la grille, on teste d’abord si la grille N × N elle-même est blanche, puis, si ce n’est pas le cas, les quatre carrés de coté de longueur N − 1, et ainsi de suite, jusqu’à ce que l’un des carrés de coté k soit constitué de cases blanches... Écrire une fonction rendant l’aire du carré d’aire maximale inclus dans la grille en utilisant ce nouvel algorithme. Problème des n reines On considère un échiquier à n × n cases, sur lequel on désire placer n reines de telle manière à ce qu’aucune ne puisse prendre une autre. 1o) En remarquant qu’il y a exactement une reine par colonne, comment modéliser (de manière économique) l’échiquier avec ses n reines ? 2o) Donner une fonction permettant de savoir si la reine de la j ième colonne est susceptible d’être prise par une des autres reines de l’échiquier. 3o) En déduire une fonction permetant de savoir si une configuration de reines convient ou non. 4o) On veut connaı̂tre toutes les configurations correctes. Pour cela, on va d’abord engendrer une matrice dont les lignes sont les n! permutations de [[1, n]], voici l’algorithme : • ... On suppose que l’on déjà a engendré une telle matrice M d’ordre i − 1. • On crée un vecteur colonne Ci constitué de (i − 1)! nombres égaux à i. • On crée, pour j ∈ [[1, i], la matrice Mi qui est la matrice à (i − 1)! lignes et i colonnes, obtenue en insérant la colonne Ci dans la matrice M à la j ième place. • On superpose les matrices (Mj )j∈[[1,i]] de manière á former une nouvelle matrice dont les lignes sont les i! permutations de [[1, i]]. • On continue avec i + 1... Voici une illustration : .. . 1 2 •M= 2 1 3 • On forme C3 = à 2! = 2 lignes. 3 • On insère C2 dans M aux trois emplacements possibles : 3 1 2 1 M1 = , M2 = 3 2 1 2 • On superpose M1 , M2 et M3 : 3 2 3 1 3 3 M1 1 M = M2 = 2 M3 1 2 1 2 3 3 2 1 , M3 = 1 2 2 3 1 3 2 1 2 1 3 3 .. . 5o) Donner une fonction rendant les configurations correctes pour un échiquier de n2 cases. page 5 Développement limité de tangente Nous construisons une pyramide d’entiers en procédant comme suit : On affecte au sommet de la pyramide les valeurs 1 suivit de 0 (ceci constitue la ligne d’indice 1 de la pyramide). On affecte ensuite les lignes les unes après les autres, en procédant comme le bœuf qui tire la charrue : on parcourt la ligne de gauche à droite si son indice est pair, de droite à gauche si son indice est impair ; au sein d’une même ligne, on écrit les nombres les uns après les autres en commencant par 0, puis en rajoutant à chaque fois la valeur du nombre de la ligne précédente dont la position verticale précède (dans le sens de parcours de la ligne courante) juste celle du nombre à écrire. Les cinq premières lignes de la pyramide sont les suivantes : ligne 1 1 0 ligne 2 0 1 1 ligne 3 2 2 1 0 ligne 4 0 2 4 5 5 1o) Proposer une structure de donnée pour réprésenter cette pyramide à n étages (lignes). 2o) Donner une fonction construisant cette pyramide. 3o) Pour tout n ∈ IN∗ , appelons an le nombres se trouvant à gauche de la ligne d’indice n. On peut démontrer que n X xk + o(xn ) tan(x) = ak k! k=1 Écrire une fonction, pour x donné, qui calcule, en utilisant le développement limité de tangente à l’ordre n une valeur approchée de tan x. Un algorithme de cryptologie : Vigenere Le chiffre de Vigenère est un système de chiffrement, élaboré par Blaise de Vigenère (1523-1596), diplomate français du XVIeme siècle. Il permet de remplacer une lettre par une autre qui n’est pas toujours la même, contrairement au chiffre de César qu’utilisent parfois les écoliers. Principe du chiffrement : On se donne une clé que le codeur et le décodeur doivent connaı̂tre. La clé se présente généralement sous la forme d’un mot ou d’une phrase, voire d’un livre. Pour pouvoir chiffrer notre texte, à chaque caractère nous utilisons une lettre de la clé pour effectuer la substitution. L’outil du chiffrement est la table de Vigenère : a b c d e f g h i j k l m n o p q r s t u v wx y z a a b c d e f g h i j k l m n o p q r s t u v wx y z b b c d e f g h i j k l m n o p q r s t u v wx y z a c c d e f g h i j k l m n o p q r s t u v wx y z a b d d e f g h i j k l m n o p q r s t u v wx y z a b c e e f g h i j k l m n o p q r s t u v wx y z a b c d f f g h i j k l m n o p q r s t u v wx y z a b c d e g g h i j k l m n o p q r s t u v wx y z a b c d e f h h i j k l m n o p q r s t u v wx y z a b c d e f g i i j k l m n o p q r s t u v wx y z a b c d e f g h j j k l m n o p q r s t u v wx y z a b c d e f g h i k k l m n o p q r s t u v wx y z a b c d e f g h i j l l m n o p q r s t u v wx y z a b c d e f g h i j k mm n o p q r s t u v w x y z a b c d e f g h i j k l n n o p q r s t u v wx y z a b c d e f g h i j k l m o o p q r s t u v wx y z a b c d e f g h i j k l m n p p q r s t u v wx y z a b c d e f g h i j k l m n o q q r s t u v wx y z a b c d e f g h i j k l m n o p r r s t u v wx y z a b c d e f g h i j k l m n o p q s s t u v wx y z a b c d e f g h i j k l m n o p q r t t u v wx y z a b c d e f g h i j k l m n o p q r s u u v wx y z a b c d e f g h i j k l m n o p q r s t v v wx y z a b c d e f g h i j k l m n o p q r s t u w wx y z a b c d e f g h i j k l m n o p q r s t u v x x y z a b c d e f g h i j k l m n o p q r s t u v w y y z a b c d e f g h i j k l m n o p q r s t u v wx z z a b c d e f g h i j k l m n o p q r s t u v wx y page 6 Chiffrement : Pour chaque lettre en clair, on sélectionne la colonne correspondante et pour une lettre de la clé on sélectionne la ligne adéquate, puis au croisement de la ligne et de la colonne on trouve la lettre codée. La lettre de la clé est à prendre dans l’ordre dans laquelle elle se présente et on répète la clé en boucle autant que nécessaire. Exemple : clé : scilab texte : informatique texte en clair : clé répétée : informatique scilabscila ^^^^ |||colonne o, ligne l : lettre z. ||colonne f, ligne i : lettre n. |colonne n, ligne c : lettre p. colonne i, ligne s : lettre a. Le texte chiffré est alors : a p n z r n s v q b u f. Si on veut déchiffrer un texte, on regarde pour chaque lettre de la clé (ici travaillescilab) répétée la ligne correspondante, et on y cherche la lettre codée. La première lettre de la colonne que l’on trouve ainsi est la lettre décodée. Exemple : texte codé clé répétée : : xktpivepkjgzlsqtiingztrrgp travaillescilabtravaillescilab ^^^^ |||ligne v, on cherche p : colonne u. ||ligne a, on cherche t : colonne t. |ligne r, on cherche k : colonne t. ligne t, on cherche x : colonne e. 1o) Les textes et la clé vont être modélisé par des matrice de caractères, par exemple la clé scilab sera codée ainsi : cle=[’s’,’c’,’i’,’l’,’a’,’b’]. On se donne alphabet=[’a’,’b’,’c’,’d’,’e’,...,’x’,’y’,’z’] ; Définir la fonction qui à un caractère fait correspondre son rang dans l’alphabet. Convertir avec cette fonction la clé en le vecteur d’entiers codesCle. 2o) Écrire la fonction code qui crypte un vecteur de caractères avec la clé. On pourra utiliser la fonction scilab pmodulo qui rend le reste de la division entière de son premier argument par son second. 3o) Écrire la fonction decode qui décrypte un vecteur de caractères avec la clé. Construction d’un carré magique d’ordre impair Un carré magique est une matrice N × N contenant tous les nombres de 1 à N 2 et telle que les sommes des nombres de chaque ligne, chaque colonne et chaque diagonale soient chacune égales à une même constante. Par exemple, 4 9 2 3 5 7 8 1 6 est un carré magique d’ordre 3. 1o) Quelle est la constante d’un carré magique d’ordre N ? 2o) Dans la suite, on utilisera une matrice pour représenter un carré magique. Par exemple, le carré de la question 3) sera représenté par la matrice >M=[4,9,2 ;3,5,7 ;8,1,6]; Écrire une fonction prenant en argument une matrice m d’ordre n et retournant vrai ou faux si la matrice est un carré magique. 3o) Une des méthodes permettant de construire un carré magique d’ordre impair n est la suivante : on considère le tableau comme un tore, à savoir la ligne n est suivie par la ligne 1 et la colonne n est suivie par la colonne 1 : page 7 Le carré magique d’ordre 3 vu comme un tore : 6 8 1 6 8 2 4 9 2 4 7 3 5 7 3 6 8 1 6 8 2 4 9 2 4 2 Mettre tous les nombres de 1 à n dans les cases calculées comme suit : • pour 1, le mettre dans la case située sous la case centrale du carré, • chaque nombre sera mis dans la case située ligne suivante, colonne suivante de celle où on a mis le nombre précédent. Si cette case est déjà remplie, on avance encore d’une ligne et on recule d’une colonne. Le tableau ainsi constitué est un carré magique. Voici le début de la construction du carré magique d’ordre 3 : 4 2 3 3 1 4 2 a) Représenter le carré magique d’ordre 5 construit de cette façon. b) Donner une fonction qui à un couple de coordonnées (i, j) fait correspondre les coordonnés de la case suivante dans le tore (que cette case soit déjà occupée ou non). c) Donner une fonction qui à un couple d’entier (i, j) fait correspondre les coordonnées de la case qui va être effectivement remplie en suivant l’algorithme lorsque la case suivante dans le tore est occupée). d) Écrire le programme qui remplit selon cette méthode une matrice m d’ordre n impair de manière à la rendre magique. Le billard binomial On considère une planche, en pente, portant n niveaux de clous avec i clous à la ligne i. • • • • 1 • • • 2 • • 3 • 4 .. . On lâche une bille en haut de la planche, la bille est initialement en face du premier clou. À chaque niveau, la bille heurte un clou de la planche et peut aller soit à droite, soit à gauche avec la même probabilité 12 jusqu’en bas de la planche. 1o) Donner un moyen de modéliser le jeu. 2o) Modélisez la trajectoire d’une bille partant en haut de la planche. 3o) Donner une fonction permettant de reconstituer une des trajectoires d’une bille arrivée en un point quelconque de la dernière ligne. 4o) Modifier la fonction de la seconde question de manière à ce que chaque case, contenant initialement 0, traversée par la boule ait son contenu augmenté d’une unité. On lâche maintenant successivement 2n boules en haut de la planche. Donner une fonction où chaque case ayant été traversée k fois par une boule contienne le nombre k. Des élections présidentielles n candidats se présentent à l’élection présidentielle. 1o) Écrire une fonction classant, en vue de l’affichage dans la rue et les passages dans les médias, de façon aléatoire les n candidats. page 8 2o) Écrire une fonction rendant une matrice M à n lignes et deux colonnes dont chaque ligne est un couple constitué d’un candidat président et d’un premier ministre (choisi ici aléatoirement par le candidat président parmi les n − 1 autres candidats). 3o) a) Modifier la fonction précédente de manière à ce qu’elle rende une matrice à trois colonnes, chaque ligne étant un triplet constitué d’un président, d’un premier ministre et de la probabilité que ce président soit élu. b) Donner une fonction donnant le président qui a le plus de chances d’être elu. c) Donner une fonction donnant le premier ministre ayant le plus de chances d’être choisi. Une suite finie On prend un entier naturel non nul. On fait ensuite la somme des carrés de chacun des chiffres composant ce nombre. On recommence jusqu’à obtenir 1 ou 4, exemple : 55, 50(= 52 + 52 ), 25, 29, 85, 89, 145, 42, 20, 4. 1o) Écrire une fonction qui fait la somme des carrés des composantes d’une liste. 2o) Ècrire une fonction qui décompose un nombre en la liste de ses chiffres. 3o) Écrire une fonction, de style fonctionnel, qui renvoie le nombre d’itérations nécessaires avant d’obtenir 1 ou 4. Addition et soustraction binaire (par complémentation à 1) On appelle chiffres binaires les chiffres 0 et 1, en anglais binary digit. L’écriture binaire d’un entier naturel n est la suite des chiffres bp bp−1 · · · b0 tel que n = p X bi 2i où bp = 1 et, pour tout i=0 i ∈ [[0, p − 1]], bi ∈ {0, 1}. On montre facilement que cette écriture est unique. On surligne souvent, pour différencier les écritures binaires des décimales, l’écriture binaire d’un nombre et on place en fin de ligne un petit 2, exemple : 2 19 = 10011 car 9 = 1.24 + 0.23 + 0.22 + 1.21 + 1.20 . 2 Attention, il y a une exception pour 0 que l’on écrit 0 = 0 . o 1 ) Choisir un structure de donnée pour modéliser les écritures binaires. 2o) Donner une fonction convertissant un nombre n en son écriture binaire. 3o) Donner une fonction permettant d’additionner deux nombres donnés sous la forme de leurs écritures binaires. On pourra supposer qu’ils sont de la même longueur ou rajouter des zéros devant l’un, l’addition se fait comme dans le système décimal avec propagation de la retenue, exemple : 1 1 1 10 1 + 0 1 0 1 1 0 0 1 0 4o) Pour faire la soustraction de deux nombres binaires, on pourrait faire comme dans le système décimale, mais les retenues peuvent être grandes et c’est pénible. On va utiliser une astuce : la complémentation à 1, donnons un exemple : 2 2 11100110 − 01010111 = 11111111 − (11111111 − 11100110) − 01010111 2 2 = 11111111 − (11111111 − 11100110) + 01010111 , La soustraction “complémentation à 1” ne demande pas de retenue et nous nous retrouvons avec une addition à faire. Écrire la fonction qui complénte à 1 un nombre donné sous forme de son écriture binaire. Écrire la fonction qui fait la différence entre deux nombres donnés sous forme de leurs écritures binaires. Statistiques à deux dimensions Soit X un sous-enxemble fini de IR, F l’ensemble des applications définies sur X à valeurs dans IR. 1o) On définit une “distance” dX entre les applications de F : sX (f2 (x) − f1 (x))2 . dX (f1 , f2 ) = x∈X Donner une fonction d’arguments X, f1 et f2 , donnant la distance d entre deux fonctions f1 et f2 définies sur X. 2o) Mf , matrice à n lignes et 2 colonnes, étant donnée, f est décrite par cette matrice Mf , de format Card X × 2, dont chaque ligne contient un point de X et, dans la seconde colonne, son image par f . page 9 Écrire la fonction f qui à x ∈ X fait correspondre f (x). 3o) Donner la fonction d’argument la “matrice” de f donnant les moyennes, lorsque x décrit X, x des x, f (x) des f (x), x2 des x2 , f 2 (x), xf (x) des xf (x). On remarquera que si x et y sont deux vecteurs colonnes de longueur n x’*y est le réel n X xi yi . i=1 o 4 ) On pose 2 V (x) = x2 − x2 , V (f (x)) = f 2 (x) − f (x) , Cov(x, f (x)) = xf (x) − xf (x). Donner une fonction d’argument M f qui rend ces x, f (x) et ces trois valeurs. 5o) Soit la droite d’équation Cov(x, f (x)) f˜(x) = y = (x − x) + f (x). V (x) Donner la distance entre f et f˜. Trier un jeu de cartes Vous avez certainement déjà classé les cartes d’un jeu de cartes afin de voir quelles cartes manquent. Nous les classerons avec cet ordre : A♠, R♠, D♠, V♠, 10♠, 9♠,. . .,2♠, A♥, R♥,. . ., 2♥, A♦,. . ., 2♦, A♣,. . ., 2♣ 1o) a) Donner une structure de donnée permettant de représenter une suite de cartes et qui permettra d’en faire aisément leur classement. avec l’ordre ci-dessus. b) Donner alors une fonction permettant de comparer deux cartes. 2o) Écrire une fonction qui échange les éléments d’indices i et j (où j ≤ i) d’une suite de cartes. Exemple sur la suite de cartes 2♦, 8♥, 4♣, A♥, R♥, V♠,4♦, R♠, 10♥, D♣ pour i = 2 et j = 6 : 2♦, V♠, 4♣, A♥, R♥, 8♥, 4♦, R♠, 10♥, D♣ 3o) Écrire une fonction qui effectue une permutation circulaire sur les éléments d’indices compris entre j et i (où j ≤ i) d’une suite de cartes. Exemple sur la suite de cartes 2♦, 8♥, 4♣, A♥, R♥, V♠,4♦, R♠, 10♥, D♣ pour i = 5 et j = 2 : 2♦, R♥, 8♥, 4♣, A♥, V♠,4♦, R♠, 10♥, D♣ 4o) Écrire une fonction triant une suite de cartes. Incrémentation, addition 32 bits, puis 64 bits en binaire On appelle chiffres binaires les chiffres 0 et 1, en anglais bits (binary digits). L’écriture binaire d’un entier naturel n est la suite des chiffres bp bp−1 · · · b0 tel que n = p X bi 2i où bp = 1 et, pour tout i=0 i ∈ [[0, p − 1]], bi ∈ {0, 1}. On montre facilement que cette écriture est unique. On surligne souvent, pour différencier les écritures binaires des décimales, l’écriture binaire d’un nombre et on place en fin de ligne un petit 2, exemple : 2 19 = 10011 car 9 = 1.24 + 0.23 + 0.22 + 1.21 + 1.20 . 2 Attention, il y a une exception pour 0 que l’on écrit 0 = 0 . o 1 ) Choisir un structure de donnée pour modéliser les nombres binaires de moins de 32 bits. 2o) On désire additionner deux nombres binaires donnés de 32 bits. L’addition se fait comme dans le système décimal avec propagation de la retenue, exemples (ici en 4 bits) : 1 1 0 10 1 1 1 10 1 + 0 1 0 1 + 0 1 0 1 1 1 1 0 1 0 0 1 0 Dans le second exemple, le résultat n’est pas un nombre binaire de 4 bits. on rendra les derniers chiffres [0,0,1,0] et la retenue 1. Dans le premier cas on rendra donc [1,1,1,0] et la retenue 0. page 10 Tout d’abord, on se contente d’additionner 1 à un nombre binaire de 32 bits, on dit incrémenter un nombre binaire, on rend un résultat sur 32 bits et une retenue. Donnons quelques exemples (toujours en 4 bits) : 1 1 0 10 1 0 0 0 0 1 11 11 1 + 0 0 0 1 + 0 0 0 1 + 0 0 0 1 1 0 1 0 0 0 0 1 1 0 0 0 0 Dans le dernier exemple, le résultat n’est pas un nombre binaire de 4 bits. on rendra les derniers chiffres [0,0,1,0] et la retenue 1. Dans les premier cas, on rendra donc un résultat sur 4 bits et la retenue 0. a) Écrire la fonction qui incrémente un nombre binaire de 32 bits, rend un résultat sur 32 bits et une retenue. b) Écrire la fonction qui additionne deux nombres binaires de 32 bits, rend un résultat sur 32 bits et une retenue. Il n’est pas judicieux d’utiliser plusieurs fois l’incrémentation. 3o) Utiliser les fonctions précédentes pour écrire une fonction qui permet d’additionner des nombres binaires de 64 bits. On ne fera pas attention à l’éventuelle retenue : on ne rendra donc que les 64 derniers bits du résultat. Bataille navale On prend une grille de taille 16 × 16 et des bateaux de 2 à 5 cases 1o) Mettre en forme le plateau de jeu et mettre en forme l’historique des tirs. 2o) Donner une fonction qui détermine si un tir a touché ou non un bateau. 3o) Donner une fonction qui permet de tirer de manière optimale. 4o) Donner un programme qui permet de couler un bateau en entier. Jeu de la vie de J.Conway (avec damier torique) On se donne un damier carré de n × n cases avec n = 8. Sont disposés sur ce damier des pions qui représentent des cellules. Le damier est torique : il est supposé doublement enroulé de manière à ce que la première ligne se recolle à la dernière et que la première colonne se recolle à la dernière, ainsi : — Les huit cases voisines de la case (2, 3) sont, comme c’est normal, les cases (1, 2), (1, 3), (1, 4), (2, 2), (2, 4), (3, 2), (3, 3), (3, 4). — Mais les huit cases voisines de la case (1, 3) sont les cases (8, 2), (8, 3), (8, 4), (1, 2), (1, 4), (2, 2), (2, 3), (2, 4). — Tandis que les huit cases voisines de la case (1, 8) sont les cases (8, 7), (8, 8), (8, 1), (1, 7), (1, 1), (2, 7), (2, 8), (2, 1). (8, 8) (8, 1) (8, 2) (8, 3) (8, 4) (8, 5) (8, 6) (8, 7) (8, 8) (8, 1) (1, 8) (1, 1) (1, 2) (1, 3) (1, 4) (1, 5) (1, 6) (1, 7) (1, 8) (1, 1) (2, 8) (2, 1) (2, 2) (2, 3) (2, 4) (2, 5) (2, 6) (2, 7) (2, 8) (2, 1) (3, 8) (3, 1) (3, 2) (3, 3) (3, 4) (3, 5) (3, 6) (3, 7) (3, 8) (3, 1) (4, 8) (4, 1) (4, 2) (4, 3) (4, 4) (4, 5) (4, 6) (4, 7) (4, 8) (4, 1) (5, 8) (5, 1) (5, 2) (5, 3) (5, 4) (5, 5) (5, 6) (5, 7) (5, 8) (5, 1) (6, 8) (6, 1) (6, 2) (6, 3) (6, 4) (6, 5) (6, 6) (6, 7) (6, 8) (6, 1) (7, 8) (7, 1) (7, 2) (7, 3) (7, 4) (7, 5) (7, 6) (7, 7) (7, 8) (7, 1) (8, 8) (8, 1) (8, 2) (8, 3) (8, 4) (8, 5) (8, 6) (8, 7) (8, 8) (8, 1) (1, 8) (1, 1) (1, 2) (1, 3) (1, 4) (1, 5) (1, 6) (1, 7) (1, 8) (1, 1) Les cellules naissent, meurent ou survivent à chaque génération selon les règles suivantes : — Survie Toute cellule ayant exactement deux ou trois voisines (parmi les huits cases contiguës) à une certaine génération survit à la génération suivante. page 11 — Mort Toute cellule ayant quatre ou plus voisines à une certaine génération meurt par étouffement à la génération suivante. Toute cellule ayant une ou aucune voisine meurt d’isolement à la génération suivante. — Naissance Sur une case vide ayant exactement trois voisines à une certaine génération, il nait une cellule à la génération suivante. Au debut, il y a des cellules sur les cases situées au bord du damier. 1o) Initialiser le damier. 2o) Donner une fonction qui à p ∈ IN, fait correspondre l’entier congru à p compris entre 1 et n. 3o) Donner une fonction permettant de donner le nombre de cellules parmi les huit cases voisines d’une case. 4o) Donner une fonction donnant l’état du damier à la génération suivante en fonction de celui à la génération précédente. 5o) Donner une fonction disant si le motif initial est périodique (c’est-à-dire si, au bout d’un certain nombre de générations, on retrouve la configuration initiale), cette fonction rendra la période si elle est périodique et 0 sinon. 6o) Montrer que, pour tout motif initial, il y a nécessairement périodicité à partir d’un certaine génération. Donner une fonction rendant cette période ainsi que le motif périodique. 7o) Le motif suivant est-il périodique ? périodique à partir d’un certain rang ? • • • • • • • • Le jeu d’awélé Le plateau ressemble à deux demi-bûches coupées dans le sens du bois, reliées par des charnières suivant une génératrice de manière à se replier en reformant la buche (un peu comme un étui à lunettes). Chacune des faces planes est creusée d’une rangée de six trous, avec parfois deux plus gros trous sur les bords. Les pions sont des graines venant de l’arbre Caesalpinia bonduc. Comme les échecs, seulement deux joueurs peuvent s’affronter. —1— Au départ, on répartit quarante-huit graines dans les douze trous à raison de quatre graines par trou. —2— Les joueurs sont l’un en face de l’autre, avec une rangée devant chaque joueur. Cette rangée sera son camp. On choisit le sens de rotation direct qui vaudra pour toute la partie. —3— Un tour se joue de la façon suivante : le premier joueur prend toutes les graines d’un des trous de son camp, puis il les égrène dans toutes les cases qui suivent sur sa rangée puis sur celle de son adversaire, suivant le sens de rotation direct, une graine dans chaque trou après celui où il a récupéré les graines). Si sa dernière graine tombe dans un trou du camp adverse et qu’il y a maintenant deux ou trois graines dans ce trou, le joueur récupère ces deux ou trois graines et les met dans ses prises. Ensuite il regarde la case précédente : si elle est dans le camp adverse et contient deux ou trois graines, il récupère ces graines, et ainsi de suite jusqu’à ce qu’il arrive à son camp ou jusqu’à ce qu’il y ait un nombre de graines différent de deux ou trois. —4— Le but du jeu est d’avoir récupéré le plus de graines à la fin de la partie. —5— On ne saute pas de case lorsqu’on égrène sauf lorsqu’on a plus de douze graines, c’est-à-dire qu’on fait un tour complet : on ne remplit pas la case où l’on vient de prendre les graines. —6— Il faut nourrir l’adversaire, c’est-à-dire que, quand celui-ci n’a plus de graines, il faut absolument jouer un coup qui lui permette de rejouer ensuite. Si ce n’est pas possible, la partie s’arrête et le joueur qui allait jouer capture les graines restantes. —7— Si un coup devait prendre toutes les graines adverses, alors le coup peut être joué, mais aucune capture n’est faite : il ne faut pas affamer l’adversaire. —8— La partie s’arrête quand un des joueurs a capturé au moins 25 graines, soit plus de la moitié, ou qu’il ne reste que 6 graines en jeu. 1o) Donner une structure de données permettant de gérer ce jeu. 2o) On ne retient, pour le moment, que les règles de —1— à —4—. page 12 Donner une fonction prenant en arguments le plateau, les coordonnées d’une case (dans laquelle les graines ont été prises ou dans laquelle on vient de placer une graine) et le nombre de graines restant à distribuer et rendant le nouveau plateau, la nouvelle case à laquelle on vient d’ajouter une graine et le nouveau nombre de graines restant. 3o) En ne tenant toujours pas compte des règles —5— à —8—, donner une fonction qui, au plateau et àux coordonnées de la cases de départ, fait correspondre le nouveau plateau et le nombre de prises à l’issue du tour du joueur ayant choisi de prendre les graines dans la case de départ. 4o) Modifier la fonction précédente en prenant, de plus, en compte la règle —5—. Statistiques sur des données discretes Soit v un vecteur d’entier. 1o) Écrire une fonction permettant de calculer le nombre de fois où un nombre intervient dans v 2o) Donner une fonction donnant le minimum et le maximum du vecteur v 3o) Donner une fonction donnant une médiane du vecteur v. On pourra d’abord trier le vecteur par ordre croissant. Déplacements sur un jeu de taquin Le jeu de taquin est constitué de h × l − 1 carreaux coulissant horizontalement ou verticalement dans un cadre rectangulaire de taille h carreaux par l carreaux. Une case est donc vide et permet donc à ses (au plus) quatre voisines de prendre sa place. Les carreaux sont a priori différents, dans la position initiale la case vide est en haut et à gauche et, en général, l’ensemble de carreaux représente alors un dessin (le plus diffusé a certainement été le petit avion d’Air France). 1o) Donner une structure de données pour représenter un jeu de taquin avec un dessin, puis une fonction rendant le taquin dans son état initial. 2o) On connait la position de la case vide du jeu de taquin, comment décrire un des quatre déplacements possibles ? Donner une fonction rendant ces déplacements possibles. 3o) Donner une fonction qui, à partir des déplacements possibles, choisit l’un de ces déplacements, puis une fonction qui, à partir d’un état du taquin et des coordonnées de sa case vide, effectue un déplacement aléatoire et rend le nouvel état du taquin. On rappelle que la fonction rand avec aucun argument =() rend au hasard un réel de l’intervalle [0, 1[. 4o) Donner une fonction effectuant, à partir de la position initiale, des déplacements aléatoires jusqu’à ce que plus aucune case ne soit à sa place initiale. On rappelle la fonction isequal(m1,m2) qui rend %T si les deux matrices m1 et m2 sont égales et %F sinon. 5o) Afin de retrouver la position initiale, modifier la fonction précédent de manière à nous laisser la trace de tous les déplacements à partir de la position d’origine. Écrire la fonction qui, à partir du taquin modifié et des déplacements, retrouve son état d’origine. Remplacements de sous-chaı̂nes dans une chaine de 0 et 1 Soit 1o) 2o) 3o) un vecteur constitué de 0 et de 1. Écrire une fonction permettant de comptabiliser le nombre de 0. Écrire une fonction permettant de remplacer la plus longue série de 1 consécutifs par des 2. Écrire une fonction permettant de remplacer la plus longue série de hh 010 ii consécutifs par des 101. Gestion d’un musée Les collections d’un musée d’art se divisent en : — les œuvres présentées dans les salles — les œuvres mises en réserves Les œuvres sont classées par époque de 1 à 7 (1=antique, 2 : médiéval, 3 : classique, 4 : baroque, 5=cubisme, 6 : abstrait, 7 : moderne) et par nature (1 : statue, 2 : peinture, 3 : céramique). 1o) Proposer une structure pour recenser et organiser les œuvres dans le musée. 2o) Construire une fonction qui donne le nombre d’œuvres dans les réserves. 3o) Construire une fonction qui, pour chaque époque, donne le nombre d’œuvres dans le musée. 4o) Construire une fonction qui, pour chaque époque, détermine quelle est la nature la plus représentée dans le musée. 5o) Construire une fonction qui détermine quelle est la nature la plus représentée dans les réserves. Dessin de figures sur un fichier bitmap page 13 Une image en noir et blanc avec 256 niveaux de gris est codée par une matrice 480 × 640 d’entiers de [[0, 255]], le niveau de gris du pixel de l’image de coordonnées (x, y) dans le repère orthonormé d’origine le point en bas et à gauche se trouve codé par un entier de 0 à 255 placé sur la (481 − y)ième ligne et xième colonne de la matrice : 0 correspondant au noir, 127 au gris, 191 à un gris plus clair et 255 au blanc. 1o) Donner une fonction créant une image constituée d’un rectangle blanc sur fond noir dont les cotés sont parallèles aux bords de l’image. 2o) Donner une fonction qui au point de coordonnées (x, y) et à la droite d’équation y = ax + b (les arguments de la fonction seront donc x, y, a et b) fait correspondre la distance de ce point à cette droite (l’unité étant la largeur d’un pixel). On rappelle que la distance dM,D d’un point M de coordonnées (x0 , y0 ) à une droite D d’équation ax + by + c est donnée par la formule |ax0 + by0 + c| √ . dM,D = a2 + b 2 3o) Écrire une fonction rendant une image constituée d’un rectangle blanc sur fond noir, de centre (xc , yc ), dont l’un des cotés a pour pente a ∈ IR et pour longueur L, la largeur du rectangle étant l. 4o) Donner une fontion donnant la distance euclidienne (l’unité étant la largeur d’un pixel) entre deux points. 5o) Donner une fonction rendant une image constituée d’un disque blanc de centre (xc , yc ) et de rayon r sur fond noir. 6o) Soient A et B deux sous-ensembles d’un ensemble E. On appelle différance symétrique de A et B le sous ensemble (A ∪ B) \ (A ∩ B). Deux images contiennent chacune, sur fond noir, une figure blanche : un sous-ensemble. Donner une fonction rendant une image constituée de la différence symétrique de ces deux figures blanches. Opérations sur les binaires : le vrai énoncé ? Pour coder les données, l’ordinateur utilise le langage binaire où les puissances de 2 sont représentées par des 0 et des 1. Chaque 0 ou 1 représente un bit. Par exemple, 1111011 correspond à 1.26 + 1.25 + 1.24 + 1.23 + 0.22 + 1.21 + 1.20 = 123. Un élément de 32 bits contient donc 32 chiffres qui peuvent des 0 ou des 1 et, de même, un élément de 64 bits comprend 64 chiffres. l’addition en binaire s’effectue de la même manière qu’en base 10 et il existe un système de retenues. Par exemple, 1010 + 0011 donne 1101. En effet, 0 + 1 = 1, puis 1 + 1 = 0 et on retient 1, puis 0 + 0 + 1 = 1 (le troisième terme de la somme correspond à la retenue précédente) et enfin 1 + 0 = 1. D’où le résultat. 1o) Donner une fonction qui, à partir d’un élément de 64 bits de la forme b63 b62 · · · b2 b1 b0 , donne sa partie hh basse ii b31 b30 · · · b2 b1 b0 et sa partie hh haute ii b63 b62 · · · b33 b32 . 2o) Donner une fonction qui permet de déterminer si un nombre binaire est nul. 3o) Donner une fonction qui permet de faire la somme de deux nombres binaires de 32 bits, en prenant garde au système de retenue. 4o) Modifier la fonction précédente en ajoutant la possibilité d’avoir une retenue au départ. 5o) Donner une fonction qui permet faire la somme de deux nombres binaires de 64 bits : On partagera ces nombres en nombres binaires de 32 bits et on utilisera la fonction précédente. Des loups et des arbres Une forêt est représentée par une grille de 100 × 100 cases. 100 arbres sont disposés au hasard. On cherche à placer 10 loups de telle sorte qu’aucune case n’accueille plus d’un élément (un loup ou un arbre) et que chaque loup ne puisse en voir un autre. Un loup peut voir à l’infini sur la ligne, la colonne et les diagonales sur lesquelles il se trouve, et seul un arbre peut faire obstacle et empêcher un loup de voir ce qu’il y a derrière. 1o) Écrire une fonction qui permet de placer aléatoirement les loups et les arbres (sans autre contrainte que celle qu’une case ne contienne au maximum un élément). 2o) Écrire une fonction qui permet de tester si un loup est visible par les autres loups. 3o) Écrire une fonction qui permet de placer les loups sur la grille (les arbres étant déjà placés) Coupe d’Europe : Simulation de niveaux des équipes On veut modéliser les jeux de la coupe d’Europe. Les 16 équipes de football qui participent ont, chacune, un niveau de 0 à 5. 1o) Lorsque deux équipes s’affrontent, la probabilité que l’une gagne est proportionnelle à son niveau. Après une partie, le niveau niveau de l’équipe gagnante progresse (si possible) d’une unité et celui de la perdante baisse d’une unité. page 14 Donner une structure de données pour gérer les niveaux des 16 équipes, puis écrire une fonction qui attribue aléatoirement ces niveaux. On pourra utiliser les fonctions rand (rand(n,p) rendant une matrice ×p dont les éléments sont choisis aléatoirement dans [0, 1[), et floor (floor(m) rendant la matrice dont les éléments sont les parties entières de ceux de la matrice m). 2o) Écrire une fonction qui à deux équipes et leurs niveaux renvoit l’équipe gagnante tout en modifiant les nouveaux niveaux de manière adéquate (on supposera qu’il n’y a pas de parties nulles). 3o) Les matchs se déroulent ainsi : Les deux premières équipes jouent ensembles, les deux suivantes aussi et ainsi de suites : on sélectionne donc huit équipes gagnantes. On recommence avec ces huit équipes gagnantes, puis les quatre, ... Donner une fonction donnant le gagnant de ce tournoi. Coupe d’Europe : Simulation des finales On veut modéliser les jeux de la coupe d’Europe. Les 16 équipes de football qui participent ont, chacune, un niveau de 0 à 5. 1o) Lorsque deux équipes s’affrontent, la probabilité que l’une gagne est proportionnelle à son niveau. Donner une structure de données pour stocker les niveaux des 16 équipes, puis attribuer aléatoirement ces niveaux. On pourra utiliser les fonctions rand (rand(n,p) rendant une matrice ×p dont les éléments sont choisis aléatoirement dans [0, 1[), et floor (floor(m) rendant la matrice dont les éléments sont les parties entières de ceux de la matrice m). 2o) Écrire une fonction qui à deux équipes et leurs niveaux renvoit l’équipe gagnante (on supposera qu’il n’y a pas de parties nulles). 3o) On forme avec ces seize équipes, aléatoirement, quatre groupes de quatre équipes. Écrire une fonction rendant ces quatres groupes. 4o) Les équipes, à l’intérieur de chaque groupe, font tous les 42 = 6 matchs deux à deux possibles. Lors de ces 6 matchs, si une équipe gagne, elle marque un point, si elle perd, elle perd un point. Pour la sélection en quart de finale, on choisit les deux équipes de chacun des quatre groupes ayant marqué le plus de points (en cas d’égalité, on choisira une quelconque des équipes). Donner une fonction rendant la sélection en quart de finale. 5o) Pour la sélection en demi-finale, on refait jouer entre elles les deux équipes sélectionnées de chaque groupe. Donner une fonction rendant la sélection de demi-finale. 6o) Pour la finale, vont s’opposer les deux équipes des deux premiers groupes, ainsi que celles des deux derniers... 7o) Donner une fonction rendant le gagnant du tournoi. Codage RVB et son écriture en héxadecimal Une image numérique en format bitmap 16 millions de couleurs (.bmp) est constituée d’un préambule précisant le format puis d’une suite de 6n octets caractérisant les n pixels de l’image. Un pixel (picture element) est la donnée de 3 paires d’octets, chaque paire d’octet détermine le degré de saturation d’une couleur fondamentale : Rouge, Vert et Bleu (système RVB). Un octet est un nombre de 0 à 15, il est codé par un chiffre hexadécimal 0, 1, ..., 9, A, B, C, D, E, F , A correspondant à 10 et F à 15. Un mot ou paire d’octets code un nombre hexadécimal à deux chiffres, donc de 0 à 162 − 1 = 255 : par exemple F F correspond au nombre 15 × 161 + 15 × 160 = 255, A3 correspond au nombre 10 × 161 + 3 × 160 = 163 et 7F à 7 × 161 + 15 × 160 = 127. Pour revenir à notre pixel, décrit par ses trois mots, le premier mot code la saturation en rouge, le second en vert et le troisième en bleu. Ainsi, FF 00 00 correspond au rouge saturé, 00 FF 00 au vert saturé, FF FF FF au blanc, 7F 7F 7F à un gris, FF 7F 7F à un rose. Un pixel, dans ce format, peut donc recevoir 2563 = 16 777 216 couleurs 1o) Écrire une fonction qui fait correspondre à un vecteur de 6 caractères, représentant un pixel, fait correspondre un vecteur de 3 nombres compris entre 0 et 255, les degrés de saturation en rouge, vert et bleu. Par exemple, l’image du sextuplet [’F’ ’F’ ’7’ ’F’ ’7’ ’F’], correspondant au rose FF 7F 7F, sera [255 127 127]. On utilisera la fonction ascii qui donne l’ordre ascii d’un caractère. Précisément : ascii(’0’)=48, ascii(’1’)=49,...,ascii(’9’)=57 et ascii(’A’)=65, ascii(’B’)=66,...,ascii(’Z’)=90. 2o) Écrire la fonction réciproque. On pourra s’aider du vecteur correspondance : [’0’ ’1’ ’2’ ’3’ ’4’ ’5’ ’6’ ’7’ ’8’ ’9’ ’A’ ’B’ ’C’ ’D’ ’E’ ’F’] en remarquant que correspondance (0+1)=’0’,..., correspondance(10+1)=’A’,... page 15 3o) On suppose que la partie utile du fichier image (les caractéristiques des n pixels) est constituée de chiffres hexadécimaux. On a transformé ces 6n caractères en un vecteur de 6n caratères. Écrire une fonction qui transforme ce vecteur en une matrice n × 3 d’entiers : la ligne i étant constituée des saturations R, V, B du iième pixel. 4o) On désire trouver, dans cette suite de pixels, les 6 rangs des pixels ayant une saturation minimum ou maximum pour une couleur fondamentale. Donner une fonction les recherchant. Une transposition du problème du sac à dos À la suite d’un tremblement de terre, un premier avion de secours est prêt à partir : il ne reste plus qu’à le charger. Les stocks sur le lieu de départ sont constitués d’engins de 4 à 10 tonnes. L’avion ne peut pas charger plus de 150 tonnes. 1o) Quelle structure de donnée prendre pour décrire ces stocks constitués de n engins. Donner une fonction créant des engins de poids aléatoire dans les stocks On rappelle la fonction rand (sans argument =()) qui rend un réel aléatoire dans [0, 1[. 2o) Afin de gérer le stock, donner une fonction donnant le nombre d’engins le constituant, puis le poids total de ces engins. 3o) Écrire une fonction créant un chargement aléatoire (on choisit successivement des engins au hasard et on s’arrête juste avant de dépasser les 150 tonnes). 4o) Pour choisir, à poids inférieur à 150 tonnes, un chargement utilisant le plus d’engins, écrire une fonction rendant un chargement de cardinal maximum parmi m chargements trouvés avec la fonction précedente. 5o) Soyons sérieux : donner une fonction, qui étant donnés les stocks, donne un chargement de moins de 150 tonnes de cardinal maximum. Statistiques sur des données diffuses On rappelle que la somme b−a Sn = n n−1 f (a) X + f 2 k=1 ! f (b) b−a + a+k n 2 (méthode dite des trapèzes) permet d’approcher l’intégrale de la fonction continue f sur l’intervalle [a, b] : Z b f (t) dt. a Sans plus d’hypothèses sur f , nous n’avons pas de renseignements sur l’erreur. 1o) Donner une fonction permettant de calculer une valeur approchée de Z b f (t) dt. a 2o) Donner une fonction donnant une valeur approchée de la moyenne de f sur [a, b]. 3o) On définit la médiane de la fonction X à valeurs dans [a, b], de densité f positive non identiquement nulle, comme étant une valeur µ telle que Z µ Z 1 b f (t) dt = f (t) dt. 2 a a Déterminer une valeur approchée de µ en utilisant la méthode des trapèzes. 4o) On définit la valeur moyenne m de la fonction X à valeurs dans [a, b] et de densité f par Z b tf (t) dt . m = Za b f (t) dt a Donner une fonction donnant une valeur moyenne approchée m de la fonction X à valeurs dans [a, b] et de densité f (barycentre approchée de [a, b] pondéré par f ). Full, carré au poker Le poker se joue avec un jeu de 52 cartes. Nous nous intéressons à la présence d’un carré (quatre cartes de même hauteur) et d’un full (deux cartes de même hauteur et trois autres cartes de même hauteur lors de la première donne page 16 de cinq cartes. 1o) Proposer une modélisation d’une donne de poker en tenant compte de que l’on recherche. 2o) Écrire une fonction qui nous donne une main de 5 cartes au hasard. 3o) Donner une fonction qui permet de savoir si une main donnée contient un carré. 4o) Donner une fonction qui permet de savoir si une main donnée contient un full. Isolé sans amis Le jeu consiste à voir si, dans une population donnée, une personne se retrouve réellement seule. Nous supposons un groupe de n personnes. Nous supposons que chaque personne choisit m personnes comme ”ami”. Une personne est dite seule si aucune personne ne l’a choisie comme ”ami”. Nous désirons savoir s’il y a une personne qui n’a été choisie par aucune autre personne comme ami, donc s’il y a une personne est seule. Nous supposons que les personnes sont numérotées de 1 à n. 1o) Quelle structure de données proposez vous pour décrire l’ensemble des amis d’une personne dommée, puis pour décrire les amitiés entre ces n personnes ? Attention, cette notion d’amitié n’est pas symétrique ! 2o) Donner fonction qui pour la personne i choisit m personnes comme amis, de manière aléatoire. Remarque si on a choisi la seconde structure de données, la fonction est plus simple puisqu’il suffit de rendre le vecteur choisis 3o) En utilisant la fonction définie à la question précédente, écrire une fonction qui pour chaque personne choisit les amis de cette personne. 4o) Écrire une fonction qui compte le nombre de personnes qu’aucune personne n’a choisies comme ami. 5o) Écrire une fonction qui nous donne la r’eponse au problème posé. 6o) Écrire enfin une fonction qui rend donne la ou les personnes qui a ou ont le plus grand nombre d’amis. Rappel : La fonction rand retourne un nombre réel aléatoire, suivant une loi uniforme, compris dans [0, 1[. Vecteurs de RR3 On représente un certain nombre n de vecteurs de IR3 par une matrice T à n lignes et 3 colommes, chaque ligne contenant l’abscisse, l’ordonnée et la cote d’un vecteur. 1o) Dommer une fonction rendant le nombre de vecteurs donr la cote vaut 0 2o) Donner une fonction rendant la sous-matrice constituée des vecteurs dont la cote est égale à 0. 3o) Donner une fonction rendant le minimum et le maximum des ordonnées des vecteurs dont la cote est égale à 0. o ′ ′ ′ ′′ ′′ ′′ 4 p) On recherche les deux vecteurs les plus proches au sens de la distance euclidienne d((a , b , c ), (a , b , c ) = (a′′ − a′ )2 + (b′′ − b′ )2 + (c′′ − c′ )2 , la fonction rendra la distance et les indices de deux lignes contenant des vecteurs présentant cette distance. Détection d’erreurs avec le bit de parité Programmation : Correction d’erreurs de transmission Lorsque l’on transmet des données (ici, une chaı̂ne de bits 0 ou 1), il y a toujours un risque que se produise une erreur. Une façon très élémentaire d’essayer de la détecter est d’utiliser une hh somme de contrôle ii : il s’agit de regrouper les bits en un paquet p de 8 bits, et d’ajouter à la fin de ce paquet un bit : la valeur de la somme modulo 2 des bits du paquet. À la réception, la machine contrôlera que le dernier bit du paquet q transmis est bien la somme de contrôle des 8 premiers bits. Exemple : p=[1 1 0 1 0 1 0 1], on calcule la somme de contrôle égale à 5 modulo 2, c’est-à-dire 1, on transmet le paquet q=[1 1 0 1 0 1 0 1 1] et l’on reçoit le paquet r=[1 0 0 1 0 1 0 1 1] comportant ou non une erreur 1o) Écrire une fonction SCILAB calculant la somme modulo 2 des 8 bits du paquet p et rendant cette somme de contrôle On pourra utiliser la fonction pmodulo : pmodulo(n,2) rend n modulo 2. 2o) Écrire une fonction SCILAB d’argument le paquet p et rendant le paquet q de 9 bits constitués des 8 bits de p et de la somme de contrôle 3o) On transmet q et on reçoit le paquet r. Écrire une fonction SCILAB vérifiant si le paquet r a été bien transmis On supposera ici et dans toute la suite que les transmissions se font sans perte ni ajout de bits et avec au plus une erreur. 4o) La méthode précedente permet de repérer certaines erreurs, mais pas de savoir quel bit est erroné. Nous allons étudier dans la suite une méthode un peu plus évoluée qui permet de corriger l’erreur. page 17 Découpons les données en paquets de 64 bits. Nous imaginerons chaque paquet comme une matrice a = (ai,j )1≤i,j≤8 à 8 lignes et 8 colonnes, construite en remplissant successivement la première ligne de la matrice de la gauche vers la droite, puis la deuxième . . . . 8 Nous associons à cette matrice deux vecteurs à 8 bits l = (li )X et c = (cj )1≤j≤8 définis par : 1≤i≤8 l ≡ a (modulo 2) i i,k 2 k=1 ∀(i, j) ∈ [[1, 8]] , 8 X cj ≡ ak,j (modulo 2) k=1 La première machine transmet à la deuxième le triplet (a,l,c). Celui-ci est reçu par la deuxième machine comme un triplet (b,m,d), b étant une matrice de M8 ({0, 1}), m (respectivement d) des vecteurs contenant huit éléments égaux à 0 ou 1. Aux erreurs de transmission éventuelles près, on devrait avoir : a=b, l=m, c=d. Exemple : a=[1 1 0 1 0 1 0 1; on calcule 1 1 0 1 1 1 0 1; l=[1;0;1;1;1;0;0;0] 0 1 0 1 0 0 0 1; et 1 0 0 1 0 1 1 1; c=[1,1,1,1,0,0,1,1] 1 1 1 1 0 1 0 0; on les envoie... 1 1 0 0 0 1 0 1; 1 1 0 1 1 1 0 1; 1 1 0 1 0 0 0 1] ... et peut recevoir b=[1 1 0 1 0 1 0 1; m=[1;1;1;1;1;0;0;0] 1 1 0 1 1 1 0 1; et 0 1 0 1 0 0 0 1; d=[1,1,1,1,0,0,1,1]. 1 0 0 1 0 1 1 1; 1 1 1 1 0 1 0 0; 1 1 0 0 0 1 0 1; 1 1 0 1 1 1 0 1; 1 1 0 1 0 0 0 1] a) Comment vérifier si la transmission se fait sans erreur ? b) Il peut arriver que l’erreur de transmission se situe dans le vecteur m ou d. Comment s’en rendre compte ? c) Lorsque l’erreur est dans la matrice b, montrer que l’on peut déterminer quel est le bit erroné, et corriger l’erreur. 5o) Écrire en SCILAB les fonctions sommes lignes et sommes colonnes d’argument une matrice carrée d’ordre 8 telles que sommes lignes(a) renvoie le vecteur l et sommes colonnes(b) le vecteur c associés à la matrice a. 6o) Écrire la fonction SCILAB indice discordance d’arguments deux vecteurs u et v de longueurs 8 rendant le premier indice i tel que u(i) 6= v(i). 7o) Écrire la fonction SCILAB correcteur prenant en arguments la matrice b et les vecteurs m et d transmis et rendant la matrice a d’origine. Logique floue À l’inverse de la logique booléenne, la logique floue permet à une condition d’être en un autre état que vrai ou faux. Il y a des degrés dans la vérification d’une condition. Considérons par exemple la température à laquelle se fait la croissance d’une plante dans une serre. La température sera dite correcte entre 15o et 30o , considérée comme trop élevée au-dessus de 30o et comme trop basse en dessous de 15o . La logique booléenne envisagerait les choses de la manière suivante : La température est considérée comme convenable à 100% entre 15o et 30o , et convenable à 0% en dehors. La logique floue, à l’inverse, permet des degrés de vérification de la condition : La température est-elle propice au développement de la plante ? • La température est considérée comme trop basse en dessous de 10o ou trop élevée au-dessus de 35o . La température est inadaptée donc à 100 • Entre T1 = 20o et T2 = 25o , la temp’erature sera parfaite (à 100%) • Entre T0 = 10o et T1 = 20o ou entre T2 = 25o et T3 = 350 , le pourcentage d’adaptation (l’indice) de la température sera donné par interpolation linéaire. Par exemple : — si T = 4 : l’indice est 0 — si T = 14 : l’indice est 0, 4 — si T = 24 : l’indice est 1, page 18 — si T = 34 : l’indice est 0, 1 — si T = 44 : l’indice est 0. L’expérience consiste à mesurer le temps (en jours) que met une certaine plante pour fleurir l̀a tempŕature T . 1o) Comment modéliser les résultats 2o) Donner une fonction qui rend les résultats des expériences qui ont eu lieu à la température T , où T 1 < T < T 2. 3o) Donner une fonction qui pour une série d’expériences rend pour chaque expérience effectuée à la température T , — un indice proportionnel si T 0 < T < T 1 ou si T 2 < T < T 3 — 1 si T 1 ≤ T ≤ T 2 — 0 sinon 4o) Donner une fonction qui donne le temps moyen que met la plante pour fleurir, les résultats des exp’eriences étant pondérés par les indices 5o) Donner une fonction qui classe les expériences selon les indices décroissants Statistiques sur des temperatures On réalise des relevés de la température moyenne journalière de Rennes. Ces relevés sont présentés dans un tableau T à quatre colonnes : année, jour, mois, température. Le tableau T est a été préléalablement défini dans scilab. Lorsque le relevé n’a pas été effectué, on note la température égale à -%inf. 1o) Écrire une fonction qui donne le nombre de données significatives présentes dans le tableau. 2o) Écrire une fonction qui donne le nombre de jours, chaque année, où la température moyenne a été supérieure à 20o C. 3o) Écrire un programme qui donne l’histogramme des fréquences des températures moyennes journalières. Pour simplifier, on considérera que ces températures sont des entiers compris entre −20o C et +40o C. Gestion des feux d’un carrefour Gestion de feux à un carrefour Soit un carrefour croisement d’une route départementale et d’une route nationale. Cet exercice a pour but de modéliser le fonctionnement du boı̂tier de commande gérant ce carrefour. Les feux passent par les états suivants : ... 7→ vert 7→ orange 7→ rouge 7→ vert 7→ ... 1o) Donner à chaque état d’un feu une valeur correspondant à cet état. 2o) Définir une fonction qui fait passer un feu d’un état à son état suivant. 3o) Nous supposons qu’il y a deux fois deux feux N, deux (affichant en même temps la même couleur) correspondants à la nationale qui reste un temps vn au Vert, deux autres D (affichant aussi la même couleur) correspondants à la départementale qui reste un temps vd au vert. Sur les deux voies, le feu orange dure o secondes et, par sécurité, un feu peut passer au vert uniquement si l’autre feu est au rouge depuis au moins s secondes. Écrire la fonction qui engendre le tableau suivant : durée 1 2 ... vn 1 ... o 1 · · · s 1 · · · vd 1 · · · o 1 · · · s N V V ··· V O ··· O R ··· R R ··· R R ··· R R ··· R D V ··· R R ··· R R ··· R R ··· R V ··· V O ··· O R ··· R R ··· N On constate que le vecteur passe périodiquement par 6 états : L’état 1 dure t1 = vn secondes, le deuxième D t2 = o secondes, le troisième t3 = s secondes, le quatrième t4 = vd secondes, le cinquième t5 = o secondes et enfin le sixième t6 = s secondes. Donner une fonction qui donne, à partir du muméro de l’état, le temps tm depuis qu’il n’a pas été modifié et du vecteur [t1 , t2 , t3 , t4 , t5 , t6 ] donne numéro de l’état suivant. 4o) Nous ajoutons un détecteur de voiture sur la départementale. Le feu de la route nationale passe de vert à orange uniquement si cela fait au moins vn secondes qu’il est au vert et que le détecteur détecte la présence d’une voiture sur la route départementale. On suppose que la fonction ilyaunevoituresurladepartementale rend true s’il y a une voiture trop proche du carrefour sur la départementale à l’instant oú elle est invoquée et false sinon. Modifier la fonction engendrant le tableau décrit à la question 3 pour tenir compte de la présence ou de l’absence de véhicules sur la route départementale. Signature d’une permutation page 19 Soit n, entier strictement positif, défini dans scilab comme variable globale. Soit Sn l’ensemble des permutations (bijections) de E = [[1, n]]. Pour tout x ∈ E, il existe un plus petit entier p ∈ IN∗ tel que f p (x) = x. On appelle cycle issu de x de f la suite (x, f (x), f 2 (x), ..., f p−1 (x)). On modélise une permutation de [[1, n]] par un vecteur f = [y1 , y2 , . . . , yn ] où, pour i ∈ [[11, n]], yi = f (i). 1o) Écrire une fonction qui à x ∈ [[1, n]] et f ∈ Sn fait correspondre le cycle [x, f (x), f 2 (x), ..., f p−1 (x)]. 2o) On appelle signature d’une permutation f de Sn le nombre εf , de {−1, 1}, égal à n n Y Y f (j) − f (i) . j−i i=1 j=1+1 (εn est donc égal à 1 si le nombre de couple (i, j) (i < j) tels que f (i) > f (j) est pair et égal à −1 sinon. Donner une fonction calculant la signature d’une permutation f ∈ Sn . 3o) Soient X une partie de E. Donner une fonction rendant un élément (quelconque) du complémentaire d’une partie X dans E. On rendra 0 si X = E. 4o) Décrivons la décomposition d’une permutation f ∈ Sn en cycles disjoints : l’algorithme est le suivant : On prend x quelconque de [[1, n]] et on cherche le cycle Cf (x), si Cf (x) = [[1, n]], f est se décompose en le cycle Cf (x) et c’est terminé. Sinon on prend y quelconque dans le complémentaire de Cf (x) dans E, on recherche le cycle Cf y, si Cf (x) ∪ Cf y = E, c’est terminé. Sinon on recherche le cycle associé à un z ∈ / Cf (x) ∪ Cf y et ainsi de suite jusqu’à ce que la réunion des cycles obtenus soit égale à E. La signature d’un cycle Cf x est (−1)Card(Cf (x))−1 , On montre que la signature de f est le produit des signatures des cycles de sa décomposition en cycles disjoints. En déduire une nouvelle fonction rendant la signature de f . Suite de Kaprekar Suites de Kaprekar Il s’agit de coder une suite de nombres un peu particulière. Le procédé de Kaprekar consiste, pour un nombre donné de 3 chiffres, à prendre ses chiffres et à les réordonner pour former deux nombres : le plus grand et le plus petit possibles. Par exemple avec 324, on forme 234 et 432. On soustrait ensuite ces deux nombres et on recommence le procédé avec le résultat et ainsi de suite. Ainsi : 432 − 234 = 198 981 − 189 = 792 972 − 279 = 693 963 − 369 = 594 954 − 459 = 495 ou, à partir de 600, nombre de trois chiffres contenant des 0 : 600 − 006 = 594 954 − 459 = 495 L’expérience montre qu’on finit par trouver 495, sauf pour les nombres constitués à partir d’un seul et même chiffre (par exemple 333). 1o) Donner les suites de Kaprekar issue de 683, 222 et 121. 2o) Écrire une fonction qui permet d’obtenir le plus petit et le plus grand nombre possibles formés avec trois chiffres contenus dans un vecteur passé en paramètre, ces deux nombres étant renvoyés en sortie eux aussi sous la forme d’un vecteur de chiffres. 3o) Donner la fonction convertissant un nombre de trois chiffres en le vecteur contenant la suite de ses trois chiffres et la fonction réciproque. On rappelle que la fonction pmodulo(a,b) rend le reste de la division euclidienne de a par b. 4o) Écrire une fonction qui renvoie le nombre d’itérations nécessaires pour obtenir 495 via le procédé décrit, pour un nombre donné en paramètre sous forme de vecteur. On renverra +∞ si 495 n’est jamais obtenu. 5o) Écrire une fonction qui rend faux lorsque son argument, un nombre de trois chiffres, est constitué de trois chiffres égaux et vrai sinon. 6o) Écrire une fonction qui prouve que tous les nombres de trois chiffres sur lesquels le procédé de Kaprekar itéré se termine par 495 sont exactement ceux décrits plus haut. Nombres premiers jumeaux page 20 Un nombre premier est un entier naturel, admettant exactement deux diviseurs distincts dans IN : 1 et lui-même. Deux nombres premiers jumeaux sont deux nombres premiers qui ne diffèrent que de deux. Hormis pour la paire (2, 3), cette distance de deux est la plus petite distance possible entre deux nombres premiers. Parmi les nombres premiers jumeaux, on trouve 5 et 7, 11 et 13 ou 821 et 823. Le crible d’Eratosthène permet de trouver les nombres premiers inférieurs à un entier n donné : On forme la liste des entiers de 1 à n et on barre 1 qui n’est pas premier par définition — On considère le premier nombre de cette liste (non encore barré), soit en premier lieu 2 : il est premier. On barre tous ses multiples qui ne sont pas premier. — On répète cette dernière opération en considérant le prochain nombre non barré. Les nombres restants sont premiers. 1o) Quelle structure de données choisir pour exécuter cet algorithme ? 2o) Donner une fonction rendant le crible d’Eratosthène entre 1 et n. 3o) Écrire une fonction qui donne la liste des couples de nombres premiers jumeaux inférieurs à n. 4o) Écrire une fonction qui calcule la somme des inverses des nombres jumeaux trouvés. La limite de cette somme lorsque n tend vers +∞ est finie, c’est la constante de Brun. Nuage (x, f (x))x et une droite de regression Soit X un sous-ensemble fini de IR, F l’ensemble des applications définies sur X à valeurs dans IR. f ∈ F est décrite par une matrice Mf de format Card X × 2 dont chaque ligne contient un point de X et son image par f . 1o) Écrire la fonction f qui à x ∈ X fait correspondre f (x). 2o) On définit une “distance” dX entre les applications définies sur X et à valeurs dans IR : sX (f2 (x) − f1 (x))2 . dX (f1 , f2 ) = x∈X Donner une fonction d’arguments les matrices M f1 et M f2 de f1 et f2 , donnant la distance d entre deux fonctions f1 et f2 définies sur X. 3o) Donner la fonction d’argument la “matrice” de f donnant les moyennes, lorsque x décrit X, x des x, f (x) des f (x), x2 des x2 , f 2 (x), xf (x) des xf (x). On pourra remarquer que si x et y sont deux vecteurs colonnes de longueur n x’*y est le réel n X xi yi . i=1 o 4 ) On pose 2 V (x) = x2 − x2 , V (f (x)) = f 2 (x) − f (x) , Cov(x, f (x)) = xf (x) − xf (x). Donner la fonction d’arguments les moyennes calculées par la fonction précédente qui calcule ces trois valeurs. 5o) Soit la droite d’équation Cov(x, f (x)) (x − x) + f (x). f˜(x) = y = V (x) Donner une fonction, d’argument M f , donnant la distance dX (f, f˜) entre f et f˜. Applications : distance et comparaison Soit X un sous-ensemble fini de IR. Une fonction f définie sur X est décrite par une matrice Mf , de format 2×Card(X), dont la première ligne contient les éléments de X et la seconde ligne leurs images par f . 1o) Créer une fonction ayant pour arguments d’entrée la variable x et la matrice de f , comme argument de sortie f (x) et qui rend un message d’erreur si x n’est pas dans l’ensemble de définition de f . 2o) On définit une “distance” dX entre les applications f et g de X dans IR par : sX dX (f, g) = (f (x) − g(x))2 . x∈X Écrire une fonction qui calcule la distance de deux fonctions définies sur X. 3o) Construire une fonction dont les entrées sont les matrices de f et g et qui rend vrai si pour tout élément x de X on a f (x) ≤ g(x) et faux sinon. Diverses opérations sur les vecteurs d’entiers de [[0,9]] page 21 On donne un vecteur u composé de n valeurs entières allant de 0 à 9. 1o) Donner une fonction qui permet de réaliser la somme des valeurs de u. 2o) Donner une fonction qui permet de décaler toutes les valeurs de u vers la droite. La dernière valeur se trouvera en première position. 3o) Donner une fonction qui permet de vérifier si le vecteur u est symétrique (c’est-à-dire que la première valeur est égale à la nième , la 2ième à la (n − 1)ième , etc...) 4o) On note sym(u), le vecteur symétrique de u, c’est-à-dire le vecteur dont les valeurs sont celles de u, mais dans l’ordre inverse. a) Donner une fonction qui rend sym(u). b) Donner une fonction qui calcule v = u + sym(u). c) On cherche à obtenir, à partir du vecteur v obtenu à la question précédente, un vecteur w qui posséderait lui aussi des valeurs comprises entre 0 et 9. Pour cela, lorsqu’un entier de w a deux chiffres, on le remplacera par la somme de ses deux chiffres. Donner la fonction qui permet de passer de v à w. 5o) La somme obtenue dans la question 1 excède, en général, 9. Expliciter une fonction la remplaçant par la somme de ses chiffres, et itérant le procédé lorsque la nouvelle somme excède 9, afin de rendre un nombre inférieur ou égal à 9. Recherche de valeurs dans un vecteur On dispose d’un vecteur de longueur l contenant des entiers classés par ordre croissant. 1o) Écrire une fonction qui calcule la moyenne des valeurs du vecteur. 2o) On se propose de hh situer ii la moyenne dans ce vecteur. a) Par une méthode pas à pas : écrire une fonction qui recherche la place de la moyenne dans le vecteur par incrémentation. b) Par la méthode de dichotomie. 3o) Laquelle de ces deux méthodes est la plus efficace si l = 3 ? Et si l = 300 ? Full, carré au poker Le poker se joue avec un jeu de 52 cartes. Nous nous intéressons à la présence d’un carré (quatre cartes de même hauteur) et d’un full (deux cartes de même hauteur et trois autres cartes de même hauteur lors de la première donne de cinq cartes. 1o) Proposer une modélisation d’une donne de poker en tenant compte de que l’on recherche. 2o) Écrire une fonction qui nous donne une main de 5 cartes au hasard. 3o) Donner une fonction qui permet de savoir si une main donnée contient un carré. 4o) Donner une fonction qui permet de savoir si une main donnée contient un full. Une transposition du problème du sac à dos À la suite d’un tremblement de terre, un premier avion de secours est prêt à partir : il ne reste plus qu’à le charger. Les stocks sur le lieu de départ sont constitués d’engins de 4 à 10 tonnes. L’avion ne peut pas charger plus de 150 tonnes. 1o) Quelle structure de donnée prendre pour décrire ces stocks constitués de n engins. Donner une fonction créant des engins de poids aléatoire dans les stocks On rappelle la fonction rand (sans argument =()) qui rend un réel aléatoire dans [0, 1[. 2o) Afin de gérer le stock, donner une fonction donnant le nombre d’engins le constituant, puis le poids total de ces engins. 3o) Écrire une fonction créant un chargement aléatoire (on choisit successivement des engins au hasard et on s’arrête juste avant de dépasser les 150 tonnes). 4o) Pour choisir, à poids inférieur à 150 tonnes, un chargement utilisant le plus d’engins, écrire une fonction rendant un chargement de cardinal maximum parmi m chargements trouvés avec la fonction précedente. 5o) Soyons sérieux : donner une fonction, qui étant donnés les stocks, donne un chargement de moins de 150 tonnes de cardinal maximum. Isolé sans amis Le jeu consiste à voir si, dans une population donnée, une personne se retrouve réellement seule. Nous supposons un groupe de n personnes. Nous supposons que chaque personne choisit m personnes comme ”ami”. Une personne est dite seule si aucune personne ne l’a choisie comme ”ami”. page 22 Nous désirons savoir s’il y a une personne qui n’a été choisie par aucune autre personne comme ami, donc s’il y a une personne est seule. Nous supposons que les personnes sont numérotées de 1 à n. 1o) Quelle structure de données proposez vous pour décrire l’ensemble des amis d’une personne dommée, puis pour décrire les amitiés entre ces n personnes ? Attention, cette notion d’amitié n’est pas symétrique ! 2o) Donner fonction qui pour la personne i choisit m personnes comme amis, de manière aléatoire. Remarque si on a choisi la seconde structure de données, la fonction est plus simple puisqu’il suffit de rendre le vecteur choisis 3o) En utilisant la fonction définie à la question précédente, écrire une fonction qui pour chaque personne choisit les amis de cette personne. 4o) Écrire une fonction qui compte le nombre de personnes qu’aucune personne n’a choisies comme ami. 5o) Écrire une fonction qui nous donne la r’eponse au problème posé. 6o) Écrire enfin une fonction qui rend donne la ou les personnes qui a ou ont le plus grand nombre d’amis. Rappel : La fonction rand retourne un nombre réel aléatoire, suivant une loi uniforme, compris dans [0, 1[. page 23