diff options
| author | Trey Bastian <2991824+TreyBastian@users.noreply.github.com> | 2024-12-04 19:26:20 +0000 |
|---|---|---|
| committer | Trey Bastian <2991824+TreyBastian@users.noreply.github.com> | 2024-12-04 19:26:20 +0000 |
| commit | 5081ea9a0f5bb09023ae957f22b1c79f40ac87db (patch) | |
| tree | 414b4040d6409dad30be14a8c31cabc42ca94741 | |
| parent | 04b11a994f3ef63a150c047be6a94cd384804422 (diff) | |
day 2 ocaml part 1 & 2
| -rw-r--r-- | 2024/day_02.ml | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/2024/day_02.ml b/2024/day_02.ml new file mode 100644 index 0000000..d05cb5c --- /dev/null +++ b/2024/day_02.ml @@ -0,0 +1,49 @@ +let filename = "./day_02_input.txt" +let try_read ic = try Some (input_line ic) with End_of_file -> None + +let is_values_safe a b direction = + match direction with + | "up" -> a < b && abs (a - b) < 4 + | "down" -> a > b && abs (a - b) < 4 + | _ -> false + +let direction a b = if a < b then "up" else "down" + +let is_line_safe list = + let a, b = (List.hd list, List.tl list |> List.hd) in + let direction = direction a b in + List.fold_left + (fun (acc, prev) x -> + if prev > -1 then (acc && is_values_safe prev x direction, x) else (acc, x)) + (true, -1) list + |> fst + +let is_line_safe_part_2 list = + List.mapi + (fun i _ -> List.filteri (fun j _ -> j <> i) list |> is_line_safe) + list + |> List.exists (fun x -> x) + +let calculate_safe_score ic is_line_safe = + let rec calculate acc = + match try_read ic with + | Some line -> ( + match + is_line_safe (String.split_on_char ' ' line |> List.map int_of_string) + with + | true -> calculate (acc + 1) + | false -> calculate acc) + | None -> + close_in ic; + acc + in + calculate 0 + +let () = + let ic = open_in filename in + calculate_safe_score ic is_line_safe + |> Printf.sprintf "Safe %d" |> print_endline; + + let ic = open_in filename in + calculate_safe_score ic is_line_safe_part_2 + |> Printf.sprintf "Safe %d" |> print_endline |
