From d8dc1a750a5678fa4445b1e927e8a8051c1d07e1 Mon Sep 17 00:00:00 2001 From: Klotz Date: Wed, 3 Dec 2025 13:19:29 +0100 Subject: [PATCH] improved code quality day2 --- bin/main.ml | 1 + lib/day2.ml | 25 +++++++++++++------------ lib/dune | 3 ++- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/bin/main.ml b/bin/main.ml index 3ee6bed..74c46a0 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -1,3 +1,4 @@ let () = Printf.printf "Solution Day 1 part 1: %i\n" Aoc25.Day1.day1_part1 let () = Printf.printf "Solution Day 1 part 2: %i\n" Aoc25.Day1.day1_part2 let () = Printf.printf "Solution Day 2 part 1: %i\n" Aoc25.Day2.day2_part1 +let () = Printf.printf "Solution Day 2 part 2: %i\n" Aoc25.Day2.day2_part2 diff --git a/lib/day2.ml b/lib/day2.ml index f357b0e..10ba501 100644 --- a/lib/day2.ml +++ b/lib/day2.ml @@ -5,6 +5,8 @@ let is_valid ((start, ending): string * string) : bool = let end_length = String.length ending in let filtered_out = start_length mod 2 != 0 && end_length mod 2 != 0 && start_length == end_length in not filtered_out + + let generate_tuple (value : string) : (string * string) = let split = String.split_on_char '-' value in @@ -25,34 +27,33 @@ let is_invalid (number: int) : bool = let invalid = is_even && first_part = last_part in invalid + let is_invalid_2 (number: int) : bool = + let number_string = string_of_int number in + let pattern = Str.regexp "\\(.+\\)\\1+$" in + Str.string_match pattern number_string 0 -let calculate_for_line ((start, ending) : (string * string)) : int = +let calculate_for_line ((start, ending) : (string * string)) (inv: int -> bool) : int = let start_number = int_of_string start in let end_number = int_of_string ending in let rec loop i acc = if i > end_number then acc - else loop (i + 1) (acc + if is_invalid i then i else 0) + else loop (i + 1) (acc + if inv i then i else 0) in loop start_number 0 - -let rec calculate_invalidities (entries: (string * string) list) (result : int): int = - match entries with - | x :: xs -> calculate_invalidities xs (result + calculate_for_line x) - | _ -> result - - +let calculate_invalidities entries inv = + List.fold_left (fun acc entry -> acc + calculate_for_line entry inv) 0 entries let solve_part1 (inputs: string list) : int = let inputs = generate_pairs inputs in let filtered = List.filter is_valid inputs in - let result = 0 in - calculate_invalidities filtered result + calculate_invalidities filtered is_invalid let solve_part2 (inputs: string list) : int = - List.length inputs + let inputs = generate_pairs inputs in + calculate_invalidities inputs is_invalid_2 let day2_part1 : int = solve_part1 input diff --git a/lib/dune b/lib/dune index 85360cf..70714db 100644 --- a/lib/dune +++ b/lib/dune @@ -1,2 +1,3 @@ (library - (name aoc25)) + (name aoc25) + (libraries str))