diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index 4262f1f0..37132b62 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -51,6 +51,7 @@ "json_pretty.ml": 24, "kadane.ml": 6, "lambda_calc.ml": 7, + "majority_vote.ml": 4, "levenshtein.ml": 11, "memo_fib.ml": 75025, "mortgage.ml": 1073, diff --git a/lib/ocaml/baseline/majority_vote.ml b/lib/ocaml/baseline/majority_vote.ml new file mode 100644 index 00000000..aa0f7231 --- /dev/null +++ b/lib/ocaml/baseline/majority_vote.ml @@ -0,0 +1,15 @@ +let majority xs = + let cand = ref 0 in + let count = ref 0 in + List.iter (fun x -> + if !count = 0 then begin + cand := x; + count := 1 + end else if x = !cand then count := !count + 1 + else count := !count - 1 + ) xs; + !cand + +;; + +majority [3; 3; 4; 2; 4; 4; 2; 4; 4] diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index 01e2f3a0..9bd0f9ae 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,12 @@ _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 — majority_vote.ml baseline (Boyer-Moore + majority, [3;3;4;2;4;4;2;4;4] → 4). O(n) time / O(1) space: + candidate-and-count refs; on match increment, on mismatch + decrement and replace candidate when count reaches zero. + Demonstrates the classical streaming algorithm. 97 baseline + programs total. - 2026-05-09 Phase 5.1 — adler32.ml baseline (Adler-32 checksum of "Wikipedia" = 300286872 = 0x11E60398). Two running sums modulo 65521; final checksum is `b * 65536 + a`. Used by zlib for stream