You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
2.0 KiB
OCaml

let get_one_line file =
try Some (input_line file) with
End_of_file -> None
let get_lines file =
let rec input lines =
match get_one_line file with
Some line -> input (line :: lines)
| None -> List.rev lines
in input []
(* --- *)
type password_set = { min : int; max : int; chr : char; pw : string };;
let line_to_set line = (* convert a line from the file into a password_set *)
let [rng; chr; pw] = String.split_on_char ' ' line in (* split on spaces *)
let chr = String.get chr 0 in (* strip colon and convert to char *)
let [min; max] = List.map int_of_string (String.split_on_char '-' rng) in (* pull out the min and max from the range, map to Int *)
{ min; max; chr; pw }
(* stolen from SO.. *)
let explode s = (* convert a string to a list of chars *)
let rec exp i l =
if i < 0 then l else exp (i - 1) (s.[i] :: l) in
exp (String.length s - 1) [];;
let char_count el str =
List.length (List.filter (fun c -> c == el) (explode str))
let is_valid_day1_password set =
let count = char_count set.chr set.pw in
(*Printf.printf "%s %c count: %i min: %i, max: %i, in range: %b\n" set.pw set.chr count set.min set.max (count >= set.min && count <= set.max);*)
count >= set.min && count <= set.max
let is_valid_day2_password set =
let is_valid = ((String.get set.pw (set.min-1)) == set.chr) <> ((String.get set.pw (set.max-1)) == set.chr) in
(*Printf.printf "%s %c min: %i, max: %i, char-at-min: %c, char-at-max: %c, valid: %b\n" set.pw set.chr set.min set.max (String.get set.pw (set.min-1)) (String.get set.pw (set.max-1)) is_valid;*)
is_valid
let file = "day2.txt"
let channel = open_in(file)
let lines = get_lines channel
let sets = List.map line_to_set lines
let valid_day1_passwords = List.filter is_valid_day1_password sets;;
Printf.printf "valid day1 password count: %i\n" (List.length valid_day1_passwords)
let valid_day2_passwords = List.filter is_valid_day2_password sets;;
Printf.printf "valid day2 password count: %i\n" (List.length valid_day2_passwords)