summary refs log tree commit diff stats
path: root/day2.ml
diff options
context:
space:
mode:
Diffstat (limited to 'day2.ml')
-rw-r--r--day2.ml39
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)