From aea97249141e802fbe9190edbdd1b1f0742b7c63 Mon Sep 17 00:00:00 2001 From: Matthew Gretton-Dann Date: Wed, 25 Dec 2024 12:34:08 +0000 Subject: [PATCH] Add 2025 day 25. --- bin/day2425.ml | 34 ++++++++++++++++++++++++++++++++++ bin/dune | 6 ++++-- 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 bin/day2425.ml diff --git a/bin/day2425.ml b/bin/day2425.ml new file mode 100644 index 0000000..7804726 --- /dev/null +++ b/bin/day2425.ml @@ -0,0 +1,34 @@ +let pin_count = 5 +let height = 7 + +let read_lock_or_key lst = + let result = Array.make pin_count 0 in + let add_node i c = if c = '#' then result.(i) <- result.(i) + 1 in + List.iter (String.iteri add_node) lst; + result |> Array.to_list + +let locks_and_keys_of_list = + let rec impl locks keys = function + | [] -> (locks, keys) + | "" :: t -> impl locks keys t + | a :: b :: c :: d :: e :: f :: g :: t -> + let h = read_lock_or_key [ a; b; c; d; e; f; g ] in + if a = String.make pin_count '#' then impl locks (h :: keys) t + else impl (h :: locks) keys t + | _ -> failwith "locks_and_keys_of_list" + in + impl [] [] + +let locks_and_keys_of_file fname = + Aoc.strings_of_file fname |> locks_and_keys_of_list + +let lock_key_fit lock key = + List.map2 ( + ) lock key |> List.for_all (( >= ) height) + +let count_keys keys lock = List.filter (lock_key_fit lock) keys |> List.length + +let count_locks_and_keys (locks, keys) = + List.map (count_keys keys) locks |> List.fold_left ( + ) 0 + +let _ = + Aoc.main locks_and_keys_of_file [ (string_of_int, count_locks_and_keys) ] diff --git a/bin/dune b/bin/dune index 23c4cc1..9304fc6 100644 --- a/bin/dune +++ b/bin/dune @@ -23,7 +23,8 @@ day2421 day2422 day2423 - day2424) + day2424 + day2425) (names day2401 day2402 @@ -48,5 +49,6 @@ day2421 day2422 day2423 - day2424) + day2424 + day2425) (libraries str aoc))