summaryrefslogtreecommitdiff
path: root/2025/ocaml/lib/application/day_1.ml
diff options
context:
space:
mode:
authorDJ O'Leary <dijitol@proton.me>2025-12-01 14:24:35 +0100
committerDJ O'Leary <dijitol@proton.me>2025-12-01 14:24:35 +0100
commitc725cde0c8badeea5a2b720778a0d68c5054c9c9 (patch)
tree80fbfa9bbddaa049c88edaa7832b6a540748badb /2025/ocaml/lib/application/day_1.ml
parent04dfeb70d2663b6e46fc29bc72a0fde2b65ed1e6 (diff)
feat(2025d1p1): implement application logic and apply to example
Diffstat (limited to '2025/ocaml/lib/application/day_1.ml')
-rw-r--r--2025/ocaml/lib/application/day_1.ml50
1 files changed, 49 insertions, 1 deletions
diff --git a/2025/ocaml/lib/application/day_1.ml b/2025/ocaml/lib/application/day_1.ml
index 7ddac8b..bc0d5cc 100644
--- a/2025/ocaml/lib/application/day_1.ml
+++ b/2025/ocaml/lib/application/day_1.ml
@@ -1 +1,49 @@
-let run () = failwith "day 1 not implemented"
+open Domain.Day_1
+
+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