My yearly advent-of-code solutions
1let filename = "./day_01_input.txt"
2
3let () =
4 let ic = open_in filename in
5
6 let try_read () = try Some (input_line ic) with End_of_file -> None in
7
8 let rec read_lines left right =
9 match try_read () with
10 | Some line -> (
11 let ints =
12 Str.split_delim (Str.regexp " ") line |> List.map int_of_string
13 in
14 match ints with
15 | [ a; b ] -> read_lines (a :: left) (b :: right)
16 | _ -> failwith "invalid")
17 | None ->
18 close_in ic;
19 (List.sort compare left, List.sort compare right)
20 in
21 let left, right = read_lines [] [] in
22 let sum =
23 List.map2 ( - ) left right |> List.map abs |> List.fold_left ( + ) 0
24 in
25 Printf.sprintf "Sum %d" sum |> print_endline;
26 let sim =
27 List.map
28 (fun x -> x * (List.filter (fun y -> x == y) right |> List.length))
29 left
30 |> List.fold_left ( + ) 0
31 in
32 Printf.sprintf "Sim %d" sim |> print_endline