open Scanf ;; open Printf ;; let decode_sequence : string -> string = function (* código das letras *) "123457" -> "A" | "1234567" -> "B" | "456" -> "C" | "1580" -> "D" | "12456" -> "E" | "1249" -> "F" | "12569" -> "G" | "13457" -> "H" | "37" -> "I" | "3567" -> "J" | "13459" -> "K" | "156" -> "L" | "12357" -> "M" | "3579" -> "N" | "123567" -> "O" | "1458" -> "P" | "12347" -> "Q" | "123459" -> "R" | "12467" -> "S" | "278" -> "T" | "13567" -> "U" | "1378" -> "V" | "135790" -> "W" | "90" -> "X" | "1347" -> "Y" | "23456" -> "Z" | "0" -> " " | str -> str ;; let decode_line : string -> string = fun s -> (* decodifica a linha *) let res : string ref = ref "" (* armazena resultado após cada caractere ser analisada *) and seq : string ref = ref "" in (* armazena sequência *) for i = 0 to ( String.length s ) - 1 do (* ler caractere por caractere *) let c : char = String.get s i in if c >= 'A' && c <= 'Z' then (* verifica se a caractere na posição é uma letra *) (* esvazia sequência e tenta decodificá-la e armazena resultado *) begin res := !res ^ ( decode_sequence !seq ) ^ ( Char.escaped c ) ; seq := "" end else if c >= '0' && c <= '9' then (* verifica se a caractere na posição é um número *) let tmp : string = decode_sequence !seq in if tmp >= "A" && tmp <= "Z" || tmp = " " then (* verifica se a sequência armazenada já pode ser decodificada *) begin res := !res ^ tmp ; seq := ( Char.escaped c ) end (* senão , a sequência cresce *) else seq := !seq ^ ( Char.escaped c ) else ( ) ; (* verifica se já não é o final , o resto da sequência deve ser analisado*) if i = ( String.length s ) - 1 then begin res := !res ^ ( decode_sequence !seq ) ; seq := "" end else ( ) done ; !res ;; let program () = let ident : in_channel -> string = fun ic -> ( Scanf.bscanf ( Scanf.Scanning.from_string ( input_line ic ) ) "%s" ( fun n -> n ) ) and ic : in_channel ref = ref ( open_in "desafio.in" ) and oc : out_channel ref = ref ( open_out "desafio.out" ) in for i = 1 to ( int_of_string ( ident !ic ) ) do Printf.fprintf !oc "Phrase %i: %s\n" i ( decode_line ( ident !ic ) ) ; done ; close_out !oc ;; program () ;;