From ea7120751dd6ac742b51d1ebc634f009e28687c3 Mon Sep 17 00:00:00 2001 From: giles Date: Sat, 9 May 2026 23:03:06 +0000 Subject: [PATCH] ocaml: phase 5.1 euler28.ml baseline (sum of diagonals in 7x7 spiral = 261) For each layer 1..(n-1)/2, the four corners of an Ulam spiral are spaced 2*layer apart. Step k four times per layer, accumulate: let euler28 n = let s = ref 1 in let k = ref 1 in for layer = 1 to (n - 1) / 2 do let step = 2 * layer in for _ = 1 to 4 do k := !k + step; s := !s + !k done done; !s euler28 7 = 1 + (3+5+7+9) + (13+17+21+25) + (31+37+43+49) = 261 Real PE28 uses 1001x1001 (answer 669171001); 7x7 is fast. 117 baseline programs total. --- lib/ocaml/baseline/euler28.ml | 15 +++++++++++++++ lib/ocaml/baseline/expected.json | 1 + plans/ocaml-on-sx.md | 6 ++++++ 3 files changed, 22 insertions(+) create mode 100644 lib/ocaml/baseline/euler28.ml diff --git a/lib/ocaml/baseline/euler28.ml b/lib/ocaml/baseline/euler28.ml new file mode 100644 index 00000000..42ebf770 --- /dev/null +++ b/lib/ocaml/baseline/euler28.ml @@ -0,0 +1,15 @@ +let euler28 n = + let s = ref 1 in + let k = ref 1 in + for layer = 1 to (n - 1) / 2 do + let step = 2 * layer in + for _ = 1 to 4 do + k := !k + step; + s := !s + !k + done + done; + !s + +;; + +euler28 7 diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index 587883cb..350f927a 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -31,6 +31,7 @@ "euler14.ml": 97, "euler2.ml": 4613732, "euler25.ml": 55, + "euler28.ml": 261, "euler3.ml": 29, "euler4_small.ml": 9009, "euler5.ml": 232792560, diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index a0cba117..febf789e 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 — euler28.ml baseline (sum of diagonals in + 7x7 number spiral = 261). For each layer (1..(n-1)/2) the four + corners are spaced 2*layer apart, so we step `k` four times per + layer and accumulate into s. Real PE28 uses 1001x1001 (answer + 669171001); 7x7 is fast enough to land in seconds. 117 baseline + programs total. - 2026-05-09 Phase 5.1 — euler14.ml baseline (longest Collatz chain starting under N=100 → 97). collatz_len walks n through the iteration n/2 if even, 3n+1 if odd, counting steps. Outer loop