From b9e3907e4db69724795d02920d1eddb3d5e03499 Mon Sep 17 00:00:00 2001 From: Matthew Gretton-Dann Date: Wed, 11 Dec 2024 08:07:26 +0000 Subject: [PATCH] Day 2024 day 11 part 1 and incredibly slow part 2 --- bin/day2411.ml | 47 +++++++++++++++++++++++++++++++++++++++++++++++ bin/dune | 6 ++++-- 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 bin/day2411.ml diff --git a/bin/day2411.ml b/bin/day2411.ml new file mode 100644 index 0000000..7b6e737 --- /dev/null +++ b/bin/day2411.ml @@ -0,0 +1,47 @@ +let load_file fname = + match In_channel.with_open_text fname In_channel.input_line with + | Some x -> x + | None -> failwith "load_file" + +let log10i i = + let rec impl acc = function 0 -> acc | x -> impl (acc + 1) (x / 10) in + assert (i > 0); + impl ~-1 i + +let digits10 i = 1 + log10i i + +(** [pow10 n] returns [10] raised to the [n]th power. [n] must be non-negative. +*) +let pow10 n = + let rec impl acc = function 0 -> acc | x -> impl (acc * 10) (x - 1) in + assert (n >= 0); + impl 1 n + +let rec apply_n n fn arg = if n <= 0 then arg else apply_n (n - 1) fn (fn arg) + +(* +let print_int_list lst = + List.iter + (fun i -> + print_int i; + print_char ' ') + lst; + print_newline (); + () +*) +let calc n input = + let rec step_rec acc = function + | [] -> acc + | 0 :: t -> step_rec (1 :: acc) t + | x :: t when digits10 x mod 2 = 0 -> + let pow = pow10 (digits10 x / 2) in + let left = x / pow in + let right = x mod pow in + step_rec (right :: left :: acc) t + | x :: t -> step_rec ((x * 2024) :: acc) t + in + apply_n n (step_rec []) input + +let part1 str = Aoc.ints_of_string str |> calc 25 |> List.length +let part2 str = Aoc.ints_of_string str |> calc 75 |> List.length +let _ = Aoc.main load_file [ (string_of_int, part1); (string_of_int, part2) ] diff --git a/bin/dune b/bin/dune index a607d83..ac41748 100644 --- a/bin/dune +++ b/bin/dune @@ -9,7 +9,8 @@ day2407 day2408 day2409 - day2410) + day2410 + day2411) (names day2401 day2402 @@ -20,5 +21,6 @@ day2407 day2408 day2409 - day2410) + day2410 + day2411) (libraries str aoc))