solve_1.ml 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. open Stdio
  2. open Str
  3. module CharSet = Set.Make(Char)
  4. module IntSet = Set.Make(Int)
  5. let input_info =
  6. let rec one_string inp nb_rows nb_columns =
  7. let line = In_channel.input_line In_channel.stdin in
  8. match line with
  9. | None -> (inp, (nb_rows, nb_columns))
  10. | Some x -> one_string (inp ^ x) (nb_rows + 1) (String.length x)
  11. in one_string "" 0 0
  12. ;;
  13. let input = (fst input_info);;
  14. let nb_rows = (fst (snd input_info));;
  15. let nb_columns =(snd (snd input_info));;
  16. let encode_movement direction pos =
  17. match direction with
  18. | '^' -> let new_pos = pos - nb_columns in
  19. if (new_pos < 0) then -1 else new_pos
  20. | 'v' -> let new_pos = (pos + nb_columns) in
  21. if (new_pos < (nb_rows*nb_columns)) then -1 else new_pos
  22. | '<' -> let new_pos = (pos - 1) in
  23. if (new_pos mod nb_columns == nb_columns -1) then -1 else
  24. if (new_pos < 0) then -1 else new_pos
  25. | '>' -> let new_pos = (pos + 1) in
  26. if (new_pos mod nb_columns == 0) then -1 else
  27. if (new_pos >= (nb_rows*nb_columns)) then -1 else new_pos
  28. | _ -> -1 (*Not supposed to happen*)
  29. ;;
  30. let get_antennas =
  31. let rec aux pos accum=
  32. try
  33. let pos_antenna = search_forward (regexp {|[^.]|}) input pos in
  34. aux (pos_antenna + 1) (CharSet.add input.[pos_antenna] accum)
  35. with Not_found -> accum
  36. in
  37. aux 0 CharSet.empty
  38. ;;
  39. let solve = 0
  40. ;;
  41. let () = printf "Antennas : ";
  42. CharSet.iter (fun a -> printf "%c " a) get_antennas;
  43. printf "\n";
  44. printf "Total: %d\n" solve;;