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
|
||||
Reference in New Issue
Block a user