ocaml: phase 5.1 anagram_groups.ml baseline (group by canonical anagram, 3 groups)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 22s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 22s
canonical builds a sorted-by-frequency string representation:
let canonical s =
let chars = Array.make 26 0 in
for i = 0 to String.length s - 1 do
let k = Char.code s.[i] - Char.code 'a' in
if k >= 0 && k < 26 then chars.(k) <- chars.(k) + 1
done;
expand into a-z order via a Buffer
For 'eat', 'tea', 'ate' -> all canonicalise to 'aet'. For 'tan',
'nat' -> 'ant'. For 'bat' -> 'abt'.
group_anagrams folds the input, accumulating per-key string lists;
final answer is Hashtbl.length (number of distinct groups):
['eat'; 'tea'; 'tan'; 'ate'; 'nat'; 'bat'] -> 3 groups
99 baseline programs total.
This commit is contained in:
29
lib/ocaml/baseline/anagram_groups.ml
Normal file
29
lib/ocaml/baseline/anagram_groups.ml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
let canonical s =
|
||||||
|
let chars = Array.make 26 0 in
|
||||||
|
for i = 0 to String.length s - 1 do
|
||||||
|
let k = Char.code s.[i] - Char.code 'a' in
|
||||||
|
if k >= 0 && k < 26 then chars.(k) <- chars.(k) + 1
|
||||||
|
done;
|
||||||
|
let buf = Buffer.create 26 in
|
||||||
|
for i = 0 to 25 do
|
||||||
|
for _ = 1 to chars.(i) do
|
||||||
|
Buffer.add_string buf (String.make 1 (Char.chr (i + Char.code 'a')))
|
||||||
|
done
|
||||||
|
done;
|
||||||
|
Buffer.contents buf
|
||||||
|
|
||||||
|
let group_anagrams xs =
|
||||||
|
let h = Hashtbl.create 8 in
|
||||||
|
List.iter (fun s ->
|
||||||
|
let k = canonical s in
|
||||||
|
let cur = match Hashtbl.find_opt h k with
|
||||||
|
| Some xs -> xs
|
||||||
|
| None -> []
|
||||||
|
in
|
||||||
|
Hashtbl.replace h k (s :: cur)
|
||||||
|
) xs;
|
||||||
|
Hashtbl.length h
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
group_anagrams ["eat"; "tea"; "tan"; "ate"; "nat"; "bat"]
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
"ackermann.ml": 125,
|
"ackermann.ml": 125,
|
||||||
"adler32.ml": 300286872,
|
"adler32.ml": 300286872,
|
||||||
"anagram_check.ml": 2,
|
"anagram_check.ml": 2,
|
||||||
|
"anagram_groups.ml": 3,
|
||||||
"anagrams.ml": 3,
|
"anagrams.ml": 3,
|
||||||
"atm.ml": 120,
|
"atm.ml": 120,
|
||||||
"bag.ml": 3,
|
"bag.ml": 3,
|
||||||
|
|||||||
@@ -407,6 +407,14 @@ _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-09 Phase 5.1 — anagram_groups.ml baseline (group strings
|
||||||
|
by canonical anagram form, ["eat";"tea";"tan";"ate";"nat";"bat"]
|
||||||
|
has 3 groups). canonical builds a sorted-by-frequency string
|
||||||
|
representation: count letters, then expand into a-z order. Used
|
||||||
|
as Hashtbl key. group_anagrams folds the input list, accumulating
|
||||||
|
per-key string lists; final answer is Hashtbl.length (number of
|
||||||
|
distinct groups). Tests count-then-expand canonical pattern +
|
||||||
|
Hashtbl as multimap. 99 baseline programs total.
|
||||||
- 2026-05-09 Phase 5.1 — monotonic.ml baseline (monotonicity check,
|
- 2026-05-09 Phase 5.1 — monotonic.ml baseline (monotonicity check,
|
||||||
4/5 inputs monotonic). Tracks two bool refs (inc, dec). Each pair
|
4/5 inputs monotonic). Tracks two bool refs (inc, dec). Each pair
|
||||||
of consecutive elements: if `h < prev` clear `inc`, if `h > prev`
|
of consecutive elements: if `h < prev` clear `inc`, if `h > prev`
|
||||||
|
|||||||
Reference in New Issue
Block a user