Skip to content
Extraits de code Groupes Projets
Valider 51acd057 rédigé par Loïc DUBARD's avatar Loïc DUBARD :speech_balloon:
Parcourir les fichiers

reformulation des commentaires

parent ea33ec01
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
* date : 03-03-2019 * date : 03-03-2019
* *) * *)
(* [split_string s] retourne la liste de caracteres correspondant à la chaine [s] *) (*
* @ensure : retourne la liste de caracteres correspondant à la chaine [s]
*)
let split_string s = let split_string s =
let rec aux i n = let rec aux i n =
if i >= n if i >= n
...@@ -14,11 +16,9 @@ let split_string s = ...@@ -14,11 +16,9 @@ let split_string s =
in in
aux 0 (String.length s);; aux 0 (String.length s);;
(* [parse_input ()] lit deux lignes sur l'entree standard du programme. (* @ensure : lit deux lignes sur l'entree standard du programme et Retourne un couple composé de l'entier de la premiere ligne et de la liste des caracteres de la seconde.
La premiere doit comporter un entier, la seconde une chaine de caracteres. * @require : La premiere doit comporter un entier, la seconde une chaine de caracteres.
Retourne un couple composé de l'entier de la premiere ligne et de la liste des caracteres de la seconde. * @exception : Leve l'exception [Failure "int_of_string"] si la premiere ligne ne represente pas un entier.
Leve l'exception [Failure "int_of_string"] si la premiere ligne ne represente pas un entier.
*) *)
let parse_input () = let parse_input () =
...@@ -33,7 +33,10 @@ print_elt 1 (parse_input());;*) ...@@ -33,7 +33,10 @@ print_elt 1 (parse_input());;*)
(*définition de la roue*) (*définition de la roue*)
let roue = ' '::'A'::'B'::'C'::'D'::'E'::'F'::'G'::'H'::'I'::'J'::'K'::'L'::'M'::'N'::'O'::'P'::'Q'::'R'::'S'::'T'::'U'::'V'::'W'::'X'::'Y'::'Z'::[];; let roue = ' '::'A'::'B'::'C'::'D'::'E'::'F'::'G'::'H'::'I'::'J'::'K'::'L'::'M'::'N'::'O'::'P'::'Q'::'R'::'S'::'T'::'U'::'V'::'W'::'X'::'Y'::'Z'::[];;
(*[first_to_last c n roue] tourne la roue n fois vers la gauche si c='N' et vers la droite si c='P'*) (*
* @ensure : tourne la roue n fois vers la gauche si c='N' et vers la droite si c='P'
* @exception : renvoie l'exception RoueVide si la roue en entree est vide.
*)
exception RoueVide;; exception RoueVide;;
let rec tourner c n roue = let rec tourner c n roue =
if n = 0 then roue if n = 0 then roue
...@@ -43,8 +46,11 @@ let rec tourner c n roue = ...@@ -43,8 +46,11 @@ let rec tourner c n roue =
else if c='P' then List.rev (tourner 'N' n (List.rev roue)) else if c='P' then List.rev (tourner 'N' n (List.rev roue))
else roue;; else roue;;
(*[char_to_index i a r] cherche récursivement l'indice du charactère a dans la roue r (*
* i doit être 0 pour que ça marche*) * @ensure : cherche récursivement l'indice du charactère a dans la roue r
* @require : i doit être 0 au premier appel de la fonction pour que ça marche
* @exception : leve l'exception BadCharacter si le charactère n'a pas été trouvé dans la roue
*)
exception BadCharacter;; exception BadCharacter;;
let rec char_to_index i a r= let rec char_to_index i a r=
match r with match r with
...@@ -52,14 +58,17 @@ let rec char_to_index i a r= ...@@ -52,14 +58,17 @@ let rec char_to_index i a r=
| e::l -> if a = e then i | e::l -> if a = e then i
else char_to_index (i+1) a l;; else char_to_index (i+1) a l;;
(*[translate c roue] traduit le charactère c en sa commande en fonction de la roue 'roue' (* @ensure : traduit le charactère c en sa commande en fonction de la roue 'roue'
* la limite d'optimalité pour choisir entre P et N est le charactère 'M' qui demande 13N et 14P*) * la limite d'optimalité pour choisir entre P et N est le charactère 'M' qui demande 13N et 14P
*)
let translate c roue = let translate c roue =
let n = char_to_index 0 c roue in let n = char_to_index 0 c roue in
if (n < 14) then String.concat "" ((String.make n 'N')::"E"::[]),n if (n < 14) then String.concat "" ((String.make n 'N')::"E"::[]),n
else String.concat "" ((String.make (27-n) 'P')::"E"::[]),(27-n);; else String.concat "" ((String.make (27-n) 'P')::"E"::[]),(27-n);;
(*[commande (i,l) roue] prend le résultat de l'input et renvoie la commande complète associée'*) (*
* @ensure : prend le résultat de l'input et renvoie la commande complète associée
*)
exception InputVide;; exception InputVide;;
let rec commande (i,l) roue = match l with let rec commande (i,l) roue = match l with
| [] -> "" | [] -> ""
...@@ -73,14 +82,18 @@ print_string (com);; ...@@ -73,14 +82,18 @@ print_string (com);;
(************************************************************Début de la phase 2************************************************************) (************************************************************Début de la phase 2************************************************************)
(*[temps_lettre l] retourne le temps necessaire pour l'emission de la commmande partielle l*) (*
* @ensure : retourne le temps necessaire pour l'emission de la commmande partielle l
*)
let temps_lettre l = let temps_lettre l =
if (l='N' || l='P') then 3 if (l='N' || l='P') then 3
else if l='S' then 1 else if l='S' then 1
else if l='E' then 5 else if l='E' then 5
else 0;; else 0;;
(*[temps_commande s] retourne le temps necessaire à l'emission de la commande complète s*) (*
* @ensure : retourne le temps necessaire à l'emission de la commande complète s
*)
let temps_commande s = let temps_commande s =
let liste_char = split_string s in let liste_char = split_string s in
let rec tps l = match l with let rec tps l = match l with
...@@ -95,13 +108,17 @@ Printf.printf "\n %d s\n" (temps_commande com);; ...@@ -95,13 +108,17 @@ Printf.printf "\n %d s\n" (temps_commande com);;
let liste_roues=roue::[] let liste_roues=roue::[]
(*[make_liste_index l c] renvoie la liste des indices où se trouve le charactère c dans chaque roue de l*) (*
* @ensure : renvoie la liste des indices où se trouve le charactère c dans chaque roue de l
*)
let rec make_liste_index l c = match l with let rec make_liste_index l c = match l with
| [] -> [] | [] -> []
| e::r -> (char_to_index 0 c e)::(make_liste_index r c);; | e::r -> (char_to_index 0 c e)::(make_liste_index r c);;
(*[quelle_roue l c] renvoi l'indice de la roue (dans la liste de roues l) avec laquelle il est plus rapide de traduire c*) (*
* @ensure : renvoi l'indice de la roue (dans la liste de roues l) avec laquelle il est plus rapide de traduire c
*)
let quelle_roue l c index_init = let quelle_roue l c index_init =
let index = (char_to_index 0 c roue) in let index = (char_to_index 0 c roue) in
let m = (if index < 14 then index else 27-index) in let m = (if index < 14 then index else 27-index) in
...@@ -117,7 +134,9 @@ let quelle_roue l c index_init = ...@@ -117,7 +134,9 @@ let quelle_roue l c index_init =
index_min m (List.length l) 0 (make_liste_index l c);; index_min m (List.length l) 0 (make_liste_index l c);;
(*[tourner_list m c n i l] tourne n fois dans le sens de c la roue d'indice i dans la liste de roues l*) (*
* @ensure : tourne n fois dans le sens de c la roue d'indice i dans la liste de roues l
*)
let rec tourner_list c n i l = let rec tourner_list c n i l =
if i >= (List.length l) then List.append l (roue::[]) if i >= (List.length l) then List.append l (roue::[])
else match l with else match l with
...@@ -125,7 +144,9 @@ let rec tourner_list c n i l = ...@@ -125,7 +144,9 @@ let rec tourner_list c n i l =
| e::t -> if i = 0 then (List.append ((tourner c n e)::[]) t) | e::t -> if i = 0 then (List.append ((tourner c n e)::[]) t)
else (List.append (e::[]) (tourner_list c n (i-1) t));; else (List.append (e::[]) (tourner_list c n (i-1) t));;
(*[commande_phase2 (i,l) roue] traduit le message l en commande en selectionnant pour chaque lettre la bonne antenne*) (*
* @ensure : traduit le message l en commande en selectionnant pour chaque lettre la bonne antenne
*)
let rec commande_phase2 (i,l) liste_roues index_init = match l with let rec commande_phase2 (i,l) liste_roues index_init = match l with
| [] -> "" | [] -> ""
| e::t -> let index = quelle_roue liste_roues e index_init in | e::t -> let index = quelle_roue liste_roues e index_init in
...@@ -136,7 +157,7 @@ let rec commande_phase2 (i,l) liste_roues index_init = match l with ...@@ -136,7 +157,7 @@ let rec commande_phase2 (i,l) liste_roues index_init = match l with
Printf.printf "%d\n" index; Printf.printf "%d\n" index;
String.concat "" (sres::(commande_phase2 (i,t) new_liste index)::[]);; String.concat "" (sres::(commande_phase2 (i,t) new_liste index)::[]);;
(*test commande_phase2*) (*@ensure : test commande_phase 2*)
let com2 = commande_phase2 input liste_roues 0;; let com2 = commande_phase2 input liste_roues 0;;
print_string com2;; print_string com2;;
Printf.printf "\n %d s \n" (temps_commande com2);; Printf.printf "\n %d s \n" (temps_commande com2);;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter