diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index bda63b8c..8561668a 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -80,6 +80,7 @@ "huffman.ml": 224, "int_sqrt.ml": 1027, "is_prime.ml": 25, + "island_count.ml": 5, "fizz_classifier.ml": 540, "fizzbuzz.ml": 57, "flatten_tree.ml": 28, diff --git a/lib/ocaml/baseline/island_count.ml b/lib/ocaml/baseline/island_count.ml new file mode 100644 index 00000000..f2ee3aa9 --- /dev/null +++ b/lib/ocaml/baseline/island_count.ml @@ -0,0 +1,37 @@ +let h = 6 +let w = 7 +let grid = [| + [| 1; 1; 0; 0; 0; 1; 1 |]; + [| 1; 0; 0; 0; 1; 1; 0 |]; + [| 0; 0; 1; 1; 0; 0; 0 |]; + [| 0; 1; 1; 1; 0; 1; 1 |]; + [| 1; 0; 0; 0; 0; 1; 0 |]; + [| 1; 1; 0; 1; 1; 1; 0 |] +|] + +let rec fill visited r c = + if r < 0 || r >= h || c < 0 || c >= w then () + else if visited.(r).(c) || grid.(r).(c) = 0 then () + else begin + visited.(r).(c) <- true; + fill visited (r - 1) c; + fill visited (r + 1) c; + fill visited r (c - 1); + fill visited r (c + 1) + end + +let count_islands () = + let visited = Array.init h (fun _ -> Array.make w false) in + let count = ref 0 in + for r = 0 to h - 1 do + for c = 0 to w - 1 do + if grid.(r).(c) = 1 && not visited.(r).(c) then begin + count := !count + 1; + fill visited r c + end + done + done; + !count +;; + +count_islands () diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index 1fe9fa28..f21989ca 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,18 @@ _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-11 Phase 5.1 — island_count.ml baseline (count 4-connected + components of 1-cells in a 6×7 grid = 5). DFS flood from every + unvisited 1-cell. Counted islands: + {(0,0),(0,1),(1,0)} + {(0,5),(0,6),(1,4),(1,5)} + {(2,2),(2,3),(3,1),(3,2),(3,3)} + {(3,5),(3,6),(4,5),(5,3),(5,4),(5,5)} + {(4,0),(5,0),(5,1)} + Complementary to flood_fill.ml which measures largest component; + this counts them. Tests recursive returning `()` (unit) at + early-exit branches, ordered double-for entry pass that triggers + one fill per island root. 180 baseline programs total. - 2026-05-11 Phase 5.1 — dp_word_break.ml baseline (word-break DP over 5 strings with 9-word dictionary; 4 strings segmentable). dp[i] = ∃ word w of length wl ≤ i with prefix s[i−wl..i]=w and