feat: day2
This commit is contained in:
@ -13,7 +13,7 @@ let read_lines name =
|
|||||||
let () =
|
let () =
|
||||||
print_endline "\nAdvent of Code 2024";
|
print_endline "\nAdvent of Code 2024";
|
||||||
let part1, part2 =
|
let part1, part2 =
|
||||||
read_lines "./inputs/01.txt" |> AdventOfCode2024.Day_01.solve
|
read_lines "./inputs/02.txt" |> AdventOfCode2024.Day_02.solve
|
||||||
in
|
in
|
||||||
Printf.printf "Part 1: %s\nPart 2: %s\n" (string_of_int part1)
|
Printf.printf "Part 1: %s\nPart 2: %s\n" (string_of_int part1)
|
||||||
(string_of_int part2)
|
(string_of_int part2)
|
||||||
|
76
AdventOfCode2024/lib/day_02.ml
Normal file
76
AdventOfCode2024/lib/day_02.ml
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
open Scanf
|
||||||
|
|
||||||
|
let handle_line line = sscanf line "%d %d" (fun num1 num2 -> (num1, num2))
|
||||||
|
let sort_list l = List.sort compare l
|
||||||
|
let print_list l = List.iter (Printf.printf "%d ") l
|
||||||
|
|
||||||
|
let line_to_list line =
|
||||||
|
String.split_on_char ' ' line |> List.map (fun i -> int_of_string i)
|
||||||
|
|
||||||
|
let is_valid_report l =
|
||||||
|
let rec increasing l =
|
||||||
|
match l with
|
||||||
|
| [] -> true
|
||||||
|
| [ _ ] -> true
|
||||||
|
| head :: h2 :: tail ->
|
||||||
|
if head >= h2 || h2 - head > 3 then false else increasing ([ h2 ] @ tail)
|
||||||
|
in
|
||||||
|
let rec decreasing l =
|
||||||
|
match l with
|
||||||
|
| [] -> true
|
||||||
|
| [ _ ] -> true
|
||||||
|
| head :: h2 :: tail ->
|
||||||
|
if head <= h2 || head - h2 > 3 then false else decreasing ([ h2 ] @ tail)
|
||||||
|
in
|
||||||
|
|
||||||
|
match l with
|
||||||
|
| [] -> true
|
||||||
|
| [ _ ] -> true
|
||||||
|
| h1 :: h2 :: tail ->
|
||||||
|
if h1 > h2 then decreasing ([ h1; h2 ] @ tail)
|
||||||
|
else increasing ([ h1; h2 ] @ tail)
|
||||||
|
|
||||||
|
let rec range x y = if x > y then [] else x :: range (x + 1) y
|
||||||
|
|
||||||
|
let list_premutations l =
|
||||||
|
let rec loop original_list nth index acc =
|
||||||
|
match original_list with
|
||||||
|
| [] -> acc
|
||||||
|
| head :: tail ->
|
||||||
|
if index == nth then loop tail nth (index + 1) acc
|
||||||
|
else loop tail nth (index + 1) ([ head ] @ acc)
|
||||||
|
in
|
||||||
|
let indexes = range 0 (List.length l - 1) in
|
||||||
|
|
||||||
|
let premutations =
|
||||||
|
List.fold_left
|
||||||
|
(fun acc index -> [ List.rev (loop l index 0 []) ] @ acc)
|
||||||
|
[] indexes
|
||||||
|
in
|
||||||
|
premutations
|
||||||
|
|
||||||
|
let list_or l =
|
||||||
|
let rec loop l' acc =
|
||||||
|
match l' with [] -> acc | head :: tail -> head || loop tail acc
|
||||||
|
in
|
||||||
|
loop l false
|
||||||
|
|
||||||
|
let solve lines =
|
||||||
|
let reports = List.map line_to_list lines in
|
||||||
|
let part1 =
|
||||||
|
List.fold_left
|
||||||
|
(fun acc i -> if is_valid_report i then acc + 1 else acc)
|
||||||
|
0 reports
|
||||||
|
in
|
||||||
|
let premutations = List.map list_premutations reports in
|
||||||
|
|
||||||
|
let attempted_gaps =
|
||||||
|
List.map (fun i -> List.map is_valid_report i) premutations
|
||||||
|
in
|
||||||
|
|
||||||
|
let part2 =
|
||||||
|
List.fold_left
|
||||||
|
(fun acc bool_list -> if list_or bool_list then acc + 1 else acc)
|
||||||
|
0 attempted_gaps
|
||||||
|
in
|
||||||
|
(part1, part2)
|
Reference in New Issue
Block a user