Files
rose-ash/lib/ocaml/baseline/next_greater.ml
giles ca34cede88
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
ocaml: phase 5.1 next_greater.ml baseline (monotonic stack, sum 153)
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.
2026-05-10 23:58:50 +00:00

24 lines
545 B
OCaml

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