4.4 Le carré qui rend fou
fichier source
(* Affichage de carrés *)
(* exercice 1 *)
let rec ligne n =
". " ^ (
if (n > 1) then
ligne (n - 1)
else
"\n"
);;
(* exercice 2 *)
let rec carre n =
let rec carre_aux = function
0 -> "\n"
| k -> ligne n ^ (carre_aux (k - 1))
in
carre_aux n;;
(* Affichage de carrés d'étoiles*)
(* exercice 3 *)
let rec etoiles a b n =
if (n = 0) then
"\n"
else
(
if (a <= 1 && b >= 1) then
"* "
else
". "
)
^ (etoiles (a-1) (b-1) (n-1));;
(* exercice 4 *)
let carre_etoiles (lhaut, lbas, cgauche, cdroite) n =
let rec carre_aux lhaut lbas k =
if (k > n) then
"\n"
else
(
(
if (lhaut <= 1 && lbas >= 1) then
etoiles cgauche cdroite n
else
ligne n
)
^ (carre_aux (lhaut - 1) (lbas - 1) (k + 1))
)
in
carre_aux lhaut lbas 1;;
(* Enumération des carrés *)
(* exercice 5 *)
let rec couples_coordonnees_a_fixe a b =
if (a > b) then
[]
else
(couples_coordonnees_a_fixe a (b-1))@[(a, b)];;
(* exercice 6 *)
let couples_coordonnees n =
let rec couples_coordonnees_aux a =
if (a > n) then
[]
else
couples_coordonnees_a_fixe a n@(couples_coordonnees_aux (a+1))
in
couples_coordonnees_aux 1;;
(* exercice 7 *)
let rec coordonnees_carres_colonnes_fixees (cgauche, cdroite) n =
if (n <= cdroite - cgauche) then
[]
else
coordonnees_carres_colonnes_fixees (cgauche, cdroite) (n-1)
@[(n - (cdroite - cgauche), n, cgauche, cdroite)];;
(* exercice 8 *)
let coordonnees_carres n =
let colonnes = couples_coordonnees n in
let rec complete_coordonnees colonnes =
match colonnes with
[] -> []
| h::t -> coordonnees_carres_colonnes_fixees h n
@(complete_coordonnees t) in
complete_coordonnees colonnes;;
(* exercice 9 *)
let tous_les_carres n =
let rec liste_carres l = match l with
[] -> []
| coord::t -> carre_etoiles coord n::(liste_carres t)
in
liste_carres (coordonnees_carres n);;
(* exercice 10 *)
let rec print_str_list = function
[] -> print_string "\n";
| h::t -> print_string h; print_str_list t;;
print_str_list (tous_les_carres 3);;
(* Enumération des rectangles *)
(* exercice 11 *)
let rec concat_produits (a, b) l = match l with
[] -> []
| (c, d)::t -> (a, b, c, d)::(concat_produits (a, b) t);;
(* exercice 12 *)
let rec croise_coordonnees a b = match a with
[] -> []
| h::t -> (concat_produits h b)@(croise_coordonnees t b);;
(* exercice 13 *)
let coordonnees_rectangles n =
let colonnes = couples_coordonnees n in
croise_coordonnees colonnes colonnes;;
(* exercice 14 *)
let tous_les_rectangles n =
let rec liste_rectangles l = match l with
[] -> []
| coord::t -> carre_etoiles coord n::(liste_rectangles t)
in
liste_rectangles (coordonnees_rectangles n);;
(* exercice 15 *)
(*
Il existe C n+1 n façons de choisir les lignes et autant de façons de
choisir les colonnes, donc...
*)