diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index 908d4325..7c10507e 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -125,6 +125,7 @@ "merge_sort.ml": 44, "merge_two.ml": 441, "min_cost_path.ml": 12, + "min_subarr_target.ml": 2, "module_use.ml": 3, "monotonic.ml": 4, "newton_sqrt.ml": 1414, diff --git a/lib/ocaml/baseline/min_subarr_target.ml b/lib/ocaml/baseline/min_subarr_target.ml new file mode 100644 index 00000000..14469291 --- /dev/null +++ b/lib/ocaml/baseline/min_subarr_target.ml @@ -0,0 +1,19 @@ +let min_subarr_sum_at_least arr target = + let n = Array.length arr in + let best = ref (n + 1) in + let sum = ref 0 in + let l = ref 0 in + for r = 0 to n - 1 do + sum := !sum + arr.(r); + while !sum >= target do + let len = r - !l + 1 in + if len < !best then best := len; + sum := !sum - arr.(!l); + l := !l + 1 + done + done; + if !best > n then 0 else !best + +;; + +min_subarr_sum_at_least [| 2; 3; 1; 2; 4; 3 |] 7 diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index 1adef748..d1603223 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,14 @@ _Newest first._ binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree * 'a tree`) with insert + in-order traversal. Tests parametric ADT, recursive match, List.append, List.fold_left. +- 2026-05-11 Phase 5.1 — min_subarr_target.ml baseline (sliding- + window min subarray with sum ≥ target on [2;3;1;2;4;3] target=7 + = 2). Two-pointer: expand right, then shrink left while sum + stays ≥ target, recording the min length seen. Optimal window + is [4, 3] (positions 4-5) with sum 7, length 2. Tests `for` + + inner `while` shrinking loop, ref-tracked sum updated on both + expansion and contraction, sentinel `n + 1` for "not found". + 194 baseline programs total. - 2026-05-11 Phase 5.1 — min_meeting_rooms.ml baseline (sweep-line for min concurrent meetings on 8 intervals = 4). Separate starts and ends arrays sorted independently, then a two-pointer sweep: