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

Documents pareils