diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index 63f273b1..37aab475 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -11,6 +11,7 @@ "fizzbuzz.ml": 57, "list_ops.ml": 30, "lambda_calc.ml": 7, + "levenshtein.ml": 11, "memo_fib.ml": 75025, "module_use.ml": 3, "mutable_record.ml": 10, diff --git a/lib/ocaml/baseline/levenshtein.ml b/lib/ocaml/baseline/levenshtein.ml new file mode 100644 index 00000000..1ccf55a0 --- /dev/null +++ b/lib/ocaml/baseline/levenshtein.ml @@ -0,0 +1,18 @@ +let rec lev s1 s2 i j = + if i = 0 then j + else if j = 0 then i + else if s1.[i - 1] = s2.[j - 1] then + lev s1 s2 (i - 1) (j - 1) + else + 1 + min (lev s1 s2 (i - 1) j) + (min (lev s1 s2 i (j - 1)) (lev s1 s2 (i - 1) (j - 1))) + +let dist s1 s2 = lev s1 s2 (String.length s1) (String.length s2) + +;; + +dist "abc" "abx" ++ dist "ab" "ba" ++ dist "abc" "axyc" ++ dist "" "abcd" ++ dist "ab" "" diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index a0e456a9..42479586 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 — levenshtein.ml baseline (recursive edit + distance, no memo). Sums distances for five short pairs: + ("abc","abx")=1 + ("ab","ba")=2 + ("abc","axyc")=2 + + ("","abcd")=4 + ("ab","")=2 = 11. Exercises curried four-arg + recursion + s.[i] equality test + min nested twice + mixed empty + string base cases. - 2026-05-09 Phase 5.1 — caesar.ml baseline (ROT13 with String.init + s.[i] + Char.code/chr). Side-quests: (1) top-level `let r = expr in body` is now treated as an expression