summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Jesus <adbjesus@gmail.com>2025-12-01 13:39:12 +0000
committerAlexandre Jesus <adbjesus@gmail.com>2025-12-01 13:50:17 +0000
commit04381ba237f9bc3c0a28d7c8fa5f6f748a9997e9 (patch)
treea6cca70de40ea4429f469a4bb5796f3d49b0e89e
parentd7b315005ca063df0ae734cc8804ee3ce2c20e84 (diff)
downloadaoc2025-04381ba237f9bc3c0a28d7c8fa5f6f748a9997e9.tar.gz
aoc2025-04381ba237f9bc3c0a28d7c8fa5f6f748a9997e9.zip
Day 1
-rw-r--r--.gitmodules4
-rw-r--r--lib/day01.ml44
2 files changed, 44 insertions, 4 deletions
diff --git a/.gitmodules b/.gitmodules
index 0de780d..12c8bea 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: Copyright 2025 Alexandre Jesus <https://adbjesus.com>
+#
+# SPDX-License-Identifier: CC0-1.0
+
[submodule "data"]
path = data
url = git@git.adbjesus.com:aoc2025data
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"