diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d3cdafe79193b58574ffc1e934bab278e90f16d2 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +CC=ocamlc +FLAGS= + +all: main.out + +main.out: src/main.ml + $(CC) $(FLAGS) -o bin/$@ $< diff --git a/bin/main.out b/bin/main.out new file mode 100755 index 0000000000000000000000000000000000000000..853635e75b272ac6cd770ab0de447022d30cfe67 Binary files /dev/null and b/bin/main.out differ diff --git a/src/.main.ml.swp b/src/.main.ml.swp new file mode 100644 index 0000000000000000000000000000000000000000..3d7974d031461db160c1b5f4e2efd87ccd974c68 Binary files /dev/null and b/src/.main.ml.swp differ diff --git a/src/main.cmi b/src/main.cmi new file mode 100644 index 0000000000000000000000000000000000000000..6cbabdbc13301f8aa24da602d401972daa8fbb0e Binary files /dev/null and b/src/main.cmi differ diff --git a/src/main.cmo b/src/main.cmo new file mode 100644 index 0000000000000000000000000000000000000000..75dc3bc49d33ac8e12eae058a00efa8f032b23e7 Binary files /dev/null and b/src/main.cmo differ diff --git a/src/main.ml b/src/main.ml new file mode 100644 index 0000000000000000000000000000000000000000..9b3d38ef13a18c23ac0a941087b2cd6f6f59657b --- /dev/null +++ b/src/main.ml @@ -0,0 +1,59 @@ +(* + * author : Loïc Dubard + * file: main.ml + * Fichier principal + * date : 03-03-2019 + * *) + +(* [split_string s] retourne la liste de caracteres correspondant à la chaine [s] *) +let split_string s = + let rec aux i n = + if i >= n + then [] + else (String.get s i)::aux (i+1) n + 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. + *) + +let parse_input () = + let nb_antennas = int_of_string (read_line ()) in + let phrase = read_line () in + nb_antennas,split_string phrase;; + +(*let print_elt n (i,l) = print_char (List.nth l n);; + +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'::[];; + +(*[translate c] traduit le charactère c en sa commande + * la limite d'optimalité pour choisir entre P et N est le charactère 'M' qui demande 13N et 14P*) +exception BadCharacter of char;; +let translate c = + (*[char_to_index i a r] cherche récursivement l'indice du charactère a dans la roue r*) + let rec char_to_index i a r= + match r with + | [] -> raise (BadCharacter a) + | e::l -> if a == e then i + else char_to_index (i+1) a l + in + let n = char_to_index 0 c roue in + if (n < 14) then String.concat "" ((String.make n 'N')::"E"::[]) + else String.concat "" ((String.make (27-n) 'P')::"E"::[]);; + +(*[commande (i,l)] prend le résultat de l'input et renvoie la commande complète associée'*) +(*let commande (i,l) = List.fold_left (fun acc e -> (String.concat "" (acc::(translate e)::[]))) [] l;;*) +exception InputVide;; +let rec commande (i,l) = match l with + | [] -> "" + | e::r -> String.concat "" ((translate e)::(commande (i,r))::[]);; + + +print_string (commande (parse_input()));;