summaryrefslogtreecommitdiff
path: root/2025/ocaml/lib/application/d01p01.ml
diff options
context:
space:
mode:
authorDJ O'Leary <dijitol@proton.me>2025-12-01 22:51:45 +0100
committerDJ O'Leary <dijitol@proton.me>2025-12-01 22:51:45 +0100
commitcdbf4be6fa793ca1286604bdc2a1bb5c9e6a197a (patch)
tree071845ef3ceee7cbf571a0e8c86f01e79a55ca95 /2025/ocaml/lib/application/d01p01.ml
parentc725cde0c8badeea5a2b720778a0d68c5054c9c9 (diff)
refactor(2025d1p1): rename files to order correctly and include part number
Diffstat (limited to '2025/ocaml/lib/application/d01p01.ml')
-rw-r--r--2025/ocaml/lib/application/d01p01.ml49
1 files changed, 49 insertions, 0 deletions
diff --git a/2025/ocaml/lib/application/d01p01.ml b/2025/ocaml/lib/application/d01p01.ml
new file mode 100644
index 0000000..75e1b17
--- /dev/null
+++ b/2025/ocaml/lib/application/d01p01.ml
@@ -0,0 +1,49 @@
+open Domain.D01p01
+
+let rec input_to_lines input =
+ let lines =
+ String.split_on_char '\n' input |> List.filter (fun l -> l <> "")
+ in
+ pp_lines lines ; lines
+
+and pp_lines = function
+ | [] ->
+ ()
+ | h :: t ->
+ Logs.debug (fun m -> m "Line=%s" h) ;
+ pp_lines t
+
+let parse_line line =
+ Scanf.sscanf line "%c%d" (fun d n ->
+ match d with
+ | 'L' ->
+ Dial.Left n
+ | 'R' ->
+ Dial.Right n
+ | _ ->
+ failwith "invalid direction" )
+
+let lines_to_turns =
+ List.map (fun (l : string) ->
+ Logs.debug (fun m -> m "parsing %s into turn" l) ;
+ let turn = parse_line l in
+ Logs.debug (fun m -> m "%s" (Dial.pp_direction turn)) ;
+ turn )
+
+let rec turn_aux count current = function
+ | [] ->
+ count
+ | h :: t ->
+ let current' = Dial.turn current h in
+ Logs.debug (fun m -> m "dial at %d" (Dial.to_int current')) ;
+ if Dial.to_int current' = 0 then turn_aux (count + 1) current' t
+ else turn_aux count current' t
+
+let turn current = turn_aux 0 current
+
+let solve input () =
+ let lines = input_to_lines input in
+ let turns = lines_to_turns lines in
+ let start = Dial.start in
+ let answer = turn start turns in
+ answer