ocaml: phase 5.1 next_greater.ml baseline (monotonic stack, sum 153)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
Right-to-left monotonic stack for next-greater-element:
for i = n - 1 downto 0 do
while (match !stack with [] -> false | h :: _ -> h <= arr.(i)) do
stack := List.tl !stack
done;
(match !stack with
| [] -> res.(i) <- -1
| h :: _ -> res.(i) <- h);
stack := arr.(i) :: !stack
done
For [4; 5; 2; 25; 7; 8; 1; 30; 12]:
results: [5; 25; 25; 30; 8; 30; 30; -1; -1]
sum of non-negative = 5+25+25+30+8+30+30 = 153
Tests stack as ref list with match-driven peek, match-as-bool in
while-guard, inline parenthesized match driving <-.
169 baseline programs total.
This commit is contained in:
@@ -110,6 +110,7 @@
|
||||
"module_use.ml": 3,
|
||||
"monotonic.ml": 4,
|
||||
"newton_sqrt.ml": 1414,
|
||||
"next_greater.ml": 153,
|
||||
"next_permutation.ml": 119,
|
||||
"number_words.ml": 106,
|
||||
"mutable_record.ml": 10,
|
||||
|
||||
23
lib/ocaml/baseline/next_greater.ml
Normal file
23
lib/ocaml/baseline/next_greater.ml
Normal file
@@ -0,0 +1,23 @@
|
||||
let next_greater arr =
|
||||
let n = Array.length arr in
|
||||
let res = Array.make n (-1) in
|
||||
let stack = ref [] in
|
||||
for i = n - 1 downto 0 do
|
||||
while (match !stack with [] -> false | h :: _ -> h <= arr.(i)) do
|
||||
stack := List.tl !stack
|
||||
done;
|
||||
(match !stack with
|
||||
| [] -> res.(i) <- -1
|
||||
| h :: _ -> res.(i) <- h);
|
||||
stack := arr.(i) :: !stack
|
||||
done;
|
||||
res
|
||||
|
||||
;;
|
||||
|
||||
let r = next_greater [| 4; 5; 2; 25; 7; 8; 1; 30; 12 |] in
|
||||
let sum = ref 0 in
|
||||
for i = 0 to Array.length r - 1 do
|
||||
if r.(i) >= 0 then sum := !sum + r.(i)
|
||||
done;
|
||||
!sum
|
||||
@@ -407,6 +407,15 @@ _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-10 Phase 5.1 — next_greater.ml baseline (monotonic stack
|
||||
for next-greater-element over [4;5;2;25;7;8;1;30;12], sum of
|
||||
successors = 153). Right-to-left scan with a stack that pops
|
||||
elements ≤ current. Result: [5,25,25,30,8,30,30,-1,-1]; sum of
|
||||
non-negative entries = 5+25+25+30+8+30+30 = 153. Tests stack
|
||||
encoded as `ref list` with match-driven peek, `match … with []
|
||||
-> false | h :: _ -> …` boolean coercion in `while` guard,
|
||||
inline match-statement on rhs of `<-` (paren-wrapped for parse).
|
||||
169 baseline programs total.
|
||||
- 2026-05-10 Phase 5.1 — fenwick_tree.ml baseline (Binary Indexed
|
||||
Tree over [1;3;5;7;9;11;13;15], total + after = 228). Initial
|
||||
prefix_sum n = 64; after +100 at index 1, prefix_sum n = 164;
|
||||
|
||||
Reference in New Issue
Block a user