ocaml: phase 5.1 euler40_small.ml baseline (Champernowne digit product = 15)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 37s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 37s
Build the Champernowne string '12345678910111213...' until at
least 1500 chars; product of digits at positions 1, 10, 100, 1000
is 1 * 1 * 5 * 3 = 15.
Initial implementation timed out: 'String.length (Buffer.contents
buf) < 1500' rebuilt the full string each iteration (O(n^2) in our
spec-level evaluator). Fixed by tracking length separately from
the Buffer:
let len = ref 0 in
while !len < 1500 do
let s = string_of_int !i in
Buffer.add_string buf s;
len := !len + String.length s;
i := !i + 1
done
Real PE40 uses positions up to 10^6 (answer 210); 1000 keeps under
budget while exercising the same string-build + char-pick pattern.
122 baseline programs total.
This commit is contained in:
22
lib/ocaml/baseline/euler40_small.ml
Normal file
22
lib/ocaml/baseline/euler40_small.ml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
let euler40 () =
|
||||||
|
let buf = Buffer.create 4096 in
|
||||||
|
let len = ref 0 in
|
||||||
|
let i = ref 1 in
|
||||||
|
while !len < 1500 do
|
||||||
|
let s = string_of_int !i in
|
||||||
|
Buffer.add_string buf s;
|
||||||
|
len := !len + String.length s;
|
||||||
|
i := !i + 1
|
||||||
|
done;
|
||||||
|
let s = Buffer.contents buf in
|
||||||
|
let prod = ref 1 in
|
||||||
|
let positions = [1; 10; 100; 1000] in
|
||||||
|
List.iter (fun p ->
|
||||||
|
let c = s.[p - 1] in
|
||||||
|
prod := !prod * (Char.code c - Char.code '0')
|
||||||
|
) positions;
|
||||||
|
!prod
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
euler40 ()
|
||||||
@@ -36,6 +36,7 @@
|
|||||||
"euler29_small.ml": 15,
|
"euler29_small.ml": 15,
|
||||||
"euler30_cube.ml": 1301,
|
"euler30_cube.ml": 1301,
|
||||||
"euler34_small.ml": 145,
|
"euler34_small.ml": 145,
|
||||||
|
"euler40_small.ml": 15,
|
||||||
"euler3.ml": 29,
|
"euler3.ml": 29,
|
||||||
"euler4_small.ml": 9009,
|
"euler4_small.ml": 9009,
|
||||||
"euler5.ml": 232792560,
|
"euler5.ml": 232792560,
|
||||||
|
|||||||
@@ -407,6 +407,12 @@ _Newest first._
|
|||||||
binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree *
|
binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree *
|
||||||
'a tree`) with insert + in-order traversal. Tests parametric ADT,
|
'a tree`) with insert + in-order traversal. Tests parametric ADT,
|
||||||
recursive match, List.append, List.fold_left.
|
recursive match, List.append, List.fold_left.
|
||||||
|
- 2026-05-10 Phase 5.1 — euler40_small.ml baseline (Champernowne
|
||||||
|
digit-product at 1, 10, 100, 1000 = 1*1*5*3 = 15). Builds the
|
||||||
|
Champernowne string until ≥1500 chars; tracks length separately
|
||||||
|
from the Buffer to avoid O(n²) `String.length (Buffer.contents
|
||||||
|
buf)` reallocation. Real PE40 uses positions up to 10^6 (answer
|
||||||
|
210). 122 baseline programs total.
|
||||||
- 2026-05-09 Phase 5.1 — euler34_small.ml baseline (numbers equal
|
- 2026-05-09 Phase 5.1 — euler34_small.ml baseline (numbers equal
|
||||||
to sum of factorials of digits, ≤2000 = 145). 145 = 1!+4!+5! =
|
to sum of factorials of digits, ≤2000 = 145). 145 = 1!+4!+5! =
|
||||||
1+24+120. The other "factorion" 40585 is the only number above
|
1+24+120. The other "factorion" 40585 is the only number above
|
||||||
|
|||||||
Reference in New Issue
Block a user