Travaux Pratiques #7
Algo & Prog avec R
Table des matières
1. Ensembles et Dictionnaires
Ensemble d’entiers aléatoires
- Définissez deux ensemble
e2
ete3
de 10 entiers aléatoires de [0,20]. - Faites afficher la réunion, l’intersection, la différence asymétrique, et la différence symétrique de
e2
ete3
.
Histoire de s’amuser !
Supposons que R ne dispose pas des fonctions ensemblistes. Comment programmeriez-vous les fonctions Union(x,y)
, Intersection(x,y)
, et Difference(x,y)
(asymétrique) sur des vecteurs non triées avec répétitions.
Dictionnaire simple
Créez un petit dictionnaire d1 ayant trois couples var:val dont les valeurs ont des types distincts.
- Faites afficher le type de d1.
- Faites afficher la liste des clés de d1.
- Faites afficher l’ensemble des valeurs de d1.
- Demandez la valeur de la clé « foo », puis « toto ».
Dictionnaire aléatoire
- Programmez une fonction
RandomDict()
, retournant un dictionnaire aléatoire de longueur 10.- Les 10 clés distinctes seront choisies au hasard parmi les entiers de [0,20].
- Les valeurs associées à ces clés (non nécessairement distinctes) seront choisies parmi les voyelles ’a’,’e’,’i’,’o’,’u’,’y’.
- Posons ensuite
d2 <- RandomDict()
. - Faites afficher le nombres de clés paires de
d2
. - Faites afficher les valeurs distinctes de
d2
.
Filtrage des clés par valeur
Programmez une fonction GetKeys(d,v)
retournant l’ensemble des clés d’un dictionnaire quelconque d
, dont la valeur associée est v
.
Rappel : les clés sont uniques, mais pas les valeurs!
2. Fréquence des mots dans une chaîne
Vous êtes invités à essayer la méthode strsplit
qui renvoie une liste de vecteurs de character
séparés par un séparateur split
:
- Utilisez les méthodes
strsplit
ettable
pour programmer une fonctionFrequences(str)
prenant une chaînestr
et retournant un vecteur nommé contenant les fréquences d’apparition de chaque mot destr
. - Modifiez votre solution pour que le résultat soit trié par la fréquence en utilisant la fonction
sort
. - En déduire une fonction
PlusFrequents(str)
retournant les mots les plus fréquents.
Frequences(" ") str <- "do re do mi do la la mi la" Frequences(str) PlusFrequents(str)
integer(0) words do la mi re 3 3 2 1 [1] "do" "la"
3. Algorithme de Bezout
L’algorithme de Bezout prolonge l’algorithme d’Euclide. Il dit qu’il est possible d’écrire le PGCD g de a et b comme combinaison linéaire de a et b à coefficients entiers : il existe u et v (non uniques) tels que g = a*u + b*v. Par exemple 4 = 8*(-1) + 12*1.
- On se propose de programmer une fonction
bezout(a,b)
retournant un triplet (g,u,v). - Montrez que si l’on sait calculer bezout(b,a %% b), alors on peut en déduire bezout(a,b).
- Programmez une fonction
bezout(a,b)
récursive. Testez-la surbezout(8,12)
. - Programmez une fonction
AfficherBezout(a,b)
affichant la décomposition g = a*u + b*v.AfficherBezout(8, 12) AfficherBezout(120,23) AfficherBezout(5040,4116)
-1 * 8 + 1 * 12 = 4 -9 * 120 + 47 * 23 = 1 9 * 5040 + -11 * 4116 = 84
- Programmez une fonction
Bezout(a,b)
itérative. Testez-la surbezout(8,12)
.
4. Jeu de Pendu
Le pendu est un jeu consistant à trouver un mot en devinant quelles sont les lettres qui le composent.
- Programmer une fonction
JeuPendu()
sans limite du nombre de coups. Le joueur entre une lettres au clavier jusqu’à ce qu’il ait trouvé le mot. - Modifier la fonction
JeuPendu(n)
pour que le joueur soit déclaré perdant aprèsn
erreurs.
Vous pouvez utiliser la fonction suivante pour capturer les saisies au claviers.
Read1 <- function(x) { cat(sprintf("Entrer %s :\n", x)) word <- scan(file = "", what = "character", n = 1, quiet = TRUE) stopifnot(length(word) == 1) return(word) }
Le déroulement du jeu doit s’inspirer de l’exemple ci-dessous.
> JeuPendu() Entrer un mot : 1: ici Tapez Ctrl + L pour effacer l'écran. Entrer une lettre : 1: a Tour 1 : ___ Entrer une lettre : 1: i Tour 2 : i_i Entrer une lettre : 1: b Tour 3 : i_i Entrer une lettre : 1: c Tour 4 : ici >