diff --git a/lib/ocaml/baseline/euler14.ml b/lib/ocaml/baseline/euler14.ml new file mode 100644 index 00000000..7e7e908e --- /dev/null +++ b/lib/ocaml/baseline/euler14.ml @@ -0,0 +1,25 @@ +let collatz_len n = + let m = ref n in + let c = ref 0 in + while !m > 1 do + if !m mod 2 = 0 then m := !m / 2 + else m := 3 * !m + 1; + c := !c + 1 + done; + !c + +let euler14 limit = + let best = ref 0 in + let best_n = ref 0 in + for n = 2 to limit do + let l = collatz_len n in + if l > !best then begin + best := l; + best_n := n + end + done; + !best_n + +;; + +euler14 100 diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index c228f1b7..587883cb 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -28,6 +28,7 @@ "euler1.ml": 233168, "euler16.ml": 26, "euler10.ml": 1060, + "euler14.ml": 97, "euler2.ml": 4613732, "euler25.ml": 55, "euler3.ml": 29, diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index 547cc29c..a0cba117 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,13 @@ _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 — 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 + scans 2..N tracking best length and arg-best. n=97 generates the + 118-step chain. Real PE14 uses N=1,000,000 (answer 837799); N=100 + exercises the same algorithm in <2 minutes. 116 baseline programs + total. - 2026-05-09 Phase 5.1 — euler16.ml baseline (digit sum of 2^15 = 26). Computes 2^n via for-loop accumulation, then walks the digits via mod 10 / div 10 to sum them. Real PE16 asks for 2^1000 which