first 4 days
This commit is contained in:
70
2/main.ml
Normal file
70
2/main.ml
Normal 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
|
Reference in New Issue
Block a user