summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/day01.ml44
1 files changed, 40 insertions, 4 deletions
diff --git a/lib/day01.ml b/lib/day01.ml
index e1d6457..9a983a6 100644
--- a/lib/day01.ml
+++ b/lib/day01.ml
@@ -4,8 +4,44 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*)
-let part1 _ch =
- failwith "Unimplemented"
+let parse_rotation s =
+ let num = lazy (int_of_string (String.sub s 1 ((String.length s) - 1))) in
+ match s.[0] with
+ | 'R' -> Lazy.force num
+ | 'L' -> -(Lazy.force num)
+ | s -> failwith (Printf.sprintf "Unknown rotation %c" s)
-let part2 _ch =
- failwith "Unimplemented"
+let parse_rotations ch =
+ In_channel.input_all ch
+ |> String.trim
+ |> String.split_on_char '\n'
+ |> List.map parse_rotation
+
+let part1 ch =
+ let m = 100 in
+ let s = 50 in
+ parse_rotations ch
+ |> List.fold_left
+ (fun (a, p) r ->
+ let nxt = (p + r) mod m in
+ let inc = if nxt = 0 then 1 else 0 in
+ (a + inc, nxt)
+ )
+ (0, s)
+ |> fst
+ |> Printf.printf "%d\n"
+
+let part2 ch =
+ let m = 100 in
+ let s = 50 in
+ parse_rotations ch
+ |> List.fold_left
+ (fun (a, p) r ->
+ let nxt = p + r in
+ let inc = (abs nxt) / m + if p > 0 && nxt <= 0 then 1 else 0 in
+ let nxt = ((nxt mod m) + m) mod m in
+ (a + inc, nxt)
+ )
+ (0, s)
+ |> fst
+ |> Printf.printf "%d\n"