Les itérateurs

Ces exercices portent sur iter / into_iter, map, filter, fold, zip, les consommateurs (sum, min, max, count...) et l'évaluation paresseuse. Faites-les dans l'ordre. Essayez de n'utiliser aucune boucle for.

Somme des carrés pairs

Calculer la somme des carrés des entiers pairs de 1 à n inclus, avec une chaîne d'itérateurs.

  • Objectif : (1..=n), filter, map, sum.
  • Signature suggérée : fn somme_carres_pairs(n: u32) -> u32.
  • Cas de test : somme_carres_pairs(10) -> 220 (4 + 16 + 36 + 64 + 100), somme_carres_pairs(1) -> 0.

Produit scalaire

Calculer le produit scalaire de deux slices de même longueur.

  • Objectif : zip, map, sum.
  • Signature suggérée : fn produit_scalaire(a: &[i64], b: &[i64]) -> i64.
  • Cas de test : produit_scalaire(&[1, 2, 3], &[4, 5, 6]) -> 32, produit_scalaire(&[], &[]) -> 0.

Mot le plus long

Renvoyer le mot le plus long d'une phrase. En cas d'égalité, le premier.

  • Objectif : split_whitespace, fold Option.
  • Signature suggérée : fn plus_long(phrase: &str) -> Option<&str>.
  • Cas de test : plus_long("le chat dort tranquillement") -> Some("tranquillement"), plus_long("") -> None, plus_long("a bb cc") -> Some("bb").

Réimplémenter count

Écrire une fonction qui compte les éléments d'un itérateur en utilisant uniquement fold (pas .count()).

  • Objectif : fold, accumulateur.
  • Signature suggérée : fn compte<I: Iterator>(it: I) -> usize.
  • Cas de test : compte(0..10) -> 10, compte(vec![1, 2, 3].into_iter()) -> 3, compte(std::iter::empty::<i32>()) -> 0.

Moyennes mobiles (fenêtre de 2)

À partir d'un slice de f64, renvoyer le vecteur des moyennes de chaque paire d'éléments consécutifs.

  • Objectif : slice::windows(2), map.
  • Signature suggérée : fn moyennes_paires(v: &[f64]) -> Vec<f64>.
  • Cas de test : moyennes_paires(&[1.0, 3.0, 5.0]) -> [2.0, 4.0], moyennes_paires(&[10.0]) -> [].