first 4 days

This commit is contained in:
2024-12-05 22:41:23 +01:00
commit 7c9a40aaba
5 changed files with 336 additions and 0 deletions

70
2/main.ml Normal file
View File

@@ -0,0 +1,70 @@
open Printf;;
open String;;
let rec list_of_lines in_file =
try
let line = input_line in_file in
line :: list_of_lines(in_file)
with End_of_file ->
close_in in_file;
[]
let is_not_empty lst =
match lst with
| [] -> false
| _ -> true
let rec parse_int_list str =
let list1 = (List.filter (fun a -> length a != 0) (String.split_on_char ' ' str)) in
List.map int_of_string list1
let rec int_list_diff int_list =
match int_list with
| e1 :: e2 :: tail -> e2 - e1 :: int_list_diff (e2 :: tail)
| _ -> []
let list_diffs_safe diff_list =
match diff_list with
| n :: tail ->
if n > 0 then
List.for_all (fun x -> x >= 1 && x <= 3) diff_list
else if n < 0 then
List.for_all (fun x -> x >= -3 && x <= -1) diff_list
else
false
| _ -> true
let rec list_diff_safe_with_tolerance_inner last condition tol diff_list =
match diff_list with
| x :: tail ->
if condition x then
list_diff_safe_with_tolerance_inner x condition tol tail
else if tol then
match tail with
| x2 :: tail2 ->
list_diff_safe_with_tolerance_inner 0 condition false (x + x2 :: tail2)
|| list_diff_safe_with_tolerance_inner 0 condition false (last + x :: tail)
| _ -> true
else
false
| _ -> true
let list_diff_safe_with_tolerance diff_list =
if list_diff_safe_with_tolerance_inner 0 (fun x -> x >= 1 && x <= 3) true diff_list
|| list_diff_safe_with_tolerance_inner 0 (fun x -> x >= -3 && x <= -1) true diff_list then
true
else
match diff_list with
| _ :: tail -> list_diffs_safe tail
| _ -> true
let () =
let f = open_in "input.txt" in
let lines = list_of_lines f in
let diffs = List.map (fun a -> int_list_diff @@ parse_int_list a) lines in
(* List.iter (fun a -> List.iter (printf "%d, ") a; printf "\n") diffs *)
let count = List.fold_left (fun acc l -> if list_diffs_safe l then acc + 1 else acc) 0 diffs in
let count2 = List.fold_left (fun acc l -> if list_diff_safe_with_tolerance l then acc + 1 else acc) 0 diffs in
printf "%d\n" count;
printf "%d\n" count2