From 533be5b36befa35c30a4ab1434eae3c6add98d64 Mon Sep 17 00:00:00 2001 From: giles Date: Sat, 9 May 2026 21:59:23 +0000 Subject: [PATCH] ocaml: phase 5.1 euler4_small.ml baseline (largest 2-digit palindrome product = 9009) Scaled-down Project Euler #4. Real version uses 3-digit numbers yielding 906609 = 913 * 993; that's an 810k-iteration nested loop that times out under our contended-host spec-level evaluator. The 2-digit version (10..99) is fast enough and tests the same algorithm: 9009 = 91 * 99 (the only 2-digit-product palindrome > 9000) Implementation: is_pal n index-walk comparing s.[i] to s.[len-1-i] euler4 lo hi nested for with running max + early-skip via 'p > !m && is_pal p' short-circuit 111 baseline programs total. --- lib/ocaml/baseline/euler4_small.ml | 21 +++++++++++++++++++++ lib/ocaml/baseline/expected.json | 1 + plans/ocaml-on-sx.md | 5 +++++ 3 files changed, 27 insertions(+) create mode 100644 lib/ocaml/baseline/euler4_small.ml diff --git a/lib/ocaml/baseline/euler4_small.ml b/lib/ocaml/baseline/euler4_small.ml new file mode 100644 index 00000000..13a81b9a --- /dev/null +++ b/lib/ocaml/baseline/euler4_small.ml @@ -0,0 +1,21 @@ +let is_pal n = + let s = string_of_int n in + let len = String.length s in + let p = ref true in + for i = 0 to len / 2 - 1 do + if s.[i] <> s.[len - 1 - i] then p := false + done; + !p + +let euler4 lo hi = + let m = ref 0 in + for a = lo to hi do + for b = a to hi do + let p = a * b in + if p > !m && is_pal p then m := p + done + done; + !m +;; + +euler4 10 99 diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index 0bb688fd..e9824aa4 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -28,6 +28,7 @@ "euler1.ml": 233168, "euler10.ml": 1060, "euler2.ml": 4613732, + "euler4_small.ml": 9009, "euler5.ml": 232792560, "euler6.ml": 25164150, "euler9.ml": 31875000, diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index 2dddfaff..5c1d1f87 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,11 @@ _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 — euler4_small.ml baseline (largest 2-digit + palindrome product = 9009 = 91 * 99). Scaled-down Project Euler + #4 (real version uses 3-digit numbers, 906609; that's 810k inner + iterations and would time out under contention). Tests palindrome + predicate via index-walk + nested for. 111 baseline programs total. - 2026-05-09 Phase 5.1 — euler10.ml baseline (sum of primes ≤ 100 = 1060, scaled-down Project Euler #10). Sieve of Eratosthenes followed by a sum loop. Used 100 instead of 2 million to fit our