From 62712accdd93dc82601e049b6fa2a35cc67c9047 Mon Sep 17 00:00:00 2001 From: giles Date: Sun, 10 May 2026 22:47:22 +0000 Subject: [PATCH] ocaml: phase 5.1 polygon_area.ml baseline (pentagon 2x area = 32) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Shoelace formula on a pentagon with integer vertices: pts = [(0,0); (4,0); (4,3); (2,5); (0,3)] 2 * area = | Σ (x_i * y_{i+1} - x_{i+1} * y_i) | = | 0*0 - 4*0 + 4*3 - 4*0 + 4*5 - 2*3 + 2*3 - 0*5 + 0*0 - 0*3 | = 32 Returns the doubled form (32) to stay integral. Tests: - let (x1, y1) = arr.(i) in -- tuple destructure from array - arr.((i + 1) mod n) -- modular wrap-around index - if a < 0 then - a else a -- prefix - negation 162 baseline programs total. --- lib/ocaml/baseline/expected.json | 1 + lib/ocaml/baseline/polygon_area.ml | 17 +++++++++++++++++ plans/ocaml-on-sx.md | 9 +++++++++ 3 files changed, 27 insertions(+) create mode 100644 lib/ocaml/baseline/polygon_area.ml diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index d3f2cbbf..4dc27692 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -122,6 +122,7 @@ "prefix_sum.ml": 66, "pretty_table.ml": 64, "poly_stack.ml": 5, + "polygon_area.ml": 32, "pow_mod.ml": 738639, "prime_factors.ml": 17, "pythagorean.ml": 16, diff --git a/lib/ocaml/baseline/polygon_area.ml b/lib/ocaml/baseline/polygon_area.ml new file mode 100644 index 00000000..a22d13e2 --- /dev/null +++ b/lib/ocaml/baseline/polygon_area.ml @@ -0,0 +1,17 @@ +let pts = [(0, 0); (4, 0); (4, 3); (2, 5); (0, 3)] + +let polygon_2area pts = + let arr = Array.of_list pts in + let n = Array.length arr in + let acc = ref 0 in + for i = 0 to n - 1 do + let (x1, y1) = arr.(i) in + let (x2, y2) = arr.((i + 1) mod n) in + acc := !acc + x1 * y2 - x2 * y1 + done; + let a = !acc in + if a < 0 then - a else a + +;; + +polygon_2area pts diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index e8ec7f72..b607b3c5 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,15 @@ _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-10 Phase 5.1 — polygon_area.ml baseline (shoelace formula + on pentagon, returns 2× area = 32). Vertices (0,0), (4,0), (4,3), + (2,5), (0,3); shoelace sum |Σ(x_i·y_{i+1} − x_{i+1}·y_i)| = 32 so + the area is 16, and we return the doubled form to stay integral. + Tests `let (x1, y1) = arr.(i) in` tuple destructuring from array + access (previously suspected broken in bfs_grid but works here — + the iter-242 bug was actually `&&` short-circuit, not destructure), + modular wrap-around `arr.((i+1) mod n)`, prefix-`-` negation. + 162 baseline programs total. - 2026-05-10 Phase 5.1 — min_cost_path.ml baseline (min-cost path through 4×4 cost grid, top-left to bottom-right with moves right/down only, optimal = 12). Standard 2D DP: dp[i][j] = min