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,
|
"module_use.ml": 3,
|
||||||
"monotonic.ml": 4,
|
"monotonic.ml": 4,
|
||||||
"newton_sqrt.ml": 1414,
|
"newton_sqrt.ml": 1414,
|
||||||
|
"next_greater.ml": 153,
|
||||||
"next_permutation.ml": 119,
|
"next_permutation.ml": 119,
|
||||||
"number_words.ml": 106,
|
"number_words.ml": 106,
|
||||||
"mutable_record.ml": 10,
|
"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 *
|
binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree *
|
||||||
'a tree`) with insert + in-order traversal. Tests parametric ADT,
|
'a tree`) with insert + in-order traversal. Tests parametric ADT,
|
||||||
recursive match, List.append, List.fold_left.
|
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
|
- 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
|
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;
|
prefix_sum n = 64; after +100 at index 1, prefix_sum n = 164;
|
||||||
|
|||||||
Reference in New Issue
Block a user