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 () ;;
Hosted by www.Geocities.ws

1