diff options
Diffstat (limited to 'day2.ml')
-rw-r--r-- | day2.ml | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/day2.ml b/day2.ml new file mode 100644 index 0000000..2843dcd --- /dev/null +++ b/day2.ml @@ -0,0 +1,39 @@ +#use "topfind";; +#thread;; +#require "core";; +#require "stdio";; +#require "csv";; + +open Core +open Stdio + +let spreadsheet = Csv.load ~separator:'\t' "day2.txt" + |> List.map ~f:(List.map ~f:int_of_string) + +let minmax = List.fold_left + ~init:(Int.max_value, Int.min_value) + ~f:(fun (lmin, lmax) x -> (min x lmin, max x lmax)) + +let part1 l = List.map ~f:minmax l + |> List.map ~f:(fun (lmin, lmax) -> lmax - lmin) + |> List.fold_left ~f:(+) ~init:0 + +let rec dividend row = + let divisible a b = + a mod b = 0 || b mod a = 0 in + let divide a b = + if a mod b = 0 then a/b else b/a in + + match row with + | [] -> 0 + | h::t -> + match List.find t ~f:(divisible h) with + | Some x -> divide h x + | None -> dividend t + +let part2 l = List.map ~f:dividend l + |> List.fold_left ~f:(+) ~init:0 + +let () = + Printf.printf "%d\n" (part1 spreadsheet); + Printf.printf "%d\n" (part2 spreadsheet) |