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 @@
* 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 rec aux i n =
if i >= n
......@@ -14,11 +16,9 @@ let split_string s =
in
aux 0 (String.length s);;
(* [parse_input ()] lit deux lignes sur l'entree standard du programme.
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.
Leve l'exception [Failure "int_of_string"] si la premiere ligne ne represente pas un entier.
(* @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.
* @require : La premiere doit comporter un entier, la seconde une chaine de caracteres.
* @exception : Leve l'exception [Failure "int_of_string"] si la premiere ligne ne represente pas un entier.
*)
let parse_input () =
......@@ -33,7 +33,10 @@ print_elt 1 (parse_input());;*)
(*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'::[];;
(*[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;;
let rec tourner c n roue =
if n = 0 then 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 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;;
let rec char_to_index i a r=
match r with
......@@ -52,14 +58,17 @@ let rec char_to_index i a r=
| e::l -> if a = e then i
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'
* la limite d'optimalité pour choisir entre P et N est le charactère 'M' qui demande 13N et 14P*)
(* @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
*)
let translate c roue =
let n = char_to_index 0 c roue in
if (n < 14) then String.concat "" ((String.make n 'N')::"E"::[]),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;;
let rec commande (i,l) roue = match l with
| [] -> ""
......@@ -73,14 +82,18 @@ print_string (com);;
(************************************************************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 =
if (l='N' || l='P') then 3
else if l='S' then 1
else if l='E' then 5
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 liste_char = split_string s in
let rec tps l = match l with
......@@ -95,13 +108,17 @@ Printf.printf "\n %d s\n" (temps_commande com);;
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
| [] -> []
| 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 index = (char_to_index 0 c roue) in
let m = (if index < 14 then index else 27-index) in
......@@ -117,7 +134,9 @@ let quelle_roue l c index_init =
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 =
if i >= (List.length l) then List.append l (roue::[])
else match l with
......@@ -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)
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
| [] -> ""
| 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
Printf.printf "%d\n" 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;;
print_string 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.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter