diff options
| -rw-r--r-- | 2025/ocaml/lib/application/day_1.ml | 50 | ||||
| -rw-r--r-- | 2025/ocaml/lib/application/day_1.mli | 4 | ||||
| -rw-r--r-- | 2025/ocaml/lib/presentation/cli.ml | 15 |
3 files changed, 67 insertions, 2 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 diff --git a/2025/ocaml/lib/application/day_1.mli b/2025/ocaml/lib/application/day_1.mli new file mode 100644 index 0000000..73631f1 --- /dev/null +++ b/2025/ocaml/lib/application/day_1.mli @@ -0,0 +1,4 @@ +val solve : string -> unit -> int +(** [solve input ()] is the solution for the first day of advent of code 2025 for [input]. + The solution for an empty input is [Domain.Day_1.Dial.(to_int start)]. + Requires: [input] to be a multiline string using `\n` as it's line separator. *) diff --git a/2025/ocaml/lib/presentation/cli.ml b/2025/ocaml/lib/presentation/cli.ml index 08b1552..6344d07 100644 --- a/2025/ocaml/lib/presentation/cli.ml +++ b/2025/ocaml/lib/presentation/cli.ml @@ -1,6 +1,19 @@ +let day_1_example = {|L68 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82|} + let run_day = function | 1 -> - Application.Day_1.run () + let answer = Application.Day_1.solve day_1_example () in + Logs.app (fun m -> m "%d" answer) ; + 0 | _ -> failwith "day not implemented" |
