ocaml: phase 5.1 balance.ml baseline (paren/bracket/brace balance via Stack)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 51s

is_balanced walks a string; on each char:
  '(', '[', '{'  -> Stack.push c
  ')', ']', '}'  -> require stack non-empty AND top = expected opener,
                     else mark ok = false
  others         -> skip

At end: !ok && Stack.is_empty stack.

Five test cases:
  '({[abc]d}e)'  -> true
  '(a]'           -> false  (no matching opener)
  '{[}]'          -> false  (mismatched closer)
  '(())'          -> true
  ''              -> true

Sum of (if balanced then 1 else 0) -> 3.

Exercises:
  Stack.create / push / pop / is_empty
  s.[!i] string indexing
  while loop + bool ref short-circuit
  multi-arm if/else if/else if dispatch

31 baseline programs total.
This commit is contained in:
2026-05-09 06:59:22 +00:00
parent 0c3b5d21fa
commit 97a8c06690
3 changed files with 33 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
let is_balanced s =
let stack = Stack.create () in
let n = String.length s in
let ok = ref true in
let i = ref 0 in
while !i < n && !ok do
let c = s.[!i] in
(if c = '(' || c = '[' || c = '{' then Stack.push c stack
else if c = ')' then
(if Stack.is_empty stack || Stack.pop stack <> '(' then ok := false)
else if c = ']' then
(if Stack.is_empty stack || Stack.pop stack <> '[' then ok := false)
else if c = '}' then
(if Stack.is_empty stack || Stack.pop stack <> '{' then ok := false));
i := !i + 1
done;
!ok && Stack.is_empty stack
;;
(if is_balanced "({[abc]d}e)" then 1 else 0) +
(if is_balanced "(a]" then 1 else 0) +
(if is_balanced "{[}]" then 1 else 0) +
(if is_balanced "(())" then 1 else 0) +
(if is_balanced "" then 1 else 0)

View File

@@ -1,6 +1,7 @@
{
"anagrams.ml": 3,
"bag.ml": 3,
"balance.ml": 3,
"bfs.ml": 6,
"btree.ml": 39,
"brainfuck.ml": 75,

View File

@@ -407,6 +407,13 @@ _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-09 Phase 5.1 — balance.ml baseline (paren/bracket/brace
balance using Stack). is_balanced walks a string; on opener push,
on closer check stack non-empty + top matches expected opener (else
fail). Returns ok && is_empty stack at end. 5 test cases:
"({[abc]d}e)" ✓, "(a]" ✗, "{[}]" ✗ (mismatched closers), "(())" ✓,
"" ✓ → 3 balanced. Exercises Stack.create / push / pop / is_empty /
s.[!i] / while + bool ref short-circuit. 31 baseline programs total.
- 2026-05-09 Phase 5.1 — safe_div.ml baseline + Result.equal /
compare / iter_error (+3 tests, 592 total). safe_div divides only
if divisor non-zero, returns `Error "..."` otherwise. sum_safe folds