Devoir Surveillé 
“Calcul Symbolique”
Licence 2 Informatique
Mardi 15 décembre 2015

Durée 2 heures. Le barème est donné de manière purement indicative. Il est demandé d’écrire les solutions dans ce document, n’hésitez pas à utiliser le format texte pour expliquer votre démarche.

I. Paradigmes de programmation (6 points)

Ecrire une fonction Entre[liste,a,b] qui extrait d’une liste  tous  les nombres entiers  qui sont compris au sens large entre a et b. On demande d’écrire 4 versions de cette fonction, une version itérative, une autre récursive, une version fonctionnelle et enfin une dernière utilisant les patterns.

liste={a,2,3,Pi,7/2,5,3.1,7,10,12};
Entre1[liste,2,5]
Entre2[liste,2,5]
Entre3[liste,2,5]
Entre4[liste,2,5]

II. Jeux de dés (8 points)

On jette 5 dés (à six faces) et on observe le résultat du lancer qui est une suite croissante de nombres entre 1 et 6.

1. Ecrire une  procédure Lancer[] qui retourne une suite croissante de nombres entiers entre 1 et 6. (2 points)

Lancer[]

2. Ecrire une fonction CarreQ[lancer] qui teste si un lancer contient un carré, c’est à dire 4 valeurs égales.(2 points)

CarreQ[{1,2,2,2,2}]
CarreQ[Lancer[]]

3. Ecrire une fonction BrelanQ[lancer] qui teste si un lancer contient un brelan, c’est à dire 3 valeurs égales d’une part et 3 valeurs égales de l’autre. (2 points)

BrelanQ[{2,2,2,3,3}]
BrelanQ[Lancer[]]

3. Ecrire une fonction SuiteQ[lancer] qui teste si un lancer contient une suite, c’est à dire 5 valeurs consécutives (2 points)

SuiteQ[lancer_]:=lancer==Range[5]||lancer==1+Range[5]

II. Nuages de points sur (([0,1])^2) (16 points)

1. Génération (2 points)

Ecrire une fonction CreerNuage[n] qui génère n points à l’intérieur du carré [0,1]x[0,1].

nuage=CreerNuage[10]

2. Représentation Graphique (4 points)

Ecrire une fonction DessinerNuage[n] qui représente les  n points.  
Représentez chaque point par autre chose qu’un cercle.

DessinerNuage[nuage]
DessinerNuage[nuage,✶,Red]

3. Ordre (2 points)

Ecrire une fonction OrdonnerNuageX (resp. OrdonnerNuageY) qui ordonne un nuage de points selon les abscisses croissants (resp. ordonnées croissantes)

OrdonnerNuageX[nuage]
OrdonnerNuageY[nuage]

4. Distance minimale et point le plus proche (6 points)

4.1. Ecrire une fonction  DistanceMin[nuage,P]  qui retourne la distance minimale non nulle entre le point P et les points du nuage. Autrement dit, on retourne la distance de P à son plus proche voisin.

4.2. Ecrire une fonction PlusProcheVoisin[nuage,P]  qui retourne le point du nuage à  distance minimale non nulle avec le point P.

4.3. Illustrer ces fonctions en représentant graphiquement le nuage, le point P et le disque centré en P de rayon DistanceMin[nuage,P].

P={.5,.5};
DistanceMin[nuage,P]
PlusProcheVoisin[nuage,P]
IllustrationDistanceMinimale[nuage,P]

5. Ecrire un programme (de complexité quadratique) qui calcule la distance minimale des paires de points dans un nuage. (2 points)

DistanceMin[nuage]