feat: day2

This commit is contained in:
2024-12-02 18:33:37 +00:00
parent f1cef4376f
commit 6e927cd05b
2 changed files with 77 additions and 1 deletions

View File

@ -13,7 +13,7 @@ let read_lines name =
let () =
print_endline "\nAdvent of Code 2024";
let part1, part2 =
read_lines "./inputs/01.txt" |> AdventOfCode2024.Day_01.solve
read_lines "./inputs/02.txt" |> AdventOfCode2024.Day_02.solve
in
Printf.printf "Part 1: %s\nPart 2: %s\n" (string_of_int part1)
(string_of_int part2)

View 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)