improved code quality day2
This commit is contained in:
@ -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 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 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 1: %i\n" Aoc25.Day2.day2_part1
|
||||||
|
let () = Printf.printf "Solution Day 2 part 2: %i\n" Aoc25.Day2.day2_part2
|
||||||
|
|||||||
25
lib/day2.ml
25
lib/day2.ml
@ -6,6 +6,8 @@ let is_valid ((start, ending): string * string) : bool =
|
|||||||
let filtered_out = start_length mod 2 != 0 && end_length mod 2 != 0 && start_length == end_length in
|
let filtered_out = start_length mod 2 != 0 && end_length mod 2 != 0 && start_length == end_length in
|
||||||
not filtered_out
|
not filtered_out
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let generate_tuple (value : string) : (string * string) =
|
let generate_tuple (value : string) : (string * string) =
|
||||||
let split = String.split_on_char '-' value in
|
let split = String.split_on_char '-' value in
|
||||||
match split with
|
match split with
|
||||||
@ -25,34 +27,33 @@ let is_invalid (number: int) : bool =
|
|||||||
let invalid = is_even && first_part = last_part in
|
let invalid = is_even && first_part = last_part in
|
||||||
invalid
|
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 start_number = int_of_string start in
|
||||||
let end_number = int_of_string ending in
|
let end_number = int_of_string ending in
|
||||||
let rec loop i acc =
|
let rec loop i acc =
|
||||||
if i > end_number then 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
|
in
|
||||||
loop start_number 0
|
loop start_number 0
|
||||||
|
|
||||||
|
let calculate_invalidities entries inv =
|
||||||
let rec calculate_invalidities (entries: (string * string) list) (result : int): int =
|
List.fold_left (fun acc entry -> acc + calculate_for_line entry inv) 0 entries
|
||||||
match entries with
|
|
||||||
| x :: xs -> calculate_invalidities xs (result + calculate_for_line x)
|
|
||||||
| _ -> result
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let solve_part1 (inputs: string list) : int =
|
let solve_part1 (inputs: string list) : int =
|
||||||
let inputs = generate_pairs inputs in
|
let inputs = generate_pairs inputs in
|
||||||
let filtered = List.filter is_valid inputs in
|
let filtered = List.filter is_valid inputs in
|
||||||
let result = 0 in
|
calculate_invalidities filtered is_invalid
|
||||||
calculate_invalidities filtered result
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let solve_part2 (inputs: string list) : int =
|
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 =
|
let day2_part1 : int =
|
||||||
solve_part1 input
|
solve_part1 input
|
||||||
|
|||||||
Reference in New Issue
Block a user