~soapdog/desafio-4-ocaml

3665c63f9a21052ee1b29cf3cfc3cc82930641bc — andre alves garzia 3 years ago 4ea8018 master
comentarios
1 files changed, 18 insertions(+), 5 deletions(-)

M desafio.ml
M desafio.ml => desafio.ml +18 -5
@@ 1,18 1,29 @@
(* 
  Desafio 04: Mais info em https://osprogramadores.com/desafios/d04/
  
  Autor: Andre Alves Garzia <andre@andregarzia.com>

  Objetivo: Contar as peças de tabuleiro de Xadrez.

  PS: Eu não sei OCaml...
*)
open Core

(* converte string -> chars *)
let tabuleiro_para_chars s =
  let rec exp i l =
    if i < 0 then l else exp (i - 1) (s.[i] :: l) in
    exp (String.length s - 1) []

(* retorna 0 ou 1 dependendo se a peça encontrada for a desejada *)
let verifica_peca peca_atual peca_desejada =
  let peca_str = String.of_char peca_atual in
  let r = compare peca_str peca_desejada in
    match r with
    match r with  (* isso é um pattern matching *)
      0 -> 1
    | _ -> 0
 

(* imprime o relatorio de saida *)
let calcula_saida entrada =
  let chars = tabuleiro_para_chars entrada in
  let peoes = List.fold ~init: 0 ~f:(fun acc p -> acc + (verifica_peca p "1")) chars in


@@ 29,7 40,7 @@ let calcula_saida entrada =
    printf "rainhas: %d\n" rainhas;
    printf "reis: %d\n" reis
    

(* abre o arquivo e passa o controle para a funcao anterior *)
let processa file =
  let entrada = In_channel.with_file file ~f:(fun ic -> In_channel.input_all ic) in
    print_endline "Entrada:";


@@ 37,11 48,13 @@ let processa file =
    printf "\nSaida:\n";
    calcula_saida entrada

(* especificacao do parametro de linha de comando *)
let spec =
  let open Command.Spec in
    empty
    +> anon ("arquivo" %: string)
  

(* especificacao das opcoes de linha de comando *)
let cli =
  Command.basic
    ~summary:"Calcula desafio 04"


@@ 49,6 62,6 @@ let cli =
    spec
    (fun filename () -> processa filename)

(* roda o app*)
let () =
  Command.run ~version:"1.0" ~build_info:"AAG" cli
(* normal exit: all channels are flushed and closed *)
\ No newline at end of file